From 8b31d0fcd00c882ebef6d00f6d0bde6da481f5e8 Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Sun, 22 Feb 2026 15:13:15 +0900 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20noEmit=20=EC=98=B5=EC=85=98=20?= =?UTF-8?q?=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/patchlogr-core/tsconfig.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/patchlogr-core/tsconfig.json b/packages/patchlogr-core/tsconfig.json index 8e56657..a0dab8a 100644 --- a/packages/patchlogr-core/tsconfig.json +++ b/packages/patchlogr-core/tsconfig.json @@ -7,7 +7,9 @@ "declaration": true, "declarationMap": true, - "emitDeclarationOnly": false + "emitDeclarationOnly": false, + + "noEmit": false }, "include": ["src"] } From 5de7d22f1a69eb342237089770df79f890fd7b2e Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Sun, 22 Feb 2026 15:13:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20diff=20command=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/commands/canonicalize.ts | 6 +- packages/patchlogr-cli/src/commands/diff.ts | 88 +++++++++++++++++++ packages/patchlogr-cli/src/createCLI.ts | 4 +- 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 packages/patchlogr-cli/src/commands/diff.ts diff --git a/packages/patchlogr-cli/src/commands/canonicalize.ts b/packages/patchlogr-cli/src/commands/canonicalize.ts index 91ce76e..b9b810a 100644 --- a/packages/patchlogr-cli/src/commands/canonicalize.ts +++ b/packages/patchlogr-cli/src/commands/canonicalize.ts @@ -11,7 +11,11 @@ export type CanonicalizeOptions = OASStageOptions & { export const canonicalizeCommand = new Command("canonicalize") .argument("", "Path to the OpenAPI specification file") - .option("--skipValidation", "Skip validation of the OpenAPI specification") + .option( + "--skipValidation", + "Skip validation of the OpenAPI specification", + true, + ) .option( "-o, --output ", "Write result to file instead of stdout (default: stdout)", diff --git a/packages/patchlogr-cli/src/commands/diff.ts b/packages/patchlogr-cli/src/commands/diff.ts new file mode 100644 index 0000000..e9ea105 --- /dev/null +++ b/packages/patchlogr-cli/src/commands/diff.ts @@ -0,0 +1,88 @@ +import { preprocessOASDocument } from "@patchlogr/adapter-oas"; +import { + detectVersionBump, + diffSpec, + partitionByMethod, + partitionByTag, + type PartitionedSpec, +} from "@patchlogr/core"; + +import { Command } from "commander"; +import { OpenAPI } from "openapi-types"; + +import fs from "fs/promises"; + +export type DiffOptions = { + partition: "tag" | "method"; + output?: "stdout" | string; + skipValidation: boolean; +}; + +export const diffCommand = new Command("diff") + .description("Diff two OpenAPI Specification files") + .argument("", "Base OpenAPI Specification file") + .argument("", "Head OpenAPI Specification file") + .option("-o, --output ", "Output file") + .option("--skipValidation", "Skip validation", true) + .option("-p, --partition ", "Partition Strategy", "tag") + .action(diffAction); + +export async function diffAction( + basePath: OpenAPI.Document, + headPath: OpenAPI.Document, + options: DiffOptions, +) { + const preprocessedBase = await preprocessOASDocument(basePath, { + skipValidation: options.skipValidation, + }); + const preprocessedHead = await preprocessOASDocument(headPath, { + skipValidation: options.skipValidation, + }); + + const baseCanonicalSpec = preprocessedBase.canonicalSpec; + const headCanonicalSpec = preprocessedHead.canonicalSpec; + + if (!baseCanonicalSpec || !headCanonicalSpec) { + throw new Error("Failed to preprocess OpenAPI Specification files"); + } + + let partitionedBase: PartitionedSpec; + let partitionedHead: PartitionedSpec; + + switch (options.partition) { + case "method": + partitionedBase = partitionByMethod(baseCanonicalSpec); + partitionedHead = partitionByMethod(headCanonicalSpec); + break; + case "tag": + default: + partitionedBase = partitionByTag(baseCanonicalSpec); + partitionedHead = partitionByTag(headCanonicalSpec); + break; + } + + const specChangeSet = diffSpec(partitionedBase, partitionedHead); + const versionBump = detectVersionBump(specChangeSet); + + if (options.output === "stdout" || options.output === undefined) { + console.log(JSON.stringify(specChangeSet, null, 2)); + console.log(JSON.stringify(versionBump, null, 2)); + } else { + try { + await fs.writeFile( + options.output.concat(".json"), + JSON.stringify(specChangeSet, null, 2), + "utf-8", + ); + await fs.writeFile( + options.output.concat(".version.json"), + JSON.stringify(versionBump, null, 2), + "utf-8", + ); + } catch (error) { + throw new Error(`Failed to write to file ${options.output}:`, { + cause: error, + }); + } + } +} diff --git a/packages/patchlogr-cli/src/createCLI.ts b/packages/patchlogr-cli/src/createCLI.ts index a1498f2..8842e07 100644 --- a/packages/patchlogr-cli/src/createCLI.ts +++ b/packages/patchlogr-cli/src/createCLI.ts @@ -3,6 +3,7 @@ import pkg from "../package.json"; import { helpCommand } from "./commands/help"; import { canonicalizeCommand } from "./commands/canonicalize"; +import { diffCommand } from "./commands/diff"; export function createCLI() { return new Command() @@ -10,5 +11,6 @@ export function createCLI() { .version(pkg.version) .description("PatchlogrCLI : changelogs from openapi specs") .addCommand(helpCommand) - .addCommand(canonicalizeCommand); + .addCommand(canonicalizeCommand) + .addCommand(diffCommand); } From ea096d5b9ca781b49ac5df543c9bbaf15524cc3b Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Sun, 22 Feb 2026 15:18:27 +0900 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20lint=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/patchlogr-adapter-oas/src/oas-v2/toCanonicalSchema.ts | 1 - packages/patchlogr-cli/src/commands/diff.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/patchlogr-adapter-oas/src/oas-v2/toCanonicalSchema.ts b/packages/patchlogr-adapter-oas/src/oas-v2/toCanonicalSchema.ts index 8dde6d9..8c76e70 100644 --- a/packages/patchlogr-adapter-oas/src/oas-v2/toCanonicalSchema.ts +++ b/packages/patchlogr-adapter-oas/src/oas-v2/toCanonicalSchema.ts @@ -1,6 +1,5 @@ import { type CanonicalSchema } from "@patchlogr/types"; import { type OpenAPIV2 } from "openapi-types"; -import type { OpenAPISchemaObjectWithCommonProps } from "../oas-common/schemaGuards"; import { isSchemaObject } from "../oas-common/schemaGuards"; export function toCanonicalSchema( diff --git a/packages/patchlogr-cli/src/commands/diff.ts b/packages/patchlogr-cli/src/commands/diff.ts index e9ea105..d736f29 100644 --- a/packages/patchlogr-cli/src/commands/diff.ts +++ b/packages/patchlogr-cli/src/commands/diff.ts @@ -8,7 +8,7 @@ import { } from "@patchlogr/core"; import { Command } from "commander"; -import { OpenAPI } from "openapi-types"; +import { type OpenAPI } from "openapi-types"; import fs from "fs/promises"; From d330ae98283be6e23d54f2e2697410ac5c2c4f04 Mon Sep 17 00:00:00 2001 From: toothlessdev Date: Sun, 22 Feb 2026 15:38:44 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=ED=99=95=EC=9E=A5=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EC=A7=81=EC=A0=91=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?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/diff.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/patchlogr-cli/src/commands/diff.ts b/packages/patchlogr-cli/src/commands/diff.ts index d736f29..8e41a8a 100644 --- a/packages/patchlogr-cli/src/commands/diff.ts +++ b/packages/patchlogr-cli/src/commands/diff.ts @@ -64,19 +64,15 @@ export async function diffAction( const specChangeSet = diffSpec(partitionedBase, partitionedHead); const versionBump = detectVersionBump(specChangeSet); + const result = { specChangeSet, versionBump }; + if (options.output === "stdout" || options.output === undefined) { - console.log(JSON.stringify(specChangeSet, null, 2)); - console.log(JSON.stringify(versionBump, null, 2)); + console.log(JSON.stringify(result, null, 2)); } else { try { await fs.writeFile( - options.output.concat(".json"), - JSON.stringify(specChangeSet, null, 2), - "utf-8", - ); - await fs.writeFile( - options.output.concat(".version.json"), - JSON.stringify(versionBump, null, 2), + options.output, + JSON.stringify(result, null, 2), "utf-8", ); } catch (error) {