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/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..8e41a8a --- /dev/null +++ b/packages/patchlogr-cli/src/commands/diff.ts @@ -0,0 +1,84 @@ +import { preprocessOASDocument } from "@patchlogr/adapter-oas"; +import { + detectVersionBump, + diffSpec, + partitionByMethod, + partitionByTag, + type PartitionedSpec, +} from "@patchlogr/core"; + +import { Command } from "commander"; +import { type 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); + + const result = { specChangeSet, versionBump }; + + if (options.output === "stdout" || options.output === undefined) { + console.log(JSON.stringify(result, null, 2)); + } else { + try { + await fs.writeFile( + options.output, + JSON.stringify(result, 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); } 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"] }