From f140ba1caa5fe7f2b4dd73b7fc51e10f5f71fa72 Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Mon, 12 Jan 2026 16:07:45 +0900 Subject: [PATCH 1/7] =?UTF-8?q?build:=20semver=20^=20=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(minor,=20patch=20=EB=A7=8C=20=EB=B0=98=EC=98=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/patchlogr-cli/package.json | 5 +++-- packages/patchlogr-core/package.json | 3 ++- packages/patchlogr-oas/package.json | 2 +- yarn.lock | 16 +++++++++------- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/patchlogr-cli/package.json b/packages/patchlogr-cli/package.json index 2d2bbaf..63ca214 100644 --- a/packages/patchlogr-cli/package.json +++ b/packages/patchlogr-cli/package.json @@ -19,13 +19,14 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@patchlogr/core": "workspace:*", - "@patchlogr/oas": "workspace:*", + "@patchlogr/core": "workspace:^", + "@patchlogr/oas": "workspace:^", "commander": "^14.0.2" }, "devDependencies": { "@types/node": "24", "esbuild": "^0.27.2", + "openapi-types": "^12.1.3", "typescript": "^5.9.3", "vitest": "^4.0.16" } diff --git a/packages/patchlogr-core/package.json b/packages/patchlogr-core/package.json index 32d8182..f3278a9 100644 --- a/packages/patchlogr-core/package.json +++ b/packages/patchlogr-core/package.json @@ -27,7 +27,8 @@ }, "dependencies": { "@apidevtools/swagger-parser": "^12.1.0", - "@patchlogr/oas": "workspace:*" + "@patchlogr/oas": "workspace:^", + "@patchlogr/types": "workspace:^" }, "devDependencies": { "esbuild": "^0.27.2", diff --git a/packages/patchlogr-oas/package.json b/packages/patchlogr-oas/package.json index fadbdcd..44092ba 100644 --- a/packages/patchlogr-oas/package.json +++ b/packages/patchlogr-oas/package.json @@ -28,6 +28,6 @@ }, "dependencies": { "@apidevtools/swagger-parser": "^12.1.0", - "@patchlogr/types": "workspace:*" + "@patchlogr/types": "workspace:^" } } diff --git a/yarn.lock b/yarn.lock index 1770674..3f3c5a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -404,11 +404,12 @@ __metadata: version: 0.0.0-use.local resolution: "@patchlogr/cli@workspace:packages/patchlogr-cli" dependencies: - "@patchlogr/core": "workspace:*" - "@patchlogr/oas": "workspace:*" + "@patchlogr/core": "workspace:^" + "@patchlogr/oas": "workspace:^" "@types/node": "npm:24" commander: "npm:^14.0.2" esbuild: "npm:^0.27.2" + openapi-types: "npm:^12.1.3" typescript: "npm:^5.9.3" vitest: "npm:^4.0.16" bin: @@ -416,12 +417,13 @@ __metadata: languageName: unknown linkType: soft -"@patchlogr/core@workspace:*, @patchlogr/core@workspace:packages/patchlogr-core": +"@patchlogr/core@workspace:^, @patchlogr/core@workspace:packages/patchlogr-core": version: 0.0.0-use.local resolution: "@patchlogr/core@workspace:packages/patchlogr-core" dependencies: "@apidevtools/swagger-parser": "npm:^12.1.0" - "@patchlogr/oas": "workspace:*" + "@patchlogr/oas": "workspace:^" + "@patchlogr/types": "workspace:^" esbuild: "npm:^0.27.2" openapi-types: "npm:^12.1.3" typescript: "npm:^5.9.3" @@ -429,12 +431,12 @@ __metadata: languageName: unknown linkType: soft -"@patchlogr/oas@workspace:*, @patchlogr/oas@workspace:packages/patchlogr-oas": +"@patchlogr/oas@workspace:^, @patchlogr/oas@workspace:packages/patchlogr-oas": version: 0.0.0-use.local resolution: "@patchlogr/oas@workspace:packages/patchlogr-oas" dependencies: "@apidevtools/swagger-parser": "npm:^12.1.0" - "@patchlogr/types": "workspace:*" + "@patchlogr/types": "workspace:^" "@types/node": "npm:24" esbuild: "npm:^0.27.2" openapi-types: "npm:^12.1.3" @@ -442,7 +444,7 @@ __metadata: languageName: unknown linkType: soft -"@patchlogr/types@workspace:*, @patchlogr/types@workspace:packages/patchlogr-types": +"@patchlogr/types@workspace:^, @patchlogr/types@workspace:packages/patchlogr-types": version: 0.0.0-use.local resolution: "@patchlogr/types@workspace:packages/patchlogr-types" dependencies: From cb66e1bc1ca5f3b8d889dcb2d9bc778459f355be Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Mon, 12 Jan 2026 16:08:04 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feature:=20canonicalize=20cli=20command=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/patchlogr-cli/src/cli.ts | 12 ++++++---- .../src/commands/runCanonicalize.ts | 22 ++++++++++++++++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/patchlogr-cli/src/cli.ts b/packages/patchlogr-cli/src/cli.ts index bbcb1f2..8bc66cf 100644 --- a/packages/patchlogr-cli/src/cli.ts +++ b/packages/patchlogr-cli/src/cli.ts @@ -1,4 +1,5 @@ import { Command } from "commander"; +import { runCanonicalize } from "./commands/runCanonicalize"; export function createCLI() { const program = new Command(); @@ -10,12 +11,14 @@ export function createCLI() { program .command("help") - .description("Display help information about patchlogr commands"); + .description("Display help information about patchlogr commands") + .action(() => { + program.outputHelp(); + }); program .command("canonicalize") .argument("", "Path to the OpenAPI specification file") - .option("--canonicalize", "Canonicalize the OpenAPI specification") .option( "--skipValidation", "Skip validation of the OpenAPI specification", @@ -23,12 +26,13 @@ export function createCLI() { .option( "-o, --output ", "Write result to file instead of stdout (default: stdout)", + "stdout", ) .action(async (apiDocs, options) => { try { - console.log("[patchlogr] Processing:", apiDocs, options); + await runCanonicalize(apiDocs, options); } catch (error) { - console.error("[patchlogr] Error:", (error as Error).message); + console.error(error); process.exitCode = 1; } }); diff --git a/packages/patchlogr-cli/src/commands/runCanonicalize.ts b/packages/patchlogr-cli/src/commands/runCanonicalize.ts index 863fad5..6687287 100644 --- a/packages/patchlogr-cli/src/commands/runCanonicalize.ts +++ b/packages/patchlogr-cli/src/commands/runCanonicalize.ts @@ -1,11 +1,27 @@ import { preprocessOASDocument } from "@patchlogr/oas"; import { type OASStageOptions } from "@patchlogr/oas"; +import type { OpenAPI } from "openapi-types"; +import fs from "fs/promises"; -export type RunCanonicalizeOptions = OASStageOptions; +export type RunCanonicalizeOptions = OASStageOptions & { + output?: "stdout" | string; +}; export async function runCanonicalize( - apiDocs: any, + apiDocs: OpenAPI.Document, options: RunCanonicalizeOptions, ) { - preprocessOASDocument(apiDocs, { ...options }); + const output = await preprocessOASDocument(apiDocs, { + skipValidation: !!options.skipValidation, + }); + + if (options.output === "stdout" || options.output === undefined) { + console.log(JSON.stringify(output, null, 2)); + } else { + try { + await fs.writeFile(options.output, JSON.stringify(output, null, 2)); + } catch (error) { + console.error(`Failed to write to file ${options.output}:`, error); + } + } } From 91746c64b84cdde6bcf73c608fab02a41cb455d3 Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Tue, 13 Jan 2026 17:22:44 +0900 Subject: [PATCH 3/7] =?UTF-8?q?docs:=20=EC=A4=91=EB=B3=B5=EB=90=9C=20scope?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6aae5fb..0ae8cb8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,25 +8,14 @@ - [ ] @patchlogr/core - [ ] @patchlogr/cli +- [ ] @patchlogr/canonicalizer - [ ] @patchlogr/inspector -- [ ] @patchlogr/oas - [ ] @patchlogr/types - [ ] docs, examples - [ ] tests - [ ] ci / cd / infra - [ ] other (아래에 명시) -## 📦 Scope - - -- [ ] @patchlogr/core -- [ ] @patchlogr/cli -- [ ] @patchlogr/inspector -- [ ] docs, examples -- [ ] tests -- [ ] ci / infra -- [ ] other (아래에 명시) - ## 📌 Summary @@ -42,10 +31,11 @@ - ## ⚠️ Impact -- [ ] No Breaking Changes -- [ ] Breaking Change -- [ ] Versioning 영향 있음 (major / minor / patch) -- [ ] 내부 리팩토링만 포함 + +- [ ] No Breaking Changes +- [ ] Breaking Change +- [ ] Versioning 영향 있음 (major / minor / patch) +- [ ] 내부 리팩토링만 포함 ## ✅ Checklist From 6fb5955b526c803c6d7e69c6fad9a45c56085016 Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Tue, 13 Jan 2026 17:29:20 +0900 Subject: [PATCH 4/7] =?UTF-8?q?docs:=20=EC=A4=91=EB=B3=B5=EB=90=9C=20scope?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 0ae8cb8..5671cd4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,7 +8,7 @@ - [ ] @patchlogr/core - [ ] @patchlogr/cli -- [ ] @patchlogr/canonicalizer +- [ ] @patchlogr/oas - [ ] @patchlogr/inspector - [ ] @patchlogr/types - [ ] docs, examples From 8de884cb1f194947408605652a3087560ccc6e61 Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Tue, 13 Jan 2026 17:30:27 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=83=80=EC=9E=85=20=EB=8B=A8=EC=96=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/patchlogr-oas/src/utils/toCanonicalSchema.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts b/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts index 2b554d2..9a11967 100644 --- a/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts +++ b/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts @@ -15,7 +15,8 @@ export function toCanonicalSchema( return schema || {}; } - if (isOpenAPIV3Schema(schema)) - return toCanonicalSchemaV3(schema as OpenAPIV3.SchemaObject); - return toCanonicalSchemaV2(schema as OpenAPIV2.SchemaObject); + if (isOpenAPIV3Schema(schema)) { + return toCanonicalSchemaV3(schema); + } + return toCanonicalSchemaV2(schema); } From eedfcd5ee00b014049d0f6cc1d969da8b3d9d479 Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Tue, 13 Jan 2026 17:33:55 +0900 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=83=80=EC=9E=85=20=EB=8B=A8=EC=96=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/patchlogr-oas/src/utils/toCanonicalSchema.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts b/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts index 9a11967..5ce992a 100644 --- a/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts +++ b/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts @@ -1,5 +1,4 @@ import { type CanonicalSchema } from "@patchlogr/types"; -import type { OpenAPIV2, OpenAPIV3 } from "openapi-types"; import type { OpenAPISchemaObject } from "../guards/schemaGuards"; import { isSchemaObject, isOpenAPIV3Schema } from "../guards/schemaGuards"; import { toCanonicalSchemaV2 } from "./toCanonicalSchemaV2"; From 2857a1d9e05a65e348993509f84d02af7174781a Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Tue, 13 Jan 2026 17:34:11 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20writeFile=20=EC=8B=A4=ED=8C=A8?= =?UTF-8?q?=EC=8B=9C=20exit=201=20=EB=A1=9C=20=EC=A2=85=EB=A3=8C=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/patchlogr-cli/src/commands/runCanonicalize.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/patchlogr-cli/src/commands/runCanonicalize.ts b/packages/patchlogr-cli/src/commands/runCanonicalize.ts index 6687287..03a7461 100644 --- a/packages/patchlogr-cli/src/commands/runCanonicalize.ts +++ b/packages/patchlogr-cli/src/commands/runCanonicalize.ts @@ -21,7 +21,9 @@ export async function runCanonicalize( try { await fs.writeFile(options.output, JSON.stringify(output, null, 2)); } catch (error) { - console.error(`Failed to write to file ${options.output}:`, error); + throw new Error(`Failed to write to file ${options.output}:`, { + cause: error, + }); } } }