From dad75b1828722e0f3fea59455db74f4b69361624 Mon Sep 17 00:00:00 2001 From: Drew Powers Date: Sun, 14 Sep 2025 13:23:18 -0600 Subject: [PATCH] breaking: update Redocly CLI to 2.x --- .changeset/salty-results-wait.md | 5 + packages/openapi-typescript/biome.json | 2 +- packages/openapi-typescript/package.json | 3 +- packages/openapi-typescript/src/index.ts | 231 +++++++++++++++++- packages/openapi-typescript/src/lib/redoc.ts | 14 +- .../openapi-typescript/src/lib/redocly.ts | 33 +++ packages/openapi-typescript/src/lib/ts.ts | 2 +- packages/openapi-typescript/src/lib/utils.ts | 2 +- .../src/transform/header-object.ts | 2 +- .../src/transform/schema-object.ts | 2 +- .../openapi-typescript/test/test-helpers.ts | 3 +- pnpm-lock.yaml | 110 ++++++--- 12 files changed, 355 insertions(+), 54 deletions(-) create mode 100644 .changeset/salty-results-wait.md create mode 100644 packages/openapi-typescript/src/lib/redocly.ts diff --git a/.changeset/salty-results-wait.md b/.changeset/salty-results-wait.md new file mode 100644 index 000000000..60dc834d5 --- /dev/null +++ b/.changeset/salty-results-wait.md @@ -0,0 +1,5 @@ +--- +"openapi-typescript": major +--- + +⚠️ Breaking change: Update Redocly CLI to 2.x. See https://redocly.com/docs/cli/guides/migrate-to-v2 for migration guide. diff --git a/packages/openapi-typescript/biome.json b/packages/openapi-typescript/biome.json index 57bb641e2..93c854b2e 100644 --- a/packages/openapi-typescript/biome.json +++ b/packages/openapi-typescript/biome.json @@ -3,6 +3,6 @@ "$schema": "https://biomejs.dev/schemas/2.2.4/schema.json", "extends": "//", "files": { - "includes": ["bin/**", "!examples/**", "src/**", "test/**", "!**/fixtures/**/*"] + "includes": ["bin/**", "!examples/**", "src/**", "test/**", "!**/fixtures/**/*", "!src/lib/redocly.ts"] } } diff --git a/packages/openapi-typescript/package.json b/packages/openapi-typescript/package.json index 04bb17db5..afcc5b1f5 100644 --- a/packages/openapi-typescript/package.json +++ b/packages/openapi-typescript/package.json @@ -62,7 +62,8 @@ "typescript": "^5.x" }, "dependencies": { - "@redocly/openapi-core": "^1.34.5", + "@redocly/openapi-core": "^2.1.2", + "ajv": "^8.17.1", "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.3.0", diff --git a/packages/openapi-typescript/src/index.ts b/packages/openapi-typescript/src/index.ts index cbd52bc93..e3037e339 100644 --- a/packages/openapi-typescript/src/index.ts +++ b/packages/openapi-typescript/src/index.ts @@ -1,6 +1,7 @@ import { performance } from "node:perf_hooks"; import type { Readable } from "node:stream"; import { createConfig } from "@redocly/openapi-core"; +import type { RawGovernanceConfig } from "@redocly/openapi-core/lib/config/config"; import type ts from "typescript"; import { validateAndBundle } from "./lib/redoc.js"; import { debug, resolveRef, scanDiscriminators } from "./lib/utils.js"; @@ -51,14 +52,13 @@ export default async function openapiTS( const redoc = options.redocly ?? - (await createConfig( - { - rules: { - "operation-operationId-unique": { severity: "error" }, // throw error on duplicate operationIDs - }, + (await createConfig({ + ...REDOCLY_MINIMAL_CONFIG, + rules: { + ...REDOCLY_MINIMAL_CONFIG.rules, + "operation-operationId-unique": { severity: "error" }, // throw error on duplicate operationIDs }, - { extends: ["minimal"] }, - )); + })); const schema = await validateAndBundle(source, { redoc, @@ -102,3 +102,220 @@ export default async function openapiTS( return result; } + +export const REDOCLY_MINIMAL_CONFIG: RawGovernanceConfig<"built-in"> = { + rules: { + struct: "error", + "no-unresolved-refs": "error", + }, + oas2Rules: { + "boolean-parameter-prefixes": "off", + "info-contact": "off", + "info-license": "off", + "info-license-strict": "off", + "no-path-trailing-slash": "warn", + "no-identical-paths": "warn", + "no-ambiguous-paths": "warn", + "no-invalid-schema-examples": "off", + "no-invalid-parameter-examples": "off", + "no-http-verbs-in-paths": "off", + "no-enum-type-mismatch": "warn", + "no-required-schema-properties-undefined": "warn", + "no-schema-type-mismatch": "warn", + "operation-summary": "warn", + "operation-operationId": "warn", + "operation-operationId-unique": "warn", + "operation-operationId-url-safe": "warn", + "operation-description": "off", + "operation-2xx-response": "warn", + "operation-4xx-response": "off", + "operation-parameters-unique": "warn", + "operation-tag-defined": "off", + "operation-singular-tag": "off", + "parameter-description": "off", + "path-declaration-must-exist": "warn", + "path-not-include-query": "warn", + "path-parameters-defined": "warn", + "paths-kebab-case": "off", + "path-http-verbs-order": "off", + "path-params-defined": "off", + "path-segment-plural": "off", + "required-string-property-missing-min-length": "off", + "response-contains-header": "off", + "request-mime-type": "off", + "response-contains-property": "off", + "response-mime-type": "off", + "security-defined": "warn", + "spec-strict-refs": "off", + "scalar-property-missing-example": "off", + "tag-description": "warn", + "tags-alphabetical": "off", + "no-duplicated-tag-names": "off", + }, + oas3_0Rules: { + "array-parameter-serialization": "off", + "boolean-parameter-prefixes": "off", + "component-name-unique": "off", + "info-contact": "off", + "info-license": "off", + "info-license-strict": "off", + "no-ambiguous-paths": "warn", + "no-path-trailing-slash": "warn", + "no-identical-paths": "warn", + "no-invalid-schema-examples": "off", + "no-invalid-parameter-examples": "off", + "no-http-verbs-in-paths": "off", + "no-enum-type-mismatch": "warn", + "no-required-schema-properties-undefined": "warn", + "no-schema-type-mismatch": "warn", + "no-invalid-media-type-examples": { + severity: "warn", + allowAdditionalProperties: false, + }, + "no-server-example.com": "warn", + "no-server-trailing-slash": "error", + "no-empty-servers": "warn", + "no-example-value-and-externalValue": "warn", + "no-unused-components": "warn", + "no-undefined-server-variable": "warn", + "no-server-variables-empty-enum": "error", + "nullable-type-sibling": "warn", + "operation-summary": "warn", + "operation-operationId": "warn", + "operation-operationId-unique": "warn", + "operation-operationId-url-safe": "warn", + "operation-description": "off", + "operation-2xx-response": "warn", + "operation-4xx-response": "off", + "operation-4xx-problem-details-rfc7807": "off", + "operation-parameters-unique": "warn", + "operation-tag-defined": "off", + "operation-singular-tag": "off", + "parameter-description": "off", + "path-declaration-must-exist": "warn", + "path-not-include-query": "warn", + "path-parameters-defined": "warn", + "paths-kebab-case": "off", + "path-http-verbs-order": "off", + "path-params-defined": "off", + "path-segment-plural": "off", + "required-string-property-missing-min-length": "off", + "response-contains-header": "off", + "request-mime-type": "off", + "response-contains-property": "off", + "response-mime-type": "off", + "security-defined": "warn", + "spec-strict-refs": "off", + "scalar-property-missing-example": "off", + "spec-components-invalid-map-name": "warn", + "tag-description": "warn", + "tags-alphabetical": "off", + "no-duplicated-tag-names": "off", + }, + oas3_1Rules: { + "array-parameter-serialization": "off", + "boolean-parameter-prefixes": "off", + "component-name-unique": "off", + "info-contact": "off", + "info-license": "off", + "info-license-strict": "off", + "no-path-trailing-slash": "warn", + "no-identical-paths": "warn", + "no-ambiguous-paths": "warn", + "no-invalid-schema-examples": "off", + "no-invalid-parameter-examples": "off", + "no-http-verbs-in-paths": "off", + "no-enum-type-mismatch": "warn", + "no-required-schema-properties-undefined": "warn", + "no-schema-type-mismatch": "warn", + "no-invalid-media-type-examples": "warn", + "no-server-example.com": "warn", + "no-server-trailing-slash": "error", + "no-empty-servers": "warn", + "no-example-value-and-externalValue": "warn", + "no-unused-components": "warn", + "no-undefined-server-variable": "warn", + "no-server-variables-empty-enum": "error", + "operation-summary": "warn", + "operation-operationId": "warn", + "operation-operationId-unique": "warn", + "operation-operationId-url-safe": "warn", + "operation-description": "off", + "operation-2xx-response": "warn", + "operation-4xx-response": "off", + "operation-4xx-problem-details-rfc7807": "off", + "operation-parameters-unique": "warn", + "operation-tag-defined": "off", + "operation-singular-tag": "off", + "parameter-description": "off", + "path-declaration-must-exist": "warn", + "path-not-include-query": "warn", + "path-parameters-defined": "warn", + "paths-kebab-case": "off", + "path-http-verbs-order": "off", + "path-params-defined": "off", + "path-segment-plural": "off", + "required-string-property-missing-min-length": "off", + "response-contains-header": "off", + "request-mime-type": "off", + "response-contains-property": "off", + "response-mime-type": "off", + "security-defined": "warn", + "spec-strict-refs": "off", + "scalar-property-missing-example": "off", + "spec-components-invalid-map-name": "warn", + "tag-description": "warn", + "tags-alphabetical": "off", + "no-duplicated-tag-names": "off", + }, + async2Rules: { + "channels-kebab-case": "off", + "info-contact": "off", + "info-license-strict": "off", + "no-channel-trailing-slash": "off", + "operation-operationId": "warn", + "tag-description": "warn", + "tags-alphabetical": "off", + "no-duplicated-tag-names": "off", + "no-required-schema-properties-undefined": "warn", + "no-enum-type-mismatch": "warn", + "no-schema-type-mismatch": "warn", + }, + async3Rules: { + "channels-kebab-case": "off", + "info-contact": "off", + "info-license-strict": "off", + "no-channel-trailing-slash": "off", + "operation-operationId": "warn", + "tag-description": "warn", + "tags-alphabetical": "off", + "no-duplicated-tag-names": "off", + "no-required-schema-properties-undefined": "warn", + "no-enum-type-mismatch": "warn", + "no-schema-type-mismatch": "warn", + }, + arazzo1Rules: { + "criteria-unique": "off", + "no-criteria-xpath": "off", + "parameters-unique": "off", + "requestBody-replacements-unique": "off", + "sourceDescription-type": "off", + "sourceDescriptions-not-empty": "off", + "step-onSuccess-unique": "off", + "step-onFailure-unique": "off", + "stepId-unique": "error", + "sourceDescription-name-unique": "off", + "respect-supported-versions": "off", + "workflowId-unique": "error", + "workflow-dependsOn": "off", + "no-x-security-scheme-name-without-openapi": "off", + "x-security-scheme-required-values": "off", + "no-x-security-scheme-name-in-workflow": "off", + "no-required-schema-properties-undefined": "warn", + "no-enum-type-mismatch": "warn", + "no-schema-type-mismatch": "warn", + }, + overlay1Rules: { + "info-contact": "off", + }, +}; diff --git a/packages/openapi-typescript/src/lib/redoc.ts b/packages/openapi-typescript/src/lib/redoc.ts index 22a2315c2..6dd89912e 100644 --- a/packages/openapi-typescript/src/lib/redoc.ts +++ b/packages/openapi-typescript/src/lib/redoc.ts @@ -107,7 +107,7 @@ function _processProblems(problems: NormalizedProblem[], options: { silent: bool export async function validateAndBundle( source: string | URL | OpenAPI3 | Readable | Buffer, options: ValidateAndBundleOptions, -) { +): Promise { const redocConfigT = performance.now(); debug("Loaded Redoc config", "redoc", performance.now() - redocConfigT); const redocParseT = performance.now(); @@ -116,22 +116,22 @@ export async function validateAndBundle( absoluteRef = source.protocol === "file:" ? fileURLToPath(source) : source.href; } const resolver = new BaseResolver(options.redoc.resolve); - const document = await parseSchema(source, { + const document = (await parseSchema(source, { absoluteRef, resolver, - }); + })) as Document; debug("Parsed schema", "redoc", performance.now() - redocParseT); // 1. check for OpenAPI 3 or greater const openapiVersion = Number.parseFloat(document.parsed.openapi); if ( - document.parsed.swagger || + (document.parsed as any).swagger || !document.parsed.openapi || Number.isNaN(openapiVersion) || openapiVersion < 3 || openapiVersion >= 4 ) { - if (document.parsed.swagger) { + if ((document.parsed as any).swagger) { throw new Error("Unsupported Swagger version: 2.x. Use OpenAPI 3.x instead."); } if (document.parsed.openapi || openapiVersion < 3 || openapiVersion >= 4) { @@ -144,7 +144,7 @@ export async function validateAndBundle( const redocLintT = performance.now(); const problems = await lintDocument({ document, - config: options.redoc.styleguide, + config: options.redoc, externalRefResolver: resolver, }); _processProblems(problems, options); @@ -160,5 +160,5 @@ export async function validateAndBundle( _processProblems(bundled.problems, options); debug("Bundled schema", "bundle", performance.now() - redocBundleT); - return bundled.bundle.parsed; + return bundled.bundle.parsed as OpenAPI3; } diff --git a/packages/openapi-typescript/src/lib/redocly.ts b/packages/openapi-typescript/src/lib/redocly.ts new file mode 100644 index 000000000..cb05edb84 --- /dev/null +++ b/packages/openapi-typescript/src/lib/redocly.ts @@ -0,0 +1,33 @@ +// Copyright 2019 Redocly Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +export type Falsy = undefined | null | false | '' | 0; + +export function isTruthy(value: Truthy | Falsy): value is Truthy { + return !!value; +} + +export function parseRef(ref: string): { uri: string | null; pointer: string[] } { + const [uri, pointer = ''] = ref.split('#/'); + return { + uri: (uri.endsWith('#') ? uri.slice(0, -1) : uri) || null, + pointer: parsePointer(pointer), + }; +} + +export function parsePointer(pointer: string) { + return pointer.split('/').map(unescapePointer).filter(isTruthy); +} + +export function unescapePointer(fragment: string): string { + return decodeURIComponent(fragment.replace(/~1/g, '/').replace(/~0/g, '~')); +} + +export function escapePointer(fragment: T): T { + if (typeof fragment === 'number') return fragment; + return (fragment as string).replace(/~/g, '~0').replace(/\//g, '~1') as T; +} diff --git a/packages/openapi-typescript/src/lib/ts.ts b/packages/openapi-typescript/src/lib/ts.ts index a113c8ccb..361a0184b 100644 --- a/packages/openapi-typescript/src/lib/ts.ts +++ b/packages/openapi-typescript/src/lib/ts.ts @@ -1,7 +1,7 @@ import type { OasRef, Referenced } from "@redocly/openapi-core"; -import { parseRef } from "@redocly/openapi-core/lib/ref-utils.js"; import ts, { type LiteralTypeNode, type TypeLiteralNode } from "typescript"; import type { ParameterObject } from "../types.js"; +import { parseRef } from "./redocly.js"; export const JS_PROPERTY_INDEX_RE = /^[A-Za-z_$][A-Za-z_$0-9]*$/; export const JS_ENUM_INVALID_CHARS_RE = /[^A-Za-z_$0-9]+(.)?/g; diff --git a/packages/openapi-typescript/src/lib/utils.ts b/packages/openapi-typescript/src/lib/utils.ts index 49c192422..4e6a769d6 100644 --- a/packages/openapi-typescript/src/lib/utils.ts +++ b/packages/openapi-typescript/src/lib/utils.ts @@ -1,7 +1,7 @@ -import { escapePointer, parseRef } from "@redocly/openapi-core/lib/ref-utils.js"; import c from "ansi-colors"; import supportsColor from "supports-color"; import ts from "typescript"; +import { escapePointer, parseRef } from "../lib/redocly.js"; import type { DiscriminatorObject, OpenAPI3, OpenAPITSOptions, ReferenceObject, SchemaObject } from "../types.js"; import { tsLiteral, tsModifiers, tsPropertyIndex } from "./ts.js"; diff --git a/packages/openapi-typescript/src/transform/header-object.ts b/packages/openapi-typescript/src/transform/header-object.ts index cb3654e5b..d1c35d378 100644 --- a/packages/openapi-typescript/src/transform/header-object.ts +++ b/packages/openapi-typescript/src/transform/header-object.ts @@ -1,5 +1,5 @@ -import { escapePointer } from "@redocly/openapi-core/lib/ref-utils.js"; import ts from "typescript"; +import { escapePointer } from "../lib/redocly.js"; import { addJSDocComment, tsModifiers, tsPropertyIndex, UNKNOWN } from "../lib/ts.js"; import { getEntries } from "../lib/utils.js"; import type { HeaderObject, TransformNodeOptions } from "../types.js"; diff --git a/packages/openapi-typescript/src/transform/schema-object.ts b/packages/openapi-typescript/src/transform/schema-object.ts index 02a1114c4..bf02f0f56 100644 --- a/packages/openapi-typescript/src/transform/schema-object.ts +++ b/packages/openapi-typescript/src/transform/schema-object.ts @@ -1,5 +1,5 @@ -import { parseRef } from "@redocly/openapi-core/lib/ref-utils.js"; import ts from "typescript"; +import { parseRef } from "../lib/redocly.js"; import { addJSDocComment, BOOLEAN, diff --git a/packages/openapi-typescript/test/test-helpers.ts b/packages/openapi-typescript/test/test-helpers.ts index 72e44fccc..1d23deaa5 100644 --- a/packages/openapi-typescript/test/test-helpers.ts +++ b/packages/openapi-typescript/test/test-helpers.ts @@ -1,4 +1,5 @@ import { createConfig } from "@redocly/openapi-core"; +import { REDOCLY_MINIMAL_CONFIG } from "../src/index.js"; import { resolveRef } from "../src/lib/utils.js"; import type { GlobalContext, TransformNodeOptions } from "../src/types.js"; @@ -25,7 +26,7 @@ export const DEFAULT_CTX: GlobalContext = { propertiesRequiredByDefault: false, rootTypes: false, rootTypesNoSchemaPrefix: false, - redoc: await createConfig({}, { extends: ["minimal"] }), + redoc: await createConfig(REDOCLY_MINIMAL_CONFIG), resolve($ref) { return resolveRef({}, $ref, { silent: false }); }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72f848891..e30dc9745 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -275,8 +275,11 @@ importers: packages/openapi-typescript: dependencies: '@redocly/openapi-core': - specifier: ^1.34.5 - version: 1.34.5(supports-color@10.2.2) + specifier: ^2.1.2 + version: 2.1.2(ajv@8.17.1) + ajv: + specifier: ^8.17.1 + version: 8.17.1 ansi-colors: specifier: ^4.1.3 version: 4.1.3 @@ -1192,6 +1195,14 @@ packages: '@types/node': optional: true + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1326,12 +1337,12 @@ packages: '@redocly/ajv@8.11.3': resolution: {integrity: sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ==} - '@redocly/config@0.22.2': - resolution: {integrity: sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==} + '@redocly/config@0.30.0': + resolution: {integrity: sha512-zaXI6ZBCxBkssKR1CAXJonEbgT1c2gJg6IVN6iSwudlgCb5mc5xzsmsf+CJIEX5Ky88e3aPsvkcmSDW3ls2rYg==} - '@redocly/openapi-core@1.34.5': - resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==} - engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@redocly/openapi-core@2.1.2': + resolution: {integrity: sha512-Ee+u0N9s2gIAIrHnRaTj6p7K/DTDkFj0LYHY0SVm/+o+O/F+hsnoXHL1BuS/rLHuB17PxkbUkwDk6Yjj2c/E7Q==} + engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} '@rolldown/pluginutils@1.0.0-beta.34': resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} @@ -2026,9 +2037,16 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} algoliasearch@5.37.0: resolution: {integrity: sha512-y7gau/ZOQDqoInTQp0IwTOjkrHc4Aq4R8JgpmCleFwiLl+PbN2DMWoDUWZnrK8AhNJwT++dn28Bt4NZYNLAmuA==} @@ -2678,6 +2696,9 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2897,10 +2918,6 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true @@ -3080,6 +3097,10 @@ packages: engines: {node: '>=6'} hasBin: true + json-schema-to-ts@2.7.2: + resolution: {integrity: sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==} + engines: {node: '>=16'} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -3363,9 +3384,9 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} @@ -4389,6 +4410,9 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ts-algebra@1.2.2: + resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -5636,6 +5660,12 @@ snapshots: optionalDependencies: '@types/node': 22.18.3 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5766,21 +5796,23 @@ snapshots: require-from-string: 2.0.2 uri-js-replace: 1.0.1 - '@redocly/config@0.22.2': {} + '@redocly/config@0.30.0': + dependencies: + json-schema-to-ts: 2.7.2 - '@redocly/openapi-core@1.34.5(supports-color@10.2.2)': + '@redocly/openapi-core@2.1.2(ajv@8.17.1)': dependencies: '@redocly/ajv': 8.11.3 - '@redocly/config': 0.22.2 + '@redocly/config': 0.30.0 + ajv-formats: 2.1.1(ajv@8.17.1) colorette: 1.4.0 - https-proxy-agent: 7.0.6(supports-color@10.2.2) js-levenshtein: 1.1.6 js-yaml: 4.1.0 - minimatch: 5.1.6 + minimatch: 10.0.3 pluralize: 8.0.0 yaml-ast-parser: 0.0.43 transitivePeerDependencies: - - supports-color + - ajv '@rolldown/pluginutils@1.0.0-beta.34': {} @@ -6528,7 +6560,16 @@ snapshots: - supports-color optional: true - agent-base@7.1.4: {} + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 algoliasearch@5.37.0: dependencies: @@ -7241,6 +7282,8 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-uri@3.1.0: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -7492,13 +7535,6 @@ snapshots: - supports-color optional: true - https-proxy-agent@7.0.6(supports-color@10.2.2): - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - human-id@4.1.1: {} human-signals@5.0.0: {} @@ -7663,6 +7699,12 @@ snapshots: jsesc@3.1.0: {} + json-schema-to-ts@2.7.2: + dependencies: + '@babel/runtime': 7.28.4 + '@types/json-schema': 7.0.15 + ts-algebra: 1.2.2 + json-schema-traverse@1.0.0: {} json5@2.2.3: {} @@ -8081,9 +8123,9 @@ snapshots: mimic-function@5.0.1: {} - minimatch@5.1.6: + minimatch@10.0.3: dependencies: - brace-expansion: 2.0.2 + '@isaacs/brace-expansion': 5.0.0 minimatch@9.0.5: dependencies: @@ -9145,6 +9187,8 @@ snapshots: trim-lines@3.0.1: {} + ts-algebra@1.2.2: {} + tslib@2.8.1: {} turbo-darwin-64@2.5.6: