diff --git a/eslint.config.mjs b/eslint.config.mjs index c096547..1a2addb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -11,6 +11,7 @@ export default tseslint.config( "**/node_modules/**", "**/.turbo/**", "**/coverage/**", + "**/.coverage/**", "**/.yarn/**", "**/.pnp.*", "**/*.mjs", @@ -48,11 +49,19 @@ export default tseslint.config( argsIgnorePattern: "^_", }, ], + "@typescript-eslint/consistent-type-imports": [ + "error", + { + prefer: "type-imports", + disallowTypeAnnotations: false, + }, + ], }, }, { files: ["**/*.{test,spec}.{ts,tsx,js,jsx}"], rules: { + "@typescript-eslint/no-explicit-any": "off", "no-restricted-imports": [ "error", { diff --git a/package.json b/package.json index 06041c9..dc5d6f5 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "build": "turbo run build --cache-dir=.turbo", "test": "turbo run test --cache-dir=.turbo", "lint": "turbo run lint --cache-dir=.turbo", + "lint:fix": "turbo run lint:fix --cache-dir=.turbo", "typecheck": "turbo run typecheck --cache-dir=.turbo", "clean": "turbo run clean && rm -rf node_modules .turbo" }, diff --git a/packages/patchlogr-cli/esbuild.mjs b/packages/patchlogr-cli/esbuild.mjs index 1905e4a..89327b5 100644 --- a/packages/patchlogr-cli/esbuild.mjs +++ b/packages/patchlogr-cli/esbuild.mjs @@ -5,6 +5,8 @@ await build({ entryPoints: [path.resolve("src/index.ts")], outfile: "dist/index.js", platform: "node", + bundle: true, + sourcemap: true, banner: { js: "#!/usr/bin/env node", }, diff --git a/packages/patchlogr-cli/package.json b/packages/patchlogr-cli/package.json index 413f96b..2d2bbaf 100644 --- a/packages/patchlogr-cli/package.json +++ b/packages/patchlogr-cli/package.json @@ -4,17 +4,24 @@ "publishConfig": { "access": "public" }, + "bin": { + "patchlogr": "./dist/index.js" + }, "scripts": { "clean": "rm -rf dist", "typecheck": "tsc -p tsconfig.json --noEmit", "build:types": "tsc -p tsconfig.json --emitDeclarationOnly", "build:js": "node ./esbuild.mjs", "build": "yarn clean && yarn build:types && yarn build:js", + "preview": "node dist/index.js", "test": "vitest", - "lint": "eslint ." + "lint": "eslint .", + "lint:fix": "eslint . --fix" }, "dependencies": { - "@patchlogr/core": "workspace:*" + "@patchlogr/core": "workspace:*", + "@patchlogr/oas": "workspace:*", + "commander": "^14.0.2" }, "devDependencies": { "@types/node": "24", diff --git a/packages/patchlogr-cli/src/cli.ts b/packages/patchlogr-cli/src/cli.ts new file mode 100644 index 0000000..bbcb1f2 --- /dev/null +++ b/packages/patchlogr-cli/src/cli.ts @@ -0,0 +1,37 @@ +import { Command } from "commander"; + +export function createCLI() { + const program = new Command(); + + program + .name("patchlogr") + .version("0.0.0") + .description("PatchlogrCLI : changelogs from openapi specs"); + + program + .command("help") + .description("Display help information about patchlogr commands"); + + program + .command("canonicalize") + .argument("", "Path to the OpenAPI specification file") + .option("--canonicalize", "Canonicalize the OpenAPI specification") + .option( + "--skipValidation", + "Skip validation of the OpenAPI specification", + ) + .option( + "-o, --output ", + "Write result to file instead of stdout (default: stdout)", + ) + .action(async (apiDocs, options) => { + try { + console.log("[patchlogr] Processing:", apiDocs, options); + } catch (error) { + console.error("[patchlogr] Error:", (error as Error).message); + process.exitCode = 1; + } + }); + + return program; +} diff --git a/packages/patchlogr-cli/src/commands/runCanonicalize.ts b/packages/patchlogr-cli/src/commands/runCanonicalize.ts new file mode 100644 index 0000000..863fad5 --- /dev/null +++ b/packages/patchlogr-cli/src/commands/runCanonicalize.ts @@ -0,0 +1,11 @@ +import { preprocessOASDocument } from "@patchlogr/oas"; +import { type OASStageOptions } from "@patchlogr/oas"; + +export type RunCanonicalizeOptions = OASStageOptions; + +export async function runCanonicalize( + apiDocs: any, + options: RunCanonicalizeOptions, +) { + preprocessOASDocument(apiDocs, { ...options }); +} diff --git a/packages/patchlogr-cli/src/index.ts b/packages/patchlogr-cli/src/index.ts index e69de29..914ae17 100644 --- a/packages/patchlogr-cli/src/index.ts +++ b/packages/patchlogr-cli/src/index.ts @@ -0,0 +1,8 @@ +import { createCLI } from "./cli"; + +const program = createCLI(); + +program.parseAsync(process.argv).catch((error) => { + console.error("[patchlogr] Error:", error); + process.exitCode = 1; +}); diff --git a/packages/patchlogr-core/package.json b/packages/patchlogr-core/package.json index 8cb972c..32d8182 100644 --- a/packages/patchlogr-core/package.json +++ b/packages/patchlogr-core/package.json @@ -22,7 +22,8 @@ "build:js": "node ./esbuild.mjs", "build": "yarn clean && yarn build:types && yarn build:js", "test": "vitest", - "lint": "eslint ." + "lint": "eslint .", + "lint:fix": "eslint . --fix" }, "dependencies": { "@apidevtools/swagger-parser": "^12.1.0", diff --git a/packages/patchlogr-oas/esbuild.mjs b/packages/patchlogr-oas/esbuild.mjs new file mode 100644 index 0000000..40fc4d3 --- /dev/null +++ b/packages/patchlogr-oas/esbuild.mjs @@ -0,0 +1,16 @@ +import { build } from "esbuild"; +import pkg from "./package.json" with { type: "json" }; + +await build({ + entryPoints: ["src/index.ts"], + outdir: "dist", + bundle: true, + platform: "node", + target: ["node18", "node20", "node24"], + format: "esm", + sourcemap: true, + external: [ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), + ], +}); diff --git a/packages/patchlogr-oas/package.json b/packages/patchlogr-oas/package.json index 0375a7d..fadbdcd 100644 --- a/packages/patchlogr-oas/package.json +++ b/packages/patchlogr-oas/package.json @@ -5,12 +5,24 @@ "access": "public" }, "scripts": { + "clean": "rm -rf dist", "lint": "eslint .", + "lint:fix": "eslint . --fix", "test": "vitest", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "build:types": "tsc -p tsconfig.json --emitDeclarationOnly", + "build:js": "node ./esbuild.mjs", + "build": "yarn clean && yarn build:types && yarn build:js" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + } }, "devDependencies": { "@types/node": "24", + "esbuild": "^0.27.2", "openapi-types": "^12.1.3", "vitest": "^4.0.16" }, diff --git a/packages/patchlogr-oas/src/__tests__/preprocessOASDocument.test.ts b/packages/patchlogr-oas/src/__tests__/preprocessOASDocument.test.ts index eeef09a..fd60ea6 100644 --- a/packages/patchlogr-oas/src/__tests__/preprocessOASDocument.test.ts +++ b/packages/patchlogr-oas/src/__tests__/preprocessOASDocument.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "vitest"; import { preprocessOASDocument } from "../index"; -import { OpenAPIV2, OpenAPIV3 } from "openapi-types"; +import type { OpenAPIV2, OpenAPIV3 } from "openapi-types"; const docV2: OpenAPIV2.Document = { swagger: "2.0", diff --git a/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV2.ts b/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV2.ts index a4fabbe..2d04ff8 100644 --- a/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV2.ts +++ b/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV2.ts @@ -1,4 +1,4 @@ -import { OpenAPIV2 } from "openapi-types"; +import type { OpenAPIV2 } from "openapi-types"; export const docV2: OpenAPIV2.Document = { swagger: "2.0", diff --git a/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV3.ts b/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV3.ts index e27ae0c..b4ae430 100644 --- a/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV3.ts +++ b/packages/patchlogr-oas/src/canonicalize/__fixtures__/docV3.ts @@ -1,4 +1,4 @@ -import { OpenAPIV3 } from "openapi-types"; +import type { OpenAPIV3 } from "openapi-types"; export const docV3: OpenAPIV3.Document = { openapi: "3.0.0", diff --git a/packages/patchlogr-oas/src/canonicalize/__tests__/v3/canonicalizeOASV3.test.ts b/packages/patchlogr-oas/src/canonicalize/__tests__/v3/canonicalizeOASV3.test.ts index 520b623..cc622ad 100644 --- a/packages/patchlogr-oas/src/canonicalize/__tests__/v3/canonicalizeOASV3.test.ts +++ b/packages/patchlogr-oas/src/canonicalize/__tests__/v3/canonicalizeOASV3.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import { CanonicalSchema } from "@patchlogr/types"; +import type { CanonicalSchema } from "@patchlogr/types"; import { canonicalizeOASV3, diff --git a/packages/patchlogr-oas/src/canonicalize/v2/index.ts b/packages/patchlogr-oas/src/canonicalize/v2/index.ts index 6e90e6f..40997f6 100644 --- a/packages/patchlogr-oas/src/canonicalize/v2/index.ts +++ b/packages/patchlogr-oas/src/canonicalize/v2/index.ts @@ -1,4 +1,4 @@ -import { +import type { CanonicalOperation, CanonicalParam, CanonicalSpec, @@ -9,7 +9,7 @@ import { CanonicalOperationDoc, CanonicalSecurityRequirement, } from "@patchlogr/types"; -import { OpenAPIV2 } from "openapi-types"; +import type { OpenAPIV2 } from "openapi-types"; import { toCanonicalSchema } from "../../utils/toCanonicalSchema"; const HTTP_METHODS = [ diff --git a/packages/patchlogr-oas/src/canonicalize/v3/index.ts b/packages/patchlogr-oas/src/canonicalize/v3/index.ts index f5f893e..8d02f59 100644 --- a/packages/patchlogr-oas/src/canonicalize/v3/index.ts +++ b/packages/patchlogr-oas/src/canonicalize/v3/index.ts @@ -1,4 +1,4 @@ -import { +import type { CanonicalOperation, CanonicalParam, CanonicalSpec, @@ -9,7 +9,7 @@ import { CanonicalOperationDoc, CanonicalSecurityRequirement, } from "@patchlogr/types"; -import { OpenAPIV3 } from "openapi-types"; +import type { OpenAPIV3 } from "openapi-types"; import { toCanonicalSchema } from "../../utils/toCanonicalSchema"; const HTTP_METHODS = [ diff --git a/packages/patchlogr-oas/src/guards/parameterGuards.ts b/packages/patchlogr-oas/src/guards/parameterGuards.ts index 792a00e..f940230 100644 --- a/packages/patchlogr-oas/src/guards/parameterGuards.ts +++ b/packages/patchlogr-oas/src/guards/parameterGuards.ts @@ -1,4 +1,4 @@ -import { CanonicalParam } from "@patchlogr/types"; +import type { CanonicalParam } from "@patchlogr/types"; export function isValidCanonicalParamIn( val: string, diff --git a/packages/patchlogr-oas/src/guards/schemaGuards.ts b/packages/patchlogr-oas/src/guards/schemaGuards.ts index 5fc22b0..3d6ffb1 100644 --- a/packages/patchlogr-oas/src/guards/schemaGuards.ts +++ b/packages/patchlogr-oas/src/guards/schemaGuards.ts @@ -1,4 +1,4 @@ -import { OpenAPIV2, OpenAPIV3 } from "openapi-types"; +import type { OpenAPIV2, OpenAPIV3 } from "openapi-types"; export type OpenAPISchemaObject = | OpenAPIV2.SchemaObject diff --git a/packages/patchlogr-oas/src/index.ts b/packages/patchlogr-oas/src/index.ts index c2eddaa..4fea297 100644 --- a/packages/patchlogr-oas/src/index.ts +++ b/packages/patchlogr-oas/src/index.ts @@ -1,24 +1,2 @@ -import { OpenAPI } from "openapi-types"; -import { PipelineExecutor } from "./pipeline/PipelineExecutor"; -import { OASValidationStage } from "./pipeline/OASValidationStage"; -import { OASCanonicalizeStage } from "./pipeline/OASCanonicalizeStage"; -import { OASBundleStage } from "./pipeline/OASBundleStage"; -import { OASStageContext, OASStageOptions } from "./pipeline/OASStageContext"; -import { OASDereferenceStage } from "./pipeline/OASDereferenceStage"; - -export function preprocessOASDocument( - doc: OpenAPI.Document, - options: OASStageOptions = {}, -) { - const pipelineExecutor = new PipelineExecutor(); - - pipelineExecutor.add(new OASBundleStage()); - pipelineExecutor.add(new OASValidationStage()); - pipelineExecutor.add(new OASDereferenceStage()); - pipelineExecutor.add(new OASCanonicalizeStage()); - - return pipelineExecutor.run({ - source: doc, - options, - }); -} +export { type OASStageOptions } from "./pipeline/OASStageContext"; +export { preprocessOASDocument } from "./preprocessOASDocument"; diff --git a/packages/patchlogr-oas/src/pipeline/OASBundleStage.ts b/packages/patchlogr-oas/src/pipeline/OASBundleStage.ts index 86e7c68..4e42c8b 100644 --- a/packages/patchlogr-oas/src/pipeline/OASBundleStage.ts +++ b/packages/patchlogr-oas/src/pipeline/OASBundleStage.ts @@ -1,6 +1,6 @@ import SwaggerParser from "@apidevtools/swagger-parser"; -import { OASStageContext } from "./OASStageContext"; -import { PipelineStage } from "./PipelineExecutor"; +import type { OASStageContext } from "./OASStageContext"; +import type { PipelineStage } from "./PipelineExecutor"; /** * 외부 $ref, schema 를 포함한 모든 문서를 합침 diff --git a/packages/patchlogr-oas/src/pipeline/OASCanonicalizeStage.ts b/packages/patchlogr-oas/src/pipeline/OASCanonicalizeStage.ts index 0fa9a95..91fde10 100644 --- a/packages/patchlogr-oas/src/pipeline/OASCanonicalizeStage.ts +++ b/packages/patchlogr-oas/src/pipeline/OASCanonicalizeStage.ts @@ -1,6 +1,6 @@ -import { CanonicalSpec } from "@patchlogr/types"; -import { OASStageContext } from "./OASStageContext"; -import { PipelineStage } from "./PipelineExecutor"; +import type { CanonicalSpec } from "@patchlogr/types"; +import type { OASStageContext } from "./OASStageContext"; +import type { PipelineStage } from "./PipelineExecutor"; import { canonicalizeOASV2 } from "../canonicalize/v2"; import { canonicalizeOASV3 } from "../canonicalize/v3"; import { isOpenAPIV2, isOpenAPIV3 } from "../utils/oasVersionUtils"; diff --git a/packages/patchlogr-oas/src/pipeline/OASDereferenceStage.ts b/packages/patchlogr-oas/src/pipeline/OASDereferenceStage.ts index fd05652..73480c3 100644 --- a/packages/patchlogr-oas/src/pipeline/OASDereferenceStage.ts +++ b/packages/patchlogr-oas/src/pipeline/OASDereferenceStage.ts @@ -1,6 +1,6 @@ import SwaggerParser from "@apidevtools/swagger-parser"; -import { OASStageContext } from "./OASStageContext"; -import { PipelineStage } from "./PipelineExecutor"; +import type { OASStageContext } from "./OASStageContext"; +import type { PipelineStage } from "./PipelineExecutor"; /** * OAS 문서의 모든 $ref를 평탄화함 diff --git a/packages/patchlogr-oas/src/pipeline/OASStageContext.ts b/packages/patchlogr-oas/src/pipeline/OASStageContext.ts index d7f5cd9..78937da 100644 --- a/packages/patchlogr-oas/src/pipeline/OASStageContext.ts +++ b/packages/patchlogr-oas/src/pipeline/OASStageContext.ts @@ -1,5 +1,5 @@ -import { CanonicalSpec } from "@patchlogr/types"; -import { OpenAPI } from "openapi-types"; +import type { CanonicalSpec } from "@patchlogr/types"; +import type { OpenAPI } from "openapi-types"; export type OASStageInput = string | OpenAPI.Document; diff --git a/packages/patchlogr-oas/src/pipeline/OASValidationStage.ts b/packages/patchlogr-oas/src/pipeline/OASValidationStage.ts index ba36ac1..1496d1a 100644 --- a/packages/patchlogr-oas/src/pipeline/OASValidationStage.ts +++ b/packages/patchlogr-oas/src/pipeline/OASValidationStage.ts @@ -1,7 +1,7 @@ import SwaggerParser from "@apidevtools/swagger-parser"; -import { PipelineStage } from "./PipelineExecutor"; -import { OASStageContext } from "./OASStageContext"; +import type { PipelineStage } from "./PipelineExecutor"; +import type { OASStageContext } from "./OASStageContext"; import { getOASVersion } from "../utils/oasVersionUtils"; /** diff --git a/packages/patchlogr-oas/src/pipeline/__tests__/OASBundleStage.test.ts b/packages/patchlogr-oas/src/pipeline/__tests__/OASBundleStage.test.ts index e27bbf4..5c54bb6 100644 --- a/packages/patchlogr-oas/src/pipeline/__tests__/OASBundleStage.test.ts +++ b/packages/patchlogr-oas/src/pipeline/__tests__/OASBundleStage.test.ts @@ -1,8 +1,8 @@ import { describe, expect, test } from "vitest"; import { OASBundleStage } from "../OASBundleStage"; -import { OASStageContext } from "../OASStageContext"; +import type { OASStageContext } from "../OASStageContext"; import path from "path"; -import { OpenAPIV3 } from "openapi-types"; +import type { OpenAPIV3 } from "openapi-types"; describe("OASBundleStage", () => { test("should dereference external $ref correctly", async () => { diff --git a/packages/patchlogr-oas/src/pipeline/__tests__/OASDereferenceStage.test.ts b/packages/patchlogr-oas/src/pipeline/__tests__/OASDereferenceStage.test.ts index 132edaa..d49df21 100644 --- a/packages/patchlogr-oas/src/pipeline/__tests__/OASDereferenceStage.test.ts +++ b/packages/patchlogr-oas/src/pipeline/__tests__/OASDereferenceStage.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from "vitest"; import { OASDereferenceStage } from "../OASDereferenceStage"; -import { OASStageContext } from "../OASStageContext"; +import type { OASStageContext } from "../OASStageContext"; describe("OASDereferenceStage", () => { test("should throw an error if input.oas is missing", async () => { diff --git a/packages/patchlogr-oas/src/pipeline/__tests__/OASValidationStage.test.ts b/packages/patchlogr-oas/src/pipeline/__tests__/OASValidationStage.test.ts index 4260ea1..d7ed5a6 100644 --- a/packages/patchlogr-oas/src/pipeline/__tests__/OASValidationStage.test.ts +++ b/packages/patchlogr-oas/src/pipeline/__tests__/OASValidationStage.test.ts @@ -1,8 +1,8 @@ -import { OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from "openapi-types"; +import type { OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from "openapi-types"; import { describe, expect, test } from "vitest"; import SwaggerParser from "@apidevtools/swagger-parser"; import { OASValidationStage } from "../OASValidationStage"; -import { OASStageContext } from "../OASStageContext"; +import type { OASStageContext } from "../OASStageContext"; const oasFixtureV2: OpenAPIV2.Document = { swagger: "2.0", diff --git a/packages/patchlogr-oas/src/pipeline/__tests__/PipelineExecutor.test.ts b/packages/patchlogr-oas/src/pipeline/__tests__/PipelineExecutor.test.ts index 327d196..a987d9c 100644 --- a/packages/patchlogr-oas/src/pipeline/__tests__/PipelineExecutor.test.ts +++ b/packages/patchlogr-oas/src/pipeline/__tests__/PipelineExecutor.test.ts @@ -1,5 +1,6 @@ import { describe, expect, test, vitest } from "vitest"; -import { PipelineExecutor, PipelineStage } from "../PipelineExecutor"; +import type { PipelineStage } from "../PipelineExecutor"; +import { PipelineExecutor } from "../PipelineExecutor"; describe("PipelineExecutor", () => { test("should append stages correctly", () => { diff --git a/packages/patchlogr-oas/src/preprocessOASDocument.ts b/packages/patchlogr-oas/src/preprocessOASDocument.ts new file mode 100644 index 0000000..85a82d3 --- /dev/null +++ b/packages/patchlogr-oas/src/preprocessOASDocument.ts @@ -0,0 +1,27 @@ +import type { OpenAPI } from "openapi-types"; +import { OASBundleStage } from "./pipeline/OASBundleStage"; +import { OASCanonicalizeStage } from "./pipeline/OASCanonicalizeStage"; +import { OASDereferenceStage } from "./pipeline/OASDereferenceStage"; +import type { + OASStageOptions, + OASStageContext, +} from "./pipeline/OASStageContext"; +import { OASValidationStage } from "./pipeline/OASValidationStage"; +import { PipelineExecutor } from "./pipeline/PipelineExecutor"; + +export function preprocessOASDocument( + doc: OpenAPI.Document, + options: OASStageOptions = {}, +) { + const pipelineExecutor = new PipelineExecutor(); + + pipelineExecutor.add(new OASBundleStage()); + pipelineExecutor.add(new OASValidationStage()); + pipelineExecutor.add(new OASDereferenceStage()); + pipelineExecutor.add(new OASCanonicalizeStage()); + + return pipelineExecutor.run({ + source: doc, + options, + }); +} diff --git a/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchema.test.ts b/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchema.test.ts index 85d4099..c350445 100644 --- a/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchema.test.ts +++ b/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchema.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from "vitest"; import { toCanonicalSchema } from "../toCanonicalSchema"; -import { OpenAPISchemaObjectWithItems } from "../../guards/schemaGuards"; +import type { OpenAPISchemaObjectWithItems } from "../../guards/schemaGuards"; describe("toCanonicalSchema", () => { test("should normalize simple schema", () => { diff --git a/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV2.test.ts b/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV2.test.ts index 4bbf632..68dc6a1 100644 --- a/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV2.test.ts +++ b/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV2.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from "vitest"; import { toCanonicalSchemaV2 } from "../toCanonicalSchemaV2"; -import { OpenAPIV2 } from "openapi-types"; +import type { OpenAPIV2 } from "openapi-types"; describe("toCanonicalSchemaV2", () => { it("should convert a simple string schema", () => { diff --git a/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV3.test.ts b/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV3.test.ts index 79f6930..0080125 100644 --- a/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV3.test.ts +++ b/packages/patchlogr-oas/src/utils/__tests__/toCanonicalSchemaV3.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from "vitest"; import { toCanonicalSchemaV3 } from "../toCanonicalSchemaV3"; -import { OpenAPIV3 } from "openapi-types"; +import type { OpenAPIV3 } from "openapi-types"; describe("toCanonicalSchemaV3", () => { it("should convert a simple string schema", () => { diff --git a/packages/patchlogr-oas/src/utils/oasVersionUtils.ts b/packages/patchlogr-oas/src/utils/oasVersionUtils.ts index 896d5bf..5815698 100644 --- a/packages/patchlogr-oas/src/utils/oasVersionUtils.ts +++ b/packages/patchlogr-oas/src/utils/oasVersionUtils.ts @@ -1,4 +1,4 @@ -import { OpenAPI, OpenAPIV2, OpenAPIV3 } from "openapi-types"; +import type { OpenAPI, OpenAPIV2, OpenAPIV3 } from "openapi-types"; export function getOASVersion(doc: OpenAPI.Document): string | undefined { if (isOpenAPIV3(doc)) { diff --git a/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts b/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts index 5e7170d..2b554d2 100644 --- a/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts +++ b/packages/patchlogr-oas/src/utils/toCanonicalSchema.ts @@ -1,10 +1,7 @@ -import { CanonicalSchema } from "@patchlogr/types"; -import { OpenAPIV2, OpenAPIV3 } from "openapi-types"; -import { - isSchemaObject, - OpenAPISchemaObject, - isOpenAPIV3Schema, -} from "../guards/schemaGuards"; +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"; import { toCanonicalSchemaV3 } from "./toCanonicalSchemaV3"; diff --git a/packages/patchlogr-oas/src/utils/toCanonicalSchemaV2.ts b/packages/patchlogr-oas/src/utils/toCanonicalSchemaV2.ts index c2993aa..fda0a0d 100644 --- a/packages/patchlogr-oas/src/utils/toCanonicalSchemaV2.ts +++ b/packages/patchlogr-oas/src/utils/toCanonicalSchemaV2.ts @@ -1,9 +1,7 @@ -import { CanonicalSchema } from "@patchlogr/types"; -import { OpenAPIV2 } from "openapi-types"; -import { - isSchemaObject, - OpenAPISchemaObjectWithCommonProps, -} from "../guards/schemaGuards"; +import { type CanonicalSchema } from "@patchlogr/types"; +import { type OpenAPIV2 } from "openapi-types"; +import type { OpenAPISchemaObjectWithCommonProps } from "../guards/schemaGuards"; +import { isSchemaObject } from "../guards/schemaGuards"; export function toCanonicalSchemaV2( schema: OpenAPIV2.SchemaObject | undefined, diff --git a/packages/patchlogr-oas/src/utils/toCanonicalSchemaV3.ts b/packages/patchlogr-oas/src/utils/toCanonicalSchemaV3.ts index b1fa0bb..f8d0c43 100644 --- a/packages/patchlogr-oas/src/utils/toCanonicalSchemaV3.ts +++ b/packages/patchlogr-oas/src/utils/toCanonicalSchemaV3.ts @@ -1,9 +1,7 @@ -import { CanonicalSchema } from "@patchlogr/types"; -import { OpenAPIV3 } from "openapi-types"; -import { - isSchemaObject, - OpenAPISchemaObjectWithCommonProps, -} from "../guards/schemaGuards"; +import { type CanonicalSchema } from "@patchlogr/types"; +import { type OpenAPIV3 } from "openapi-types"; +import type { OpenAPISchemaObjectWithCommonProps } from "../guards/schemaGuards"; +import { isSchemaObject } from "../guards/schemaGuards"; export function toCanonicalSchemaV3( schema: OpenAPIV3.SchemaObject | undefined, diff --git a/packages/patchlogr-oas/tsconfig.json b/packages/patchlogr-oas/tsconfig.json index a281a8c..b0c1935 100644 --- a/packages/patchlogr-oas/tsconfig.json +++ b/packages/patchlogr-oas/tsconfig.json @@ -1,15 +1,15 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "module": "nodenext", "outDir": "dist", "rootDir": "src", + // build .d.ts "declaration": true, "declarationMap": true, "emitDeclarationOnly": false, - "lib": ["esnext"] + "noEmit": false }, "include": ["src"] } diff --git a/packages/patchlogr-types/package.json b/packages/patchlogr-types/package.json index 9d2bc6e..2023c79 100644 --- a/packages/patchlogr-types/package.json +++ b/packages/patchlogr-types/package.json @@ -11,6 +11,7 @@ "scripts": { "build": "tsc", "lint": "eslint .", + "lint:fix": "eslint . --fix", "typecheck": "tsc --noEmit" }, "devDependencies": { diff --git a/packages/patchlogr-types/tsconfig.json b/packages/patchlogr-types/tsconfig.json index b5fb432..47652c7 100644 --- a/packages/patchlogr-types/tsconfig.json +++ b/packages/patchlogr-types/tsconfig.json @@ -1,18 +1,16 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "module": "nodenext", "outDir": "dist", "rootDir": "src", + // build .d.ts only "declaration": true, "declarationMap": true, "emitDeclarationOnly": true, - "skipLibCheck": false, - "noEmit": false, - - "lib": ["esnext"] + // override base settings + "noEmit": false }, "include": ["src"] } diff --git a/tsconfig.base.json b/tsconfig.base.json index e626f22..01eed2d 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,10 +1,12 @@ { "compilerOptions": { - "target": "ES2020", - "lib": ["ES2020"], + // node20+ apis & syntax + "target": "ES2022", + "lib": ["ES2022"], + + // node esm, cjs compat + "module": "NodeNext", "moduleResolution": "NodeNext", - "resolveJsonModule": true, - "allowSyntheticDefaultImports": true, "strict": true, "noImplicitAny": false, @@ -13,10 +15,13 @@ "useUnknownInCatchVariables": true, "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + + // overrides "skipLibCheck": true, "isolatedModules": true, - "noEmit": true, - - "esModuleInterop": true + "noEmit": true } } diff --git a/turbo.json b/turbo.json index 8722a4e..918c89e 100644 --- a/turbo.json +++ b/turbo.json @@ -30,6 +30,10 @@ "inputs": ["src/**", "package.json"], "outputs": [] }, + "lint:fix": { + "inputs": ["src/**", "package.json"], + "outputs": [] + }, "clean": { "cache": false, "outputs": [] diff --git a/yarn.lock b/yarn.lock index 96fcecf..1770674 100644 --- a/yarn.lock +++ b/yarn.lock @@ -405,10 +405,14 @@ __metadata: resolution: "@patchlogr/cli@workspace:packages/patchlogr-cli" dependencies: "@patchlogr/core": "workspace:*" + "@patchlogr/oas": "workspace:*" "@types/node": "npm:24" + commander: "npm:^14.0.2" esbuild: "npm:^0.27.2" typescript: "npm:^5.9.3" vitest: "npm:^4.0.16" + bin: + patchlogr: ./dist/index.js languageName: unknown linkType: soft @@ -432,6 +436,7 @@ __metadata: "@apidevtools/swagger-parser": "npm:^12.1.0" "@patchlogr/types": "workspace:*" "@types/node": "npm:24" + esbuild: "npm:^0.27.2" openapi-types: "npm:^12.1.3" vitest: "npm:^4.0.16" languageName: unknown @@ -1085,6 +1090,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^14.0.2": + version: 14.0.2 + resolution: "commander@npm:14.0.2" + checksum: 10c0/245abd1349dbad5414cb6517b7b5c584895c02c4f7836ff5395f301192b8566f9796c82d7bd6c92d07eba8775fe4df86602fca5d86d8d10bcc2aded1e21c2aeb + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1"