diff --git a/bin/cli.js b/bin/cli.js index e07ff7b33d0b867c9a4719c1e2d98b0a88c66c58..31be6e7958e2ce66d79d9926181696c1895cb2c8 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -4,6 +4,7 @@ import fs from "node:fs"; import path from "node:path"; import { performance } from "node:perf_hooks"; import { createConfig, findConfig, loadConfig } from "@redocly/openapi-core"; +import { kebabCase } from "scule"; import parser from "yargs-parser"; import openapiTS, { astToString, COMMENT_HEADER, c, error, formatTime, warn } from "../dist/index.mjs"; @@ -31,8 +32,8 @@ Options --path-params-as-types Convert paths to template literal types --alphabetize Sort object keys alphabetically --exclude-deprecated Exclude deprecated types - --root-types (optional) Export schemas types at root level - --root-types-no-schema-prefix (optional) + --root-types Export schemas types at root level + --root-types-no-schema-prefix Do not add "Schema" prefix to types at the root level (should only be used with --root-types) --root-types-keep-casing Keep casing of root types (should only be used with --root-types) --make-paths-enum Generate ApiPaths enum for all paths @@ -71,32 +72,34 @@ if (args.includes("--root-types-keep-casing") && !args.includes("--root-types")) console.warn("--root-types-keep-casing has no effect without --root-types flag"); } +const BOOLEAN_FLAGS = [ + "additionalProperties", + "alphabetize", + "arrayLength", + "check", + "conditionalEnums", + "contentNever", + "dedupeEnums", + "defaultNonNullable", + "emptyObjectsUnknown", + "enum", + "enumValues", + "excludeDeprecated", + "exportType", + "generatePathParams", + "help", + "immutable", + "makePathsEnum", + "pathParamsAsTypes", + "propertiesRequiredByDefault", + "readWriteMarkers", + "rootTypes", + "rootTypesKeepCasing", + "rootTypesNoSchemaPrefix", +]; + const flags = parser(args, { - boolean: [ - "additionalProperties", - "alphabetize", - "arrayLength", - "contentNever", - "defaultNonNullable", - "propertiesRequiredByDefault", - "emptyObjectsUnknown", - "enum", - "enumValues", - "conditionalEnums", - "dedupeEnums", - "check", - "excludeDeprecated", - "exportType", - "help", - "immutable", - "pathParamsAsTypes", - "rootTypes", - "rootTypesNoSchemaPrefix", - "rootTypesKeepCasing", - "makePathsEnum", - "generatePathParams", - "readWriteMarkers", - ], + boolean: BOOLEAN_FLAGS, string: ["output", "redocly"], alias: { redocly: ["c"], @@ -136,36 +139,10 @@ function checkStaleOutput(current, outputPath) { /** * @param {string | URL} schema - * @param {@type import('@redocly/openapi-core').Config} redocly + * @param {@type import('@redocly/openapi-core').Config} config */ -async function generateSchema(schema, { redocly, silent = false }) { - return `${COMMENT_HEADER}${astToString( - await openapiTS(schema, { - additionalProperties: flags.additionalProperties, - alphabetize: flags.alphabetize, - arrayLength: flags.arrayLength, - contentNever: flags.contentNever, - propertiesRequiredByDefault: flags.propertiesRequiredByDefault, - defaultNonNullable: flags.defaultNonNullable, - emptyObjectsUnknown: flags.emptyObjectsUnknown, - enum: flags.enum, - enumValues: flags.enumValues, - conditionalEnums: flags.conditionalEnums, - dedupeEnums: flags.dedupeEnums, - excludeDeprecated: flags.excludeDeprecated, - exportType: flags.exportType, - immutable: flags.immutable, - pathParamsAsTypes: flags.pathParamsAsTypes, - rootTypes: flags.rootTypes, - rootTypesNoSchemaPrefix: flags.rootTypesNoSchemaPrefix, - rootTypesKeepCasing: flags.rootTypesKeepCasing, - makePathsEnum: flags.makePathsEnum, - generatePathParams: flags.generatePathParams, - readWriteMarkers: flags.readWriteMarkers, - redocly, - silent, - }), - )}`; +async function generateSchema(schema, config) { + return `${COMMENT_HEADER}${astToString(await openapiTS(schema, config))}`; } /** pretty-format error message but also throw */ @@ -230,6 +207,8 @@ async function main() { await Promise.all( Object.entries(redocly.apis).map(async ([name, api]) => { let configRoot = CWD; + + const config = { ...flags, redocly }; if (redocly.configFile) { // note: this will be absolute if --redoc is passed; otherwise, relative configRoot = path.isAbsolute(redocly.configFile) @@ -241,7 +220,18 @@ async function main() { `API ${name} is missing an \`${REDOC_CONFIG_KEY}.output\` key. See https://openapi-ts.dev/cli/#multiple-schemas.`, ); } - const result = await generateSchema(new URL(api.root, configRoot), { redocly }); + + if (api[REDOC_CONFIG_KEY]) { + for (const name of BOOLEAN_FLAGS) { + if (typeof api[REDOC_CONFIG_KEY][name] === "boolean") { + config[name] = api[REDOC_CONFIG_KEY][name]; + } else if (typeof api[REDOC_CONFIG_KEY][kebabCase(name)] === "boolean") { + config[name] = api[REDOC_CONFIG_KEY][kebabCase(name)]; + } + } + } + const result = await generateSchema(new URL(api.root, configRoot), config); + const outFile = new URL(api[REDOC_CONFIG_KEY].output, configRoot); checkStaleOutput(result, outFile); fs.mkdirSync(new URL(".", outFile), { recursive: true }); @@ -254,6 +244,7 @@ async function main() { // handle stdin else if (!input) { const result = await generateSchema(process.stdin, { + ...flags, redocly, silent: outputType === OUTPUT_STDOUT, }); @@ -278,6 +269,7 @@ async function main() { ); } const result = await generateSchema(new URL(input, CWD), { + ...flags, redocly, silent: outputType === OUTPUT_STDOUT, }); diff --git a/dist/index.d.cts b/dist/index.d.cts index be9d8f0f771cbe5e77dd36e5b90c952800e12060..a038dd93ee68e5cd291f22ca7ef2cd2e45c105db 100644 --- a/dist/index.d.cts +++ b/dist/index.d.cts @@ -206,6 +206,7 @@ type SchemaObject = { const?: unknown; default?: unknown; format?: string; + additionalProperties?: boolean | Record | SchemaObject | ReferenceObject; nullable?: boolean; oneOf?: (SchemaObject | ReferenceObject)[]; allOf?: (SchemaObject | ReferenceObject)[]; diff --git a/dist/index.d.mts b/dist/index.d.mts index 2af2cee65dfe6973f592e6e9dc3399de1a641cbf..6729248654aaedf683747a9f98a3829d38266c4a 100644 --- a/dist/index.d.mts +++ b/dist/index.d.mts @@ -206,6 +206,7 @@ type SchemaObject = { const?: unknown; default?: unknown; format?: string; + additionalProperties?: boolean | Record | SchemaObject | ReferenceObject; nullable?: boolean; oneOf?: (SchemaObject | ReferenceObject)[]; allOf?: (SchemaObject | ReferenceObject)[]; diff --git a/dist/index.d.ts b/dist/index.d.ts index be9d8f0f771cbe5e77dd36e5b90c952800e12060..a038dd93ee68e5cd291f22ca7ef2cd2e45c105db 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -206,6 +206,7 @@ type SchemaObject = { const?: unknown; default?: unknown; format?: string; + additionalProperties?: boolean | Record | SchemaObject | ReferenceObject; nullable?: boolean; oneOf?: (SchemaObject | ReferenceObject)[]; allOf?: (SchemaObject | ReferenceObject)[]; diff --git a/dist/transform/schema-object.cjs b/dist/transform/schema-object.cjs index 7142e84a60d4856d42179e8d6dc80ec78ea6e881..a246e622559f6599e4bb5f23a8ff306e8dc7c9a8 100644 --- a/dist/transform/schema-object.cjs +++ b/dist/transform/schema-object.cjs @@ -39,80 +39,84 @@ function transformSchemaObjectWithComposition(schemaObject, options, fromAdditio if (schemaObject.const !== null && schemaObject.const !== void 0) { return ts.tsLiteral(schemaObject.const); } - if (Array.isArray(schemaObject.enum) && (!("type" in schemaObject) || schemaObject.type !== "object") && !("properties" in schemaObject) && !("additionalProperties" in schemaObject)) { - if (shouldTransformToTsEnum(options, schemaObject)) { - let enumName = refUtils_js.parseRef(options.path ?? "").pointer.join("/"); - enumName = enumName.replace("components/schemas", ""); - const metadata = schemaObject.enum.map((_, i) => ({ - name: schemaObject["x-enum-varnames"]?.[i] ?? schemaObject["x-enumNames"]?.[i], - description: schemaObject["x-enum-descriptions"]?.[i] ?? schemaObject["x-enumDescriptions"]?.[i] - })); - let hasNull = false; - const validSchemaEnums = schemaObject.enum.filter((enumValue) => { - if (enumValue === null) { - hasNull = true; - return false; + if (Array.isArray(schemaObject.enum) && (!("type" in schemaObject) || schemaObject.type !== "object") && !("properties" in schemaObject)) { + const hasAdditionalProperties = "additionalProperties" in schemaObject && !!schemaObject.additionalProperties; + if (!hasAdditionalProperties || schemaObject.type === "string" && hasAdditionalProperties) { + if (shouldTransformToTsEnum(options, schemaObject)) { + let enumName = refUtils_js.parseRef(options.path ?? "").pointer.join("/"); + enumName = enumName.replace("components/schemas", ""); + const metadata = schemaObject.enum.map((_, i) => ({ + name: schemaObject["x-enum-varnames"]?.[i] ?? schemaObject["x-enumNames"]?.[i], + description: schemaObject["x-enum-descriptions"]?.[i] ?? schemaObject["x-enumDescriptions"]?.[i] + })); + let hasNull = false; + const validSchemaEnums = schemaObject.enum.filter((enumValue) => { + if (enumValue === null) { + hasNull = true; + return false; + } + return true; + }); + const enumType2 = ts.tsEnum(enumName, validSchemaEnums, metadata, { + shouldCache: options.ctx.dedupeEnums, + export: true + // readonly: TS enum do not support the readonly modifier + }); + if (!options.ctx.injectFooter.includes(enumType2)) { + options.ctx.injectFooter.push(enumType2); } - return true; - }); - const enumType2 = ts.tsEnum(enumName, validSchemaEnums, metadata, { - shouldCache: options.ctx.dedupeEnums, - export: true - // readonly: TS enum do not support the readonly modifier - }); - if (!options.ctx.injectFooter.includes(enumType2)) { - options.ctx.injectFooter.push(enumType2); + const ref = ts__default.factory.createTypeReferenceNode(enumType2.name); + const finalType2 = hasNull ? ts.tsUnion([ref, ts.NULL]) : ref; + return applyAdditionalPropertiesToEnum(hasAdditionalProperties, finalType2, schemaObject); } - const ref = ts__default.factory.createTypeReferenceNode(enumType2.name); - return hasNull ? ts.tsUnion([ref, ts.NULL]) : ref; - } - const enumType = schemaObject.enum.map(ts.tsLiteral); - if (Array.isArray(schemaObject.type) && schemaObject.type.includes("null") || schemaObject.nullable) { - enumType.push(ts.NULL); - } - const unionType = ts.tsUnion(enumType); - if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { - const parsed = refUtils_js.parseRef(options.path ?? ""); - let enumValuesVariableName = parsed.pointer.join("/"); - enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); - enumValuesVariableName = `${enumValuesVariableName}Values`; - const cleanedPointer = []; - const extractProperties = []; - for (let i = 0; i < parsed.pointer.length; i++) { - const segment = parsed.pointer[i]; - if ((segment === "anyOf" || segment === "oneOf") && i < parsed.pointer.length - 1) { - const next = parsed.pointer[i + 1]; - if (/^\d+$/.test(next)) { - i++; - const remainingSegments = parsed.pointer.slice(i + 1); - for (const seg of remainingSegments) { - if (seg !== "anyOf" && seg !== "oneOf" && !/^\d+$/.test(seg)) { - extractProperties.push(seg); + const enumType = schemaObject.enum.map(ts.tsLiteral); + if (Array.isArray(schemaObject.type) && schemaObject.type.includes("null") || schemaObject.nullable) { + enumType.push(ts.NULL); + } + const unionType = applyAdditionalPropertiesToEnum(hasAdditionalProperties, ts.tsUnion(enumType), schemaObject); + if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { + const parsed = refUtils_js.parseRef(options.path ?? ""); + let enumValuesVariableName = parsed.pointer.join("/"); + enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); + enumValuesVariableName = `${enumValuesVariableName}Values`; + const cleanedPointer = []; + const extractProperties = []; + for (let i = 0; i < parsed.pointer.length; i++) { + const segment = parsed.pointer[i]; + if ((segment === "anyOf" || segment === "oneOf") && i < parsed.pointer.length - 1) { + const next = parsed.pointer[i + 1]; + if (/^\d+$/.test(next)) { + i++; + const remainingSegments = parsed.pointer.slice(i + 1); + for (const seg of remainingSegments) { + if (seg !== "anyOf" && seg !== "oneOf" && !/^\d+$/.test(seg)) { + extractProperties.push(seg); + } } + continue; } - continue; } + cleanedPointer.push(segment); } - cleanedPointer.push(segment); + const cleanedRefPath = utils.createRef(cleanedPointer); + const enumValuesArray = ts.tsArrayLiteralExpression( + enumValuesVariableName, + // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type + fromAdditionalProperties ? ts__default.factory.createIndexedAccessTypeNode( + ts.oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), + ts__default.factory.createTypeReferenceNode(ts__default.factory.createIdentifier("string")) + ) : ts.oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), + schemaObject.enum, + { + export: true, + readonly: true, + injectFooter: options.ctx.injectFooter + } + ); + options.ctx.injectFooter.push(enumValuesArray); } - const cleanedRefPath = utils.createRef(cleanedPointer); - const enumValuesArray = ts.tsArrayLiteralExpression( - enumValuesVariableName, - // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type - fromAdditionalProperties ? ts__default.factory.createIndexedAccessTypeNode( - ts.oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), - ts__default.factory.createTypeReferenceNode(ts__default.factory.createIdentifier("string")) - ) : ts.oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), - schemaObject.enum, - { - export: true, - readonly: true, - injectFooter: options.ctx.injectFooter - } - ); - options.ctx.injectFooter.push(enumValuesArray); + return unionType; } - return unionType; } function collectUnionCompositions(items, unionKey) { const output = []; @@ -148,12 +152,7 @@ function transformSchemaObjectWithComposition(schemaObject, options, fromAdditio } itemType = transformSchemaObject({ ...item, required: itemRequired }, options); } - const discriminator = "$ref" in item && options.ctx.discriminators.objects[item.$ref] || item.discriminator; - if (discriminator) { - output.push(ts.tsOmit(itemType, [discriminator.propertyName])); - } else { - output.push(itemType); - } + output.push(itemType); } return output; } @@ -322,7 +321,7 @@ function transformSchemaObjectCore(schemaObject, options) { } } if ("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length || "additionalProperties" in schemaObject && schemaObject.additionalProperties || "patternProperties" in schemaObject && schemaObject.patternProperties || "$defs" in schemaObject && schemaObject.$defs) { - if (Object.keys(schemaObject.properties ?? {}).length) { + if ("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject?.properties).length) { for (const [k, v] of utils.getEntries(schemaObject.properties ?? {}, options.ctx)) { if (typeof v !== "object" && typeof v !== "boolean" || Array.isArray(v)) { throw new Error( @@ -383,7 +382,7 @@ function transformSchemaObjectCore(schemaObject, options) { coreObjectType.push(property); } } - if (schemaObject.$defs && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { + if ("$defs" in schemaObject && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { const defKeys = []; for (const [k, v] of Object.entries(schemaObject.$defs)) { const defReadOnly = "readOnly" in v && !!v.readOnly; @@ -433,7 +432,8 @@ function transformSchemaObjectCore(schemaObject, options) { } const hasExplicitAdditionalProperties = typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length; const hasImplicitAdditionalProperties = schemaObject.additionalProperties === true || typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length === 0; - const hasExplicitPatternProperties = typeof schemaObject.patternProperties === "object" && Object.keys(schemaObject.patternProperties).length; + const patternProperties = hasKey(schemaObject, "patternProperties") ? schemaObject.patternProperties : void 0; + const hasExplicitPatternProperties = typeof patternProperties === "object" && patternProperties !== null && Object.keys(patternProperties).length > 0; const stringIndexTypes = []; if (hasExplicitAdditionalProperties) { stringIndexTypes.push(transformSchemaObject(schemaObject.additionalProperties, options, true)); @@ -441,8 +441,11 @@ function transformSchemaObjectCore(schemaObject, options) { if (hasImplicitAdditionalProperties || !schemaObject.additionalProperties && options.ctx.additionalProperties) { stringIndexTypes.push(ts.UNKNOWN); } - if (hasExplicitPatternProperties) { - for (const [_, v] of utils.getEntries(schemaObject.patternProperties ?? {}, options.ctx)) { + if (hasExplicitPatternProperties && patternProperties && typeof patternProperties === "object") { + for (const [_, v] of utils.getEntries( + patternProperties, + options.ctx + )) { stringIndexTypes.push(transformSchemaObject(v, options)); } } @@ -484,6 +487,13 @@ function transformSchemaObjectCore(schemaObject, options) { function hasKey(possibleObject, key) { return typeof possibleObject === "object" && possibleObject !== null && key in possibleObject; } +function applyAdditionalPropertiesToEnum(hasAdditionalProperties, unionType, schemaObject) { + if (hasAdditionalProperties && schemaObject.type === "string") { + const stringAndEmptyObject = ts.tsIntersection([ts.STRING, ts__default.factory.createTypeLiteralNode([])]); + return ts.tsUnion([unionType, stringAndEmptyObject]); + } + return unionType; +} function wrapWithReadWriteMarker(type, readOnly, writeOnly, ctx) { if (!ctx.readWriteMarkers || readOnly && writeOnly) { return type; diff --git a/dist/transform/schema-object.cjs.map b/dist/transform/schema-object.cjs.map index 4039111f61f3fc47e1e7c6ed894a09e86490ba9c..27bf29dc83d8f29bad013bcf15a04c4458ed85cd 100644 --- a/dist/transform/schema-object.cjs.map +++ b/dist/transform/schema-object.cjs.map @@ -1 +1 @@ -{"version":3,"file":"schema-object.cjs","sources":["../../src/transform/schema-object.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport ts from \"typescript\";\nimport {\n addJSDocComment,\n BOOLEAN,\n NEVER,\n NULL,\n NUMBER,\n oapiRef,\n QUESTION_TOKEN,\n STRING,\n tsArrayLiteralExpression,\n tsEnum,\n tsIntersection,\n tsIsPrimitive,\n tsLiteral,\n tsModifiers,\n tsNullable,\n tsOmit,\n tsPropertyIndex,\n tsRecord,\n tsUnion,\n tsWithRequired,\n UNDEFINED,\n UNKNOWN,\n} from \"../lib/ts.js\";\nimport { createDiscriminatorProperty, createRef, getEntries } from \"../lib/utils.js\";\nimport type { ReferenceObject, SchemaObject, TransformNodeOptions } from \"../types.js\";\n\n/**\n * Transform SchemaObject nodes (4.8.24)\n * @see https://spec.openapis.org/oas/v3.1.0#schema-object\n */\nexport default function transformSchemaObject(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n const type = transformSchemaObjectWithComposition(schemaObject, options, fromAdditionalProperties);\n if (typeof options.ctx.postTransform === \"function\") {\n const postTransformResult = options.ctx.postTransform(type, options);\n if (postTransformResult) {\n return postTransformResult;\n }\n }\n return type;\n}\n\n/**\n * Transform SchemaObjects\n */\nexport function transformSchemaObjectWithComposition(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n /**\n * Unexpected types & edge cases\n */\n\n // missing/falsy type returns `never`\n if (!schemaObject) {\n return NEVER;\n }\n // `true` returns `unknown` (this exists, but is untyped)\n if ((schemaObject as unknown) === true) {\n return UNKNOWN;\n }\n // for any other unexpected type, throw error\n if (Array.isArray(schemaObject) || typeof schemaObject !== \"object\") {\n throw new Error(\n `Expected SchemaObject, received ${Array.isArray(schemaObject) ? \"Array\" : typeof schemaObject} at ${options.path}`,\n );\n }\n\n /**\n * ReferenceObject\n */\n if (\"$ref\" in schemaObject) {\n return oapiRef(schemaObject.$ref);\n }\n\n /**\n * const (valid for any type)\n */\n if (schemaObject.const !== null && schemaObject.const !== undefined) {\n return tsLiteral(schemaObject.const);\n }\n\n /**\n * enum (non-objects)\n * note: enum is valid for any type, but for objects, handle in oneOf below\n */\n if (\n Array.isArray(schemaObject.enum) &&\n (!(\"type\" in schemaObject) || schemaObject.type !== \"object\") &&\n !(\"properties\" in schemaObject) &&\n !(\"additionalProperties\" in schemaObject)\n ) {\n // hoist enum to top level if string/number enum and option is enabled\n if (shouldTransformToTsEnum(options, schemaObject)) {\n let enumName = parseRef(options.path ?? \"\").pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumName = enumName.replace(\"components/schemas\", \"\");\n const metadata = schemaObject.enum.map((_, i) => ({\n name: schemaObject[\"x-enum-varnames\"]?.[i] ?? schemaObject[\"x-enumNames\"]?.[i],\n description: schemaObject[\"x-enum-descriptions\"]?.[i] ?? schemaObject[\"x-enumDescriptions\"]?.[i],\n }));\n\n // enums can contain null values, but dont want to output them\n let hasNull = false;\n const validSchemaEnums = schemaObject.enum.filter((enumValue) => {\n if (enumValue === null) {\n hasNull = true;\n return false;\n }\n\n return true;\n });\n const enumType = tsEnum(enumName, validSchemaEnums as (string | number)[], metadata, {\n shouldCache: options.ctx.dedupeEnums,\n export: true,\n // readonly: TS enum do not support the readonly modifier\n });\n if (!options.ctx.injectFooter.includes(enumType)) {\n options.ctx.injectFooter.push(enumType);\n }\n const ref = ts.factory.createTypeReferenceNode(enumType.name);\n return hasNull ? tsUnion([ref, NULL]) : ref;\n }\n const enumType = schemaObject.enum.map(tsLiteral);\n if ((Array.isArray(schemaObject.type) && schemaObject.type.includes(\"null\")) || schemaObject.nullable) {\n enumType.push(NULL);\n }\n\n const unionType = tsUnion(enumType);\n\n // hoist array with valid enum values to top level if string/number enum and option is enabled\n if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === \"string\" || typeof v === \"number\")) {\n const parsed = parseRef(options.path ?? \"\");\n let enumValuesVariableName = parsed.pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumValuesVariableName = enumValuesVariableName.replace(\"components/schemas\", \"\");\n enumValuesVariableName = `${enumValuesVariableName}Values`;\n\n // build a ref path for the type that ignores union indices (anyOf/oneOf) so\n // type references remain stable even when names include union positions\n const cleanedPointer: string[] = [];\n // Track ALL properties after a oneOf/anyOf that need Extract<> narrowing.\n // We apply Extract<> before EVERY property access after a union index because:\n // - When the property exists on ALL variants, Extract<> is a no-op (returns same type)\n // - When the property only exists on SOME variants, it correctly narrows the union\n // - When both variants have same property name but different inner schemas,\n // we still narrow at each level to handle nested unions correctly\n // This robust approach handles both simple and complex union structures.\n const extractProperties: string[] = [];\n for (let i = 0; i < parsed.pointer.length; i++) {\n // Example: #/paths/analytics/data/get/responses/400/content/application/json/anyOf/0/message\n const segment = parsed.pointer[i];\n if ((segment === \"anyOf\" || segment === \"oneOf\") && i < parsed.pointer.length - 1) {\n const next = parsed.pointer[i + 1];\n if (/^\\d+$/.test(next)) {\n // If we encounter something like \"anyOf/0\", we want to skip that part of the path\n i++;\n // Collect ALL remaining segments after the union index.\n // Each one will be wrapped with Extract<> to safely narrow the type\n // at each level, handling both top-level and nested union variants.\n const remainingSegments = parsed.pointer.slice(i + 1);\n for (const seg of remainingSegments) {\n // Skip union keywords and indices, only add actual property names\n if (seg !== \"anyOf\" && seg !== \"oneOf\" && !/^\\d+$/.test(seg)) {\n extractProperties.push(seg);\n }\n }\n continue;\n }\n }\n cleanedPointer.push(segment);\n }\n const cleanedRefPath = createRef(cleanedPointer);\n\n const enumValuesArray = tsArrayLiteralExpression(\n enumValuesVariableName,\n // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type\n fromAdditionalProperties\n ? ts.factory.createIndexedAccessTypeNode(\n oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"string\")),\n )\n : oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n schemaObject.enum as (string | number)[],\n {\n export: true,\n readonly: true,\n injectFooter: options.ctx.injectFooter,\n },\n );\n\n options.ctx.injectFooter.push(enumValuesArray);\n }\n\n return unionType;\n }\n\n /**\n * Object + composition (anyOf/allOf/oneOf) types\n */\n\n /** Collect oneOf/anyOf */\n function collectUnionCompositions(items: (SchemaObject | ReferenceObject)[], unionKey: \"anyOf\" | \"oneOf\") {\n const output: ts.TypeNode[] = [];\n for (const [index, item] of items.entries()) {\n output.push(\n transformSchemaObject(item, {\n ...options,\n // include index in path so generated names from nested enums/enumValues are unique\n path: createRef([options.path, unionKey, String(index)]),\n }),\n );\n }\n\n return output;\n }\n\n /** Collect allOf with Omit<> for discriminators */\n function collectAllOfCompositions(items: (SchemaObject | ReferenceObject)[], required?: string[]): ts.TypeNode[] {\n const output: ts.TypeNode[] = [];\n for (const item of items) {\n let itemType: ts.TypeNode;\n // if this is a $ref, use WithRequired if parent specifies required properties\n // (but only for valid keys)\n if (\"$ref\" in item) {\n itemType = transformSchemaObject(item, options);\n\n const resolved = options.ctx.resolve(item.$ref);\n\n // make keys required, if necessary\n if (\n resolved &&\n typeof resolved === \"object\" &&\n \"properties\" in resolved &&\n // we have already handled this item (discriminator property was already added as required)\n !options.ctx.discriminators.refsHandled.includes(item.$ref)\n ) {\n // add WithRequired if necessary\n const validRequired = (required ?? []).filter((key) => !!resolved.properties?.[key]);\n if (validRequired.length) {\n itemType = tsWithRequired(itemType, validRequired, options.ctx.injectFooter);\n }\n }\n }\n // otherwise, if this is a schema object, combine parent `required[]` with its own, if any\n else {\n const itemRequired = [...(required ?? [])];\n if (typeof item === \"object\" && Array.isArray(item.required)) {\n itemRequired.push(...item.required);\n }\n itemType = transformSchemaObject({ ...item, required: itemRequired }, options);\n }\n\n const discriminator =\n (\"$ref\" in item && options.ctx.discriminators.objects[item.$ref]) || (item as any).discriminator;\n if (discriminator) {\n output.push(tsOmit(itemType, [discriminator.propertyName]));\n } else {\n output.push(itemType);\n }\n }\n return output;\n }\n\n // compile final type\n let finalType: ts.TypeNode | undefined;\n\n // core + allOf: intersect\n const coreObjectType = transformSchemaObjectCore(schemaObject, options);\n const allOfType = collectAllOfCompositions(schemaObject.allOf ?? [], schemaObject.required);\n if (coreObjectType || allOfType.length) {\n const allOf: ts.TypeNode | undefined = allOfType.length ? tsIntersection(allOfType) : undefined;\n finalType = tsIntersection([...(coreObjectType ? [coreObjectType] : []), ...(allOf ? [allOf] : [])]);\n }\n // anyOf: union\n // (note: this may seem counterintuitive, but as TypeScript’s unions are not true XORs, they mimic behavior closer to anyOf than oneOf)\n const anyOfType = collectUnionCompositions(schemaObject.anyOf ?? [], \"anyOf\");\n if (anyOfType.length) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...anyOfType]);\n }\n // oneOf: union (within intersection with other types, if any)\n const oneOfType = collectUnionCompositions(\n schemaObject.oneOf ||\n (\"type\" in schemaObject &&\n schemaObject.type === \"object\" &&\n (schemaObject.enum as (SchemaObject | ReferenceObject)[])) ||\n [],\n \"oneOf\",\n );\n if (oneOfType.length) {\n // note: oneOf is the only type that may include primitives\n if (oneOfType.every(tsIsPrimitive)) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...oneOfType]);\n } else {\n finalType = tsIntersection([...(finalType ? [finalType] : []), tsUnion(oneOfType)]);\n }\n }\n\n // When no final type can be generated, fall back to unknown type (or related variants)\n if (!finalType) {\n if (\"type\" in schemaObject) {\n finalType = tsRecord(STRING, options.ctx.emptyObjectsUnknown ? UNKNOWN : NEVER);\n } else {\n finalType = UNKNOWN;\n }\n }\n\n if (finalType !== UNKNOWN && schemaObject.nullable) {\n finalType = tsNullable([finalType]);\n }\n\n return finalType;\n}\n\n/**\n * Check if the given OAPI enum should be transformed to a TypeScript enum\n */\nfunction shouldTransformToTsEnum(options: TransformNodeOptions, schemaObject: SchemaObject): boolean {\n // Enum conversion not enabled or no enum present\n if (!options.ctx.enum || !schemaObject.enum) {\n return false;\n }\n\n // Enum must have string, number or null values\n if (!schemaObject.enum.every((v) => [\"string\", \"number\", null].includes(typeof v))) {\n return false;\n }\n\n // If conditionalEnums is enabled, only convert if x-enum-* metadata is present\n if (options.ctx.conditionalEnums) {\n const hasEnumMetadata =\n Array.isArray(schemaObject[\"x-enum-varnames\"]) ||\n Array.isArray(schemaObject[\"x-enumNames\"]) ||\n Array.isArray(schemaObject[\"x-enum-descriptions\"]) ||\n Array.isArray(schemaObject[\"x-enumDescriptions\"]);\n if (!hasEnumMetadata) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Handle SchemaObject minus composition (anyOf/allOf/oneOf)\n */\nfunction transformSchemaObjectCore(schemaObject: SchemaObject, options: TransformNodeOptions): ts.TypeNode | undefined {\n if (\"type\" in schemaObject && schemaObject.type) {\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(schemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n if (result.questionToken) {\n return ts.factory.createUnionTypeNode([result.schema, UNDEFINED]);\n } else {\n return result.schema;\n }\n } else {\n return result;\n }\n }\n }\n\n // primitives\n // type: null\n if (schemaObject.type === \"null\") {\n return NULL;\n }\n // type: string\n if (schemaObject.type === \"string\") {\n return STRING;\n }\n // type: number / type: integer\n if (schemaObject.type === \"number\" || schemaObject.type === \"integer\") {\n return NUMBER;\n }\n // type: boolean\n if (schemaObject.type === \"boolean\") {\n return BOOLEAN;\n }\n\n // type: array (with support for tuples)\n if (schemaObject.type === \"array\") {\n // default to `unknown[]`\n let itemType: ts.TypeNode = UNKNOWN;\n // tuple type\n if (schemaObject.prefixItems || Array.isArray(schemaObject.items)) {\n const prefixItems = schemaObject.prefixItems ?? (schemaObject.items as (SchemaObject | ReferenceObject)[]);\n itemType = ts.factory.createTupleTypeNode(prefixItems.map((item) => transformSchemaObject(item, options)));\n }\n // standard array type\n else if (schemaObject.items) {\n if (hasKey(schemaObject.items, \"type\") && schemaObject.items.type === \"array\") {\n itemType = ts.factory.createArrayTypeNode(transformSchemaObject(schemaObject.items, options));\n } else {\n itemType = transformSchemaObject(schemaObject.items, options);\n }\n }\n\n const min: number =\n typeof schemaObject.minItems === \"number\" && schemaObject.minItems >= 0 ? schemaObject.minItems : 0;\n const max: number | undefined =\n typeof schemaObject.maxItems === \"number\" && schemaObject.maxItems >= 0 && min <= schemaObject.maxItems\n ? schemaObject.maxItems\n : undefined;\n const estimateCodeSize = typeof max !== \"number\" ? min : (max * (max + 1) - min * (min - 1)) / 2;\n if (\n options.ctx.arrayLength &&\n (min !== 0 || max !== undefined) &&\n estimateCodeSize < 30 // \"30\" is an arbitrary number but roughly around when TS starts to struggle with tuple inference in practice\n ) {\n if (min === max) {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n return tsUnion([ts.factory.createTupleTypeNode(elements)]);\n } else if ((schemaObject.maxItems as number) > 0) {\n // if maxItems is set, then return a union of all permutations of possible tuple types\n const members: ts.TypeNode[] = [];\n // populate 1 short of min …\n for (let i = 0; i <= (max ?? 0) - min; i++) {\n const elements: ts.TypeNode[] = [];\n for (let j = min; j < i + min; j++) {\n elements.push(itemType);\n }\n members.push(ts.factory.createTupleTypeNode(elements));\n }\n return tsUnion(members);\n }\n // if maxItems not set, then return a simple tuple type the length of `min`\n else {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n elements.push(ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(itemType)));\n return ts.factory.createTupleTypeNode(elements);\n }\n }\n\n const finalType =\n ts.isTupleTypeNode(itemType) || ts.isArrayTypeNode(itemType)\n ? itemType\n : ts.factory.createArrayTypeNode(itemType); // wrap itemType in array type, but only if not a tuple or array already\n\n return options.ctx.immutable\n ? ts.factory.createTypeOperatorNode(ts.SyntaxKind.ReadonlyKeyword, finalType)\n : finalType;\n }\n\n // polymorphic, or 3.1 nullable\n if (Array.isArray(schemaObject.type) && !Array.isArray(schemaObject)) {\n // skip any primitive types that appear in oneOf as well\n const uniqueTypes: ts.TypeNode[] = [];\n if (Array.isArray(schemaObject.oneOf)) {\n for (const t of schemaObject.type) {\n if (\n (t === \"boolean\" || t === \"string\" || t === \"number\" || t === \"integer\" || t === \"null\") &&\n schemaObject.oneOf.find((o) => typeof o === \"object\" && \"type\" in o && o.type === t)\n ) {\n continue;\n }\n uniqueTypes.push(\n t === \"null\" || t === null\n ? NULL\n : transformSchemaObject(\n { ...schemaObject, type: t, oneOf: undefined } as SchemaObject, // don’t stack oneOf transforms\n options,\n ),\n );\n }\n } else {\n for (const t of schemaObject.type) {\n if (t === \"null\" || t === null) {\n uniqueTypes.push(NULL);\n } else {\n uniqueTypes.push(transformSchemaObject({ ...schemaObject, type: t } as SchemaObject, options));\n }\n }\n }\n return tsUnion(uniqueTypes);\n }\n }\n\n // type: object\n const coreObjectType: ts.TypeElement[] = [];\n\n // discriminators: explicit mapping on schema object\n for (const k of [\"allOf\", \"anyOf\"] as const) {\n if (!schemaObject[k]) {\n continue;\n }\n // for all magic inheritance, we will have already gathered it into\n // ctx.discriminators. But stop objects from referencing their own\n // discriminator meant for children (!schemaObject.discriminator)\n // and don't add discriminator properties if we already added/patched\n // them (options.ctx.discriminators.refsHandled.includes(options.path!).\n const discriminator =\n !schemaObject.discriminator &&\n !options.ctx.discriminators.refsHandled.includes(options.path ?? \"\") &&\n options.ctx.discriminators.objects[options.path ?? \"\"];\n if (discriminator) {\n coreObjectType.unshift(\n createDiscriminatorProperty(discriminator, {\n path: options.path ?? \"\",\n readonly: options.ctx.immutable,\n }),\n );\n break;\n }\n }\n\n if (\n (\"properties\" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) ||\n (\"additionalProperties\" in schemaObject && schemaObject.additionalProperties) ||\n (\"patternProperties\" in schemaObject && schemaObject.patternProperties) ||\n (\"$defs\" in schemaObject && schemaObject.$defs)\n ) {\n // properties\n if (Object.keys(schemaObject.properties ?? {}).length) {\n for (const [k, v] of getEntries(schemaObject.properties ?? {}, options.ctx)) {\n if ((typeof v !== \"object\" && typeof v !== \"boolean\") || Array.isArray(v)) {\n throw new Error(\n `${options.path}: invalid property ${k}. Expected Schema Object or boolean, got ${\n Array.isArray(v) ? \"Array\" : typeof v\n }`,\n );\n }\n\n const { $ref, readOnly, writeOnly, hasDefault } =\n typeof v === \"object\"\n ? {\n $ref: \"$ref\" in v && v.$ref,\n readOnly: \"readOnly\" in v && v.readOnly,\n writeOnly: \"writeOnly\" in v && v.writeOnly,\n hasDefault: \"default\" in v && v.default !== undefined,\n }\n : {};\n\n // handle excludeDeprecated option\n if (options.ctx.excludeDeprecated) {\n const resolved = $ref ? options.ctx.resolve($ref) : v;\n if ((resolved as SchemaObject)?.deprecated) {\n continue;\n }\n }\n let optional =\n schemaObject.required?.includes(k) ||\n (schemaObject.required === undefined && options.ctx.propertiesRequiredByDefault) ||\n (hasDefault &&\n options.ctx.defaultNonNullable &&\n !options.path?.includes(\"parameters\") &&\n !options.path?.includes(\"requestBody\") &&\n !options.path?.includes(\"requestBodies\")) // can’t be required, even with defaults\n ? undefined\n : QUESTION_TOKEN;\n let type = $ref\n ? oapiRef($ref)\n : transformSchemaObject(v, {\n ...options,\n path: createRef([options.path, k]),\n });\n\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(v as SchemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n type = result.schema;\n optional = result.questionToken ? QUESTION_TOKEN : optional;\n } else {\n type = result;\n }\n }\n }\n\n type = wrapWithReadWriteMarker(type, !!readOnly, !!writeOnly, options.ctx);\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && readOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ optional,\n /* type */ type,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n coreObjectType.push(property);\n }\n }\n\n // $defs\n if (schemaObject.$defs && typeof schemaObject.$defs === \"object\" && Object.keys(schemaObject.$defs).length) {\n const defKeys: ts.TypeElement[] = [];\n for (const [k, v] of Object.entries(schemaObject.$defs)) {\n const defReadOnly = \"readOnly\" in v && !!v.readOnly;\n const defWriteOnly = \"writeOnly\" in v && !!v.writeOnly;\n const defType = wrapWithReadWriteMarker(\n transformSchemaObject(v, { ...options, path: createRef([options.path, \"$defs\", k]) }),\n defReadOnly,\n defWriteOnly,\n options.ctx,\n );\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && defReadOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ undefined,\n /* type */ defType,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, \"$defs\", k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n defKeys.push(property);\n }\n coreObjectType.push(\n ts.factory.createPropertySignature(\n /* modifiers */ undefined,\n /* name */ tsPropertyIndex(\"$defs\"),\n /* questionToken */ undefined,\n /* type */ ts.factory.createTypeLiteralNode(defKeys),\n ),\n );\n }\n\n // additionalProperties / patternProperties\n const hasExplicitAdditionalProperties =\n typeof schemaObject.additionalProperties === \"object\" && Object.keys(schemaObject.additionalProperties).length;\n const hasImplicitAdditionalProperties =\n schemaObject.additionalProperties === true ||\n (typeof schemaObject.additionalProperties === \"object\" &&\n Object.keys(schemaObject.additionalProperties).length === 0);\n const hasExplicitPatternProperties =\n typeof schemaObject.patternProperties === \"object\" && Object.keys(schemaObject.patternProperties).length;\n const stringIndexTypes = [];\n if (hasExplicitAdditionalProperties) {\n stringIndexTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options, true));\n }\n if (hasImplicitAdditionalProperties || (!schemaObject.additionalProperties && options.ctx.additionalProperties)) {\n stringIndexTypes.push(UNKNOWN);\n }\n if (hasExplicitPatternProperties) {\n for (const [_, v] of getEntries(schemaObject.patternProperties ?? {}, options.ctx)) {\n stringIndexTypes.push(transformSchemaObject(v, options));\n }\n }\n\n if (stringIndexTypes.length === 0) {\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n }\n\n const stringIndexType = tsUnion(stringIndexTypes);\n\n return tsIntersection([\n ...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []),\n ts.factory.createTypeLiteralNode([\n ts.factory.createIndexSignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable,\n }),\n /* parameters */ [\n ts.factory.createParameterDeclaration(\n /* modifiers */ undefined,\n /* dotDotDotToken */ undefined,\n /* name */ ts.factory.createIdentifier(\"key\"),\n /* questionToken */ undefined,\n /* type */ STRING,\n ),\n ],\n /* type */ stringIndexType,\n ),\n ]),\n ]);\n }\n\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n}\n\n/**\n * Check if an object has a key\n * @param possibleObject - The object to check\n * @param key - The key to check for\n * @returns True if the object has the key, false otherwise\n */\nfunction hasKey(possibleObject: unknown, key: K): possibleObject is { [key in K]: unknown } {\n return typeof possibleObject === \"object\" && possibleObject !== null && key in possibleObject;\n}\n\n/** Wrap type with $Read or $Write marker when readWriteMarkers flag is enabled */\nfunction wrapWithReadWriteMarker(\n type: ts.TypeNode,\n readOnly: boolean,\n writeOnly: boolean,\n ctx: { readWriteMarkers: boolean },\n): ts.TypeNode {\n if (!ctx.readWriteMarkers || (readOnly && writeOnly)) {\n return type;\n }\n if (readOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Read\"), [type]);\n }\n if (writeOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Write\"), [type]);\n }\n return type;\n}\n"],"names":["NEVER","UNKNOWN","oapiRef","tsLiteral","parseRef","enumType","tsEnum","ts","tsUnion","NULL","createRef","tsArrayLiteralExpression","tsWithRequired","tsOmit","tsIntersection","tsIsPrimitive","tsRecord","STRING","tsNullable","UNDEFINED","NUMBER","BOOLEAN","createDiscriminatorProperty","getEntries","QUESTION_TOKEN","tsModifiers","tsPropertyIndex","addJSDocComment"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"schema-object.cjs","sources":["../../src/transform/schema-object.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport ts from \"typescript\";\nimport {\n addJSDocComment,\n BOOLEAN,\n NEVER,\n NULL,\n NUMBER,\n oapiRef,\n QUESTION_TOKEN,\n STRING,\n tsArrayLiteralExpression,\n tsEnum,\n tsIntersection,\n tsIsPrimitive,\n tsLiteral,\n tsModifiers,\n tsNullable,\n tsPropertyIndex,\n tsRecord,\n tsUnion,\n tsWithRequired,\n UNDEFINED,\n UNKNOWN,\n} from \"../lib/ts.js\";\nimport { createDiscriminatorProperty, createRef, getEntries } from \"../lib/utils.js\";\nimport type { ReferenceObject, SchemaObject, TransformNodeOptions } from \"../types.js\";\n\n/**\n * Transform SchemaObject nodes (4.8.24)\n * @see https://spec.openapis.org/oas/v3.1.0#schema-object\n */\nexport default function transformSchemaObject(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n const type = transformSchemaObjectWithComposition(schemaObject, options, fromAdditionalProperties);\n if (typeof options.ctx.postTransform === \"function\") {\n const postTransformResult = options.ctx.postTransform(type, options);\n if (postTransformResult) {\n return postTransformResult;\n }\n }\n return type;\n}\n\n/**\n * Transform SchemaObjects\n */\nexport function transformSchemaObjectWithComposition(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n /**\n * Unexpected types & edge cases\n */\n\n // missing/falsy type returns `never`\n if (!schemaObject) {\n return NEVER;\n }\n // `true` returns `unknown` (this exists, but is untyped)\n if ((schemaObject as unknown) === true) {\n return UNKNOWN;\n }\n // for any other unexpected type, throw error\n if (Array.isArray(schemaObject) || typeof schemaObject !== \"object\") {\n throw new Error(\n `Expected SchemaObject, received ${Array.isArray(schemaObject) ? \"Array\" : typeof schemaObject} at ${options.path}`,\n );\n }\n\n /**\n * ReferenceObject\n */\n if (\"$ref\" in schemaObject) {\n return oapiRef(schemaObject.$ref);\n }\n\n /**\n * const (valid for any type)\n */\n if (schemaObject.const !== null && schemaObject.const !== undefined) {\n return tsLiteral(schemaObject.const);\n }\n\n /**\n * enum (non-objects)\n * note: enum is valid for any type, but for objects, handle in oneOf below\n */\n if (\n Array.isArray(schemaObject.enum) &&\n (!(\"type\" in schemaObject) || schemaObject.type !== \"object\") &&\n !(\"properties\" in schemaObject)\n ) {\n const hasAdditionalProperties = \"additionalProperties\" in schemaObject && !!schemaObject.additionalProperties;\n\n if (!hasAdditionalProperties || (schemaObject.type === \"string\" && hasAdditionalProperties)) {\n // hoist enum to top level if string/number enum and option is enabled\n if (shouldTransformToTsEnum(options, schemaObject)) {\n let enumName = parseRef(options.path ?? \"\").pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumName = enumName.replace(\"components/schemas\", \"\");\n const metadata = schemaObject.enum.map((_, i) => ({\n name: schemaObject[\"x-enum-varnames\"]?.[i] ?? schemaObject[\"x-enumNames\"]?.[i],\n description: schemaObject[\"x-enum-descriptions\"]?.[i] ?? schemaObject[\"x-enumDescriptions\"]?.[i],\n }));\n\n // enums can contain null values, but dont want to output them\n let hasNull = false;\n const validSchemaEnums = schemaObject.enum.filter((enumValue) => {\n if (enumValue === null) {\n hasNull = true;\n return false;\n }\n\n return true;\n });\n const enumType = tsEnum(enumName, validSchemaEnums as (string | number)[], metadata, {\n shouldCache: options.ctx.dedupeEnums,\n export: true,\n // readonly: TS enum do not support the readonly modifier\n });\n if (!options.ctx.injectFooter.includes(enumType)) {\n options.ctx.injectFooter.push(enumType);\n }\n const ref = ts.factory.createTypeReferenceNode(enumType.name);\n\n const finalType: ts.TypeNode = hasNull ? tsUnion([ref, NULL]) : ref;\n\n return applyAdditionalPropertiesToEnum(hasAdditionalProperties, finalType, schemaObject);\n }\n\n const enumType = schemaObject.enum.map(tsLiteral);\n if ((Array.isArray(schemaObject.type) && schemaObject.type.includes(\"null\")) || schemaObject.nullable) {\n enumType.push(NULL);\n }\n\n const unionType = applyAdditionalPropertiesToEnum(hasAdditionalProperties, tsUnion(enumType), schemaObject);\n\n // hoist array with valid enum values to top level if string/number enum and option is enabled\n if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === \"string\" || typeof v === \"number\")) {\n const parsed = parseRef(options.path ?? \"\");\n let enumValuesVariableName = parsed.pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumValuesVariableName = enumValuesVariableName.replace(\"components/schemas\", \"\");\n enumValuesVariableName = `${enumValuesVariableName}Values`;\n\n // build a ref path for the type that ignores union indices (anyOf/oneOf) so\n // type references remain stable even when names include union positions\n const cleanedPointer: string[] = [];\n // Track ALL properties after a oneOf/anyOf that need Extract<> narrowing.\n // We apply Extract<> before EVERY property access after a union index because:\n // - When the property exists on ALL variants, Extract<> is a no-op (returns same type)\n // - When the property only exists on SOME variants, it correctly narrows the union\n // - When both variants have same property name but different inner schemas,\n // we still narrow at each level to handle nested unions correctly\n // This robust approach handles both simple and complex union structures.\n const extractProperties: string[] = [];\n for (let i = 0; i < parsed.pointer.length; i++) {\n // Example: #/paths/analytics/data/get/responses/400/content/application/json/anyOf/0/message\n const segment = parsed.pointer[i];\n if ((segment === \"anyOf\" || segment === \"oneOf\") && i < parsed.pointer.length - 1) {\n const next = parsed.pointer[i + 1];\n if (/^\\d+$/.test(next)) {\n // If we encounter something like \"anyOf/0\", we want to skip that part of the path\n i++;\n // Collect ALL remaining segments after the union index.\n // Each one will be wrapped with Extract<> to safely narrow the type\n // at each level, handling both top-level and nested union variants.\n const remainingSegments = parsed.pointer.slice(i + 1);\n for (const seg of remainingSegments) {\n // Skip union keywords and indices, only add actual property names\n if (seg !== \"anyOf\" && seg !== \"oneOf\" && !/^\\d+$/.test(seg)) {\n extractProperties.push(seg);\n }\n }\n continue;\n }\n }\n cleanedPointer.push(segment);\n }\n const cleanedRefPath = createRef(cleanedPointer);\n\n const enumValuesArray = tsArrayLiteralExpression(\n enumValuesVariableName,\n // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type\n fromAdditionalProperties\n ? ts.factory.createIndexedAccessTypeNode(\n oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"string\")),\n )\n : oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n schemaObject.enum as (string | number)[],\n {\n export: true,\n readonly: true,\n injectFooter: options.ctx.injectFooter,\n },\n );\n\n options.ctx.injectFooter.push(enumValuesArray);\n }\n\n return unionType;\n }\n }\n\n /**\n * Object + composition (anyOf/allOf/oneOf) types\n */\n\n /** Collect oneOf/anyOf */\n function collectUnionCompositions(items: (SchemaObject | ReferenceObject)[], unionKey: \"anyOf\" | \"oneOf\") {\n const output: ts.TypeNode[] = [];\n for (const [index, item] of items.entries()) {\n output.push(\n transformSchemaObject(item, {\n ...options,\n // include index in path so generated names from nested enums/enumValues are unique\n path: createRef([options.path, unionKey, String(index)]),\n }),\n );\n }\n\n return output;\n }\n\n /** Collect allOf with Omit<> for discriminators */\n function collectAllOfCompositions(items: (SchemaObject | ReferenceObject)[], required?: string[]): ts.TypeNode[] {\n const output: ts.TypeNode[] = [];\n for (const item of items) {\n let itemType: ts.TypeNode;\n // if this is a $ref, use WithRequired if parent specifies required properties\n // (but only for valid keys)\n if (\"$ref\" in item) {\n itemType = transformSchemaObject(item, options);\n\n const resolved = options.ctx.resolve(item.$ref);\n\n // make keys required, if necessary\n if (\n resolved &&\n typeof resolved === \"object\" &&\n \"properties\" in resolved &&\n // we have already handled this item (discriminator property was already added as required)\n !options.ctx.discriminators.refsHandled.includes(item.$ref)\n ) {\n // add WithRequired if necessary\n const validRequired = (required ?? []).filter((key) => !!resolved.properties?.[key]);\n if (validRequired.length) {\n itemType = tsWithRequired(itemType, validRequired, options.ctx.injectFooter);\n }\n }\n }\n // otherwise, if this is a schema object, combine parent `required[]` with its own, if any\n else {\n const itemRequired = [...(required ?? [])];\n if (typeof item === \"object\" && Array.isArray(item.required)) {\n itemRequired.push(...item.required);\n }\n itemType = transformSchemaObject({ ...item, required: itemRequired }, options);\n }\n\n output.push(itemType);\n }\n return output;\n }\n\n // compile final type\n let finalType: ts.TypeNode | undefined;\n\n // core + allOf: intersect\n const coreObjectType = transformSchemaObjectCore(schemaObject, options);\n const allOfType = collectAllOfCompositions(schemaObject.allOf ?? [], schemaObject.required);\n if (coreObjectType || allOfType.length) {\n const allOf: ts.TypeNode | undefined = allOfType.length ? tsIntersection(allOfType) : undefined;\n finalType = tsIntersection([...(coreObjectType ? [coreObjectType] : []), ...(allOf ? [allOf] : [])]);\n }\n // anyOf: union\n // (note: this may seem counterintuitive, but as TypeScript’s unions are not true XORs, they mimic behavior closer to anyOf than oneOf)\n const anyOfType = collectUnionCompositions(schemaObject.anyOf ?? [], \"anyOf\");\n if (anyOfType.length) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...anyOfType]);\n }\n // oneOf: union (within intersection with other types, if any)\n const oneOfType = collectUnionCompositions(\n schemaObject.oneOf ||\n (\"type\" in schemaObject &&\n schemaObject.type === \"object\" &&\n (schemaObject.enum as (SchemaObject | ReferenceObject)[])) ||\n [],\n \"oneOf\",\n );\n if (oneOfType.length) {\n // note: oneOf is the only type that may include primitives\n if (oneOfType.every(tsIsPrimitive)) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...oneOfType]);\n } else {\n finalType = tsIntersection([...(finalType ? [finalType] : []), tsUnion(oneOfType)]);\n }\n }\n\n // When no final type can be generated, fall back to unknown type (or related variants)\n if (!finalType) {\n if (\"type\" in schemaObject) {\n finalType = tsRecord(STRING, options.ctx.emptyObjectsUnknown ? UNKNOWN : NEVER);\n } else {\n finalType = UNKNOWN;\n }\n }\n\n if (finalType !== UNKNOWN && schemaObject.nullable) {\n finalType = tsNullable([finalType]);\n }\n\n return finalType;\n}\n\n/**\n * Check if the given OAPI enum should be transformed to a TypeScript enum\n */\nfunction shouldTransformToTsEnum(options: TransformNodeOptions, schemaObject: SchemaObject): boolean {\n // Enum conversion not enabled or no enum present\n if (!options.ctx.enum || !schemaObject.enum) {\n return false;\n }\n\n // Enum must have string, number or null values\n if (!schemaObject.enum.every((v) => [\"string\", \"number\", null].includes(typeof v))) {\n return false;\n }\n\n // If conditionalEnums is enabled, only convert if x-enum-* metadata is present\n if (options.ctx.conditionalEnums) {\n const hasEnumMetadata =\n Array.isArray(schemaObject[\"x-enum-varnames\"]) ||\n Array.isArray(schemaObject[\"x-enumNames\"]) ||\n Array.isArray(schemaObject[\"x-enum-descriptions\"]) ||\n Array.isArray(schemaObject[\"x-enumDescriptions\"]);\n if (!hasEnumMetadata) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Handle SchemaObject minus composition (anyOf/allOf/oneOf)\n */\nfunction transformSchemaObjectCore(schemaObject: SchemaObject, options: TransformNodeOptions): ts.TypeNode | undefined {\n if (\"type\" in schemaObject && schemaObject.type) {\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(schemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n if (result.questionToken) {\n return ts.factory.createUnionTypeNode([result.schema, UNDEFINED]);\n } else {\n return result.schema;\n }\n } else {\n return result;\n }\n }\n }\n\n // primitives\n // type: null\n if (schemaObject.type === \"null\") {\n return NULL;\n }\n // type: string\n if (schemaObject.type === \"string\") {\n return STRING;\n }\n // type: number / type: integer\n if (schemaObject.type === \"number\" || schemaObject.type === \"integer\") {\n return NUMBER;\n }\n // type: boolean\n if (schemaObject.type === \"boolean\") {\n return BOOLEAN;\n }\n\n // type: array (with support for tuples)\n if (schemaObject.type === \"array\") {\n // default to `unknown[]`\n let itemType: ts.TypeNode = UNKNOWN;\n // tuple type\n if (schemaObject.prefixItems || Array.isArray(schemaObject.items)) {\n const prefixItems = schemaObject.prefixItems ?? (schemaObject.items as (SchemaObject | ReferenceObject)[]);\n itemType = ts.factory.createTupleTypeNode(prefixItems.map((item) => transformSchemaObject(item, options)));\n }\n // standard array type\n else if (schemaObject.items) {\n if (hasKey(schemaObject.items, \"type\") && schemaObject.items.type === \"array\") {\n itemType = ts.factory.createArrayTypeNode(transformSchemaObject(schemaObject.items, options));\n } else {\n itemType = transformSchemaObject(schemaObject.items, options);\n }\n }\n\n const min: number =\n typeof schemaObject.minItems === \"number\" && schemaObject.minItems >= 0 ? schemaObject.minItems : 0;\n const max: number | undefined =\n typeof schemaObject.maxItems === \"number\" && schemaObject.maxItems >= 0 && min <= schemaObject.maxItems\n ? schemaObject.maxItems\n : undefined;\n const estimateCodeSize = typeof max !== \"number\" ? min : (max * (max + 1) - min * (min - 1)) / 2;\n if (\n options.ctx.arrayLength &&\n (min !== 0 || max !== undefined) &&\n estimateCodeSize < 30 // \"30\" is an arbitrary number but roughly around when TS starts to struggle with tuple inference in practice\n ) {\n if (min === max) {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n return tsUnion([ts.factory.createTupleTypeNode(elements)]);\n } else if ((schemaObject.maxItems as number) > 0) {\n // if maxItems is set, then return a union of all permutations of possible tuple types\n const members: ts.TypeNode[] = [];\n // populate 1 short of min …\n for (let i = 0; i <= (max ?? 0) - min; i++) {\n const elements: ts.TypeNode[] = [];\n for (let j = min; j < i + min; j++) {\n elements.push(itemType);\n }\n members.push(ts.factory.createTupleTypeNode(elements));\n }\n return tsUnion(members);\n }\n // if maxItems not set, then return a simple tuple type the length of `min`\n else {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n elements.push(ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(itemType)));\n return ts.factory.createTupleTypeNode(elements);\n }\n }\n\n const finalType =\n ts.isTupleTypeNode(itemType) || ts.isArrayTypeNode(itemType)\n ? itemType\n : ts.factory.createArrayTypeNode(itemType); // wrap itemType in array type, but only if not a tuple or array already\n\n return options.ctx.immutable\n ? ts.factory.createTypeOperatorNode(ts.SyntaxKind.ReadonlyKeyword, finalType)\n : finalType;\n }\n\n // polymorphic, or 3.1 nullable\n if (Array.isArray(schemaObject.type) && !Array.isArray(schemaObject)) {\n // skip any primitive types that appear in oneOf as well\n const uniqueTypes: ts.TypeNode[] = [];\n if (Array.isArray(schemaObject.oneOf)) {\n for (const t of schemaObject.type) {\n if (\n (t === \"boolean\" || t === \"string\" || t === \"number\" || t === \"integer\" || t === \"null\") &&\n schemaObject.oneOf.find((o) => typeof o === \"object\" && \"type\" in o && o.type === t)\n ) {\n continue;\n }\n uniqueTypes.push(\n t === \"null\" || t === null\n ? NULL\n : transformSchemaObject(\n { ...schemaObject, type: t, oneOf: undefined } as SchemaObject, // don’t stack oneOf transforms\n options,\n ),\n );\n }\n } else {\n for (const t of schemaObject.type) {\n if (t === \"null\" || t === null) {\n uniqueTypes.push(NULL);\n } else {\n uniqueTypes.push(transformSchemaObject({ ...schemaObject, type: t } as SchemaObject, options));\n }\n }\n }\n return tsUnion(uniqueTypes);\n }\n }\n\n // type: object\n const coreObjectType: ts.TypeElement[] = [];\n\n // discriminators: explicit mapping on schema object\n for (const k of [\"allOf\", \"anyOf\"] as const) {\n if (!schemaObject[k]) {\n continue;\n }\n // for all magic inheritance, we will have already gathered it into\n // ctx.discriminators. But stop objects from referencing their own\n // discriminator meant for children (!schemaObject.discriminator)\n // and don't add discriminator properties if we already added/patched\n // them (options.ctx.discriminators.refsHandled.includes(options.path!).\n const discriminator =\n !schemaObject.discriminator &&\n !options.ctx.discriminators.refsHandled.includes(options.path ?? \"\") &&\n options.ctx.discriminators.objects[options.path ?? \"\"];\n if (discriminator) {\n coreObjectType.unshift(\n createDiscriminatorProperty(discriminator, {\n path: options.path ?? \"\",\n readonly: options.ctx.immutable,\n }),\n );\n break;\n }\n }\n\n if (\n (\"properties\" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) ||\n (\"additionalProperties\" in schemaObject && schemaObject.additionalProperties) ||\n (\"patternProperties\" in schemaObject && schemaObject.patternProperties) ||\n (\"$defs\" in schemaObject && schemaObject.$defs)\n ) {\n // properties\n if (\"properties\" in schemaObject && schemaObject.properties && Object.keys(schemaObject?.properties).length) {\n for (const [k, v] of getEntries(schemaObject.properties ?? {}, options.ctx)) {\n if ((typeof v !== \"object\" && typeof v !== \"boolean\") || Array.isArray(v)) {\n throw new Error(\n `${options.path}: invalid property ${k}. Expected Schema Object or boolean, got ${\n Array.isArray(v) ? \"Array\" : typeof v\n }`,\n );\n }\n\n const { $ref, readOnly, writeOnly, hasDefault } =\n typeof v === \"object\"\n ? {\n $ref: \"$ref\" in v && v.$ref,\n readOnly: \"readOnly\" in v && v.readOnly,\n writeOnly: \"writeOnly\" in v && v.writeOnly,\n hasDefault: \"default\" in v && v.default !== undefined,\n }\n : {};\n\n // handle excludeDeprecated option\n if (options.ctx.excludeDeprecated) {\n const resolved = $ref ? options.ctx.resolve($ref) : v;\n if ((resolved as SchemaObject)?.deprecated) {\n continue;\n }\n }\n let optional =\n schemaObject.required?.includes(k) ||\n (schemaObject.required === undefined && options.ctx.propertiesRequiredByDefault) ||\n (hasDefault &&\n options.ctx.defaultNonNullable &&\n !options.path?.includes(\"parameters\") &&\n !options.path?.includes(\"requestBody\") &&\n !options.path?.includes(\"requestBodies\")) // can’t be required, even with defaults\n ? undefined\n : QUESTION_TOKEN;\n let type = $ref\n ? oapiRef($ref)\n : transformSchemaObject(v, {\n ...options,\n path: createRef([options.path, k]),\n });\n\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(v as SchemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n type = result.schema;\n optional = result.questionToken ? QUESTION_TOKEN : optional;\n } else {\n type = result;\n }\n }\n }\n\n type = wrapWithReadWriteMarker(type, !!readOnly, !!writeOnly, options.ctx);\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && readOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ optional,\n /* type */ type,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n coreObjectType.push(property);\n }\n }\n\n // $defs\n if (\"$defs\" in schemaObject && typeof schemaObject.$defs === \"object\" && Object.keys(schemaObject.$defs).length) {\n const defKeys: ts.TypeElement[] = [];\n for (const [k, v] of Object.entries(schemaObject.$defs)) {\n const defReadOnly = \"readOnly\" in v && !!v.readOnly;\n const defWriteOnly = \"writeOnly\" in v && !!v.writeOnly;\n const defType = wrapWithReadWriteMarker(\n transformSchemaObject(v, { ...options, path: createRef([options.path, \"$defs\", k]) }),\n defReadOnly,\n defWriteOnly,\n options.ctx,\n );\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && defReadOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ undefined,\n /* type */ defType,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, \"$defs\", k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n defKeys.push(property);\n }\n coreObjectType.push(\n ts.factory.createPropertySignature(\n /* modifiers */ undefined,\n /* name */ tsPropertyIndex(\"$defs\"),\n /* questionToken */ undefined,\n /* type */ ts.factory.createTypeLiteralNode(defKeys),\n ),\n );\n }\n\n // additionalProperties / patternProperties\n const hasExplicitAdditionalProperties =\n typeof schemaObject.additionalProperties === \"object\" && Object.keys(schemaObject.additionalProperties).length;\n const hasImplicitAdditionalProperties =\n schemaObject.additionalProperties === true ||\n (typeof schemaObject.additionalProperties === \"object\" &&\n Object.keys(schemaObject.additionalProperties).length === 0);\n const patternProperties = hasKey(schemaObject, \"patternProperties\") ? schemaObject.patternProperties : undefined;\n const hasExplicitPatternProperties =\n typeof patternProperties === \"object\" && patternProperties !== null && Object.keys(patternProperties).length > 0;\n const stringIndexTypes = [];\n if (hasExplicitAdditionalProperties) {\n stringIndexTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options, true));\n }\n if (hasImplicitAdditionalProperties || (!schemaObject.additionalProperties && options.ctx.additionalProperties)) {\n stringIndexTypes.push(UNKNOWN);\n }\n if (hasExplicitPatternProperties && patternProperties && typeof patternProperties === \"object\") {\n for (const [_, v] of getEntries(\n patternProperties as Record,\n options.ctx,\n )) {\n stringIndexTypes.push(transformSchemaObject(v, options));\n }\n }\n\n if (stringIndexTypes.length === 0) {\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n }\n\n const stringIndexType = tsUnion(stringIndexTypes);\n\n return tsIntersection([\n ...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []),\n ts.factory.createTypeLiteralNode([\n ts.factory.createIndexSignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable,\n }),\n /* parameters */ [\n ts.factory.createParameterDeclaration(\n /* modifiers */ undefined,\n /* dotDotDotToken */ undefined,\n /* name */ ts.factory.createIdentifier(\"key\"),\n /* questionToken */ undefined,\n /* type */ STRING,\n ),\n ],\n /* type */ stringIndexType,\n ),\n ]),\n ]);\n }\n\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n}\n\n/**\n * Check if an object has a key\n * @param possibleObject - The object to check\n * @param key - The key to check for\n * @returns True if the object has the key, false otherwise\n */\nfunction hasKey(possibleObject: unknown, key: K): possibleObject is { [key in K]: unknown } {\n return typeof possibleObject === \"object\" && possibleObject !== null && key in possibleObject;\n}\n\nfunction applyAdditionalPropertiesToEnum(\n hasAdditionalProperties: boolean,\n unionType: ts.TypeNode,\n schemaObject: SchemaObject,\n) {\n // If additionalProperties is true, add (string & {}) to the union\n if (hasAdditionalProperties && schemaObject.type === \"string\") {\n const stringAndEmptyObject = tsIntersection([STRING, ts.factory.createTypeLiteralNode([])]);\n return tsUnion([unionType, stringAndEmptyObject]);\n }\n return unionType;\n}\n\n/** Wrap type with $Read or $Write marker when readWriteMarkers flag is enabled */\nfunction wrapWithReadWriteMarker(\n type: ts.TypeNode,\n readOnly: boolean,\n writeOnly: boolean,\n ctx: { readWriteMarkers: boolean },\n): ts.TypeNode {\n if (!ctx.readWriteMarkers || (readOnly && writeOnly)) {\n return type;\n }\n if (readOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Read\"), [type]);\n }\n if (writeOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Write\"), [type]);\n }\n return type;\n}\n"],"names":["NEVER","UNKNOWN","oapiRef","tsLiteral","parseRef","enumType","tsEnum","ts","finalType","tsUnion","NULL","createRef","tsArrayLiteralExpression","tsWithRequired","tsIntersection","tsIsPrimitive","tsRecord","STRING","tsNullable","UNDEFINED","NUMBER","BOOLEAN","createDiscriminatorProperty","getEntries","QUESTION_TOKEN","tsModifiers","tsPropertyIndex","addJSDocComment"],"mappings":"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"} \ No newline at end of file diff --git a/dist/transform/schema-object.mjs b/dist/transform/schema-object.mjs index dc20a5c14b1320364a71a254b79415bd214f4416..989814efa12f6293e4a274eb980a80f808cc503b 100644 --- a/dist/transform/schema-object.mjs +++ b/dist/transform/schema-object.mjs @@ -1,6 +1,6 @@ import { parseRef } from '@redocly/openapi-core/lib/ref-utils.js'; import ts from 'typescript'; -import { NEVER, UNKNOWN, oapiRef, tsLiteral, tsEnum, tsUnion, NULL, tsArrayLiteralExpression, tsIntersection, tsIsPrimitive, tsRecord, STRING, tsNullable, UNDEFINED, NUMBER, BOOLEAN, QUESTION_TOKEN, tsModifiers, tsPropertyIndex, addJSDocComment, tsWithRequired, tsOmit } from '../lib/ts.mjs'; +import { NEVER, UNKNOWN, oapiRef, tsLiteral, tsEnum, tsUnion, NULL, tsArrayLiteralExpression, tsIntersection, tsIsPrimitive, tsRecord, STRING, tsNullable, UNDEFINED, NUMBER, BOOLEAN, QUESTION_TOKEN, tsModifiers, tsPropertyIndex, addJSDocComment, tsWithRequired } from '../lib/ts.mjs'; import { createRef, createDiscriminatorProperty, getEntries } from '../lib/utils.mjs'; function transformSchemaObject(schemaObject, options, fromAdditionalProperties = false) { @@ -31,80 +31,84 @@ function transformSchemaObjectWithComposition(schemaObject, options, fromAdditio if (schemaObject.const !== null && schemaObject.const !== void 0) { return tsLiteral(schemaObject.const); } - if (Array.isArray(schemaObject.enum) && (!("type" in schemaObject) || schemaObject.type !== "object") && !("properties" in schemaObject) && !("additionalProperties" in schemaObject)) { - if (shouldTransformToTsEnum(options, schemaObject)) { - let enumName = parseRef(options.path ?? "").pointer.join("/"); - enumName = enumName.replace("components/schemas", ""); - const metadata = schemaObject.enum.map((_, i) => ({ - name: schemaObject["x-enum-varnames"]?.[i] ?? schemaObject["x-enumNames"]?.[i], - description: schemaObject["x-enum-descriptions"]?.[i] ?? schemaObject["x-enumDescriptions"]?.[i] - })); - let hasNull = false; - const validSchemaEnums = schemaObject.enum.filter((enumValue) => { - if (enumValue === null) { - hasNull = true; - return false; + if (Array.isArray(schemaObject.enum) && (!("type" in schemaObject) || schemaObject.type !== "object") && !("properties" in schemaObject)) { + const hasAdditionalProperties = "additionalProperties" in schemaObject && !!schemaObject.additionalProperties; + if (!hasAdditionalProperties || schemaObject.type === "string" && hasAdditionalProperties) { + if (shouldTransformToTsEnum(options, schemaObject)) { + let enumName = parseRef(options.path ?? "").pointer.join("/"); + enumName = enumName.replace("components/schemas", ""); + const metadata = schemaObject.enum.map((_, i) => ({ + name: schemaObject["x-enum-varnames"]?.[i] ?? schemaObject["x-enumNames"]?.[i], + description: schemaObject["x-enum-descriptions"]?.[i] ?? schemaObject["x-enumDescriptions"]?.[i] + })); + let hasNull = false; + const validSchemaEnums = schemaObject.enum.filter((enumValue) => { + if (enumValue === null) { + hasNull = true; + return false; + } + return true; + }); + const enumType2 = tsEnum(enumName, validSchemaEnums, metadata, { + shouldCache: options.ctx.dedupeEnums, + export: true + // readonly: TS enum do not support the readonly modifier + }); + if (!options.ctx.injectFooter.includes(enumType2)) { + options.ctx.injectFooter.push(enumType2); } - return true; - }); - const enumType2 = tsEnum(enumName, validSchemaEnums, metadata, { - shouldCache: options.ctx.dedupeEnums, - export: true - // readonly: TS enum do not support the readonly modifier - }); - if (!options.ctx.injectFooter.includes(enumType2)) { - options.ctx.injectFooter.push(enumType2); + const ref = ts.factory.createTypeReferenceNode(enumType2.name); + const finalType2 = hasNull ? tsUnion([ref, NULL]) : ref; + return applyAdditionalPropertiesToEnum(hasAdditionalProperties, finalType2, schemaObject); } - const ref = ts.factory.createTypeReferenceNode(enumType2.name); - return hasNull ? tsUnion([ref, NULL]) : ref; - } - const enumType = schemaObject.enum.map(tsLiteral); - if (Array.isArray(schemaObject.type) && schemaObject.type.includes("null") || schemaObject.nullable) { - enumType.push(NULL); - } - const unionType = tsUnion(enumType); - if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { - const parsed = parseRef(options.path ?? ""); - let enumValuesVariableName = parsed.pointer.join("/"); - enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); - enumValuesVariableName = `${enumValuesVariableName}Values`; - const cleanedPointer = []; - const extractProperties = []; - for (let i = 0; i < parsed.pointer.length; i++) { - const segment = parsed.pointer[i]; - if ((segment === "anyOf" || segment === "oneOf") && i < parsed.pointer.length - 1) { - const next = parsed.pointer[i + 1]; - if (/^\d+$/.test(next)) { - i++; - const remainingSegments = parsed.pointer.slice(i + 1); - for (const seg of remainingSegments) { - if (seg !== "anyOf" && seg !== "oneOf" && !/^\d+$/.test(seg)) { - extractProperties.push(seg); + const enumType = schemaObject.enum.map(tsLiteral); + if (Array.isArray(schemaObject.type) && schemaObject.type.includes("null") || schemaObject.nullable) { + enumType.push(NULL); + } + const unionType = applyAdditionalPropertiesToEnum(hasAdditionalProperties, tsUnion(enumType), schemaObject); + if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { + const parsed = parseRef(options.path ?? ""); + let enumValuesVariableName = parsed.pointer.join("/"); + enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); + enumValuesVariableName = `${enumValuesVariableName}Values`; + const cleanedPointer = []; + const extractProperties = []; + for (let i = 0; i < parsed.pointer.length; i++) { + const segment = parsed.pointer[i]; + if ((segment === "anyOf" || segment === "oneOf") && i < parsed.pointer.length - 1) { + const next = parsed.pointer[i + 1]; + if (/^\d+$/.test(next)) { + i++; + const remainingSegments = parsed.pointer.slice(i + 1); + for (const seg of remainingSegments) { + if (seg !== "anyOf" && seg !== "oneOf" && !/^\d+$/.test(seg)) { + extractProperties.push(seg); + } } + continue; } - continue; } + cleanedPointer.push(segment); } - cleanedPointer.push(segment); + const cleanedRefPath = createRef(cleanedPointer); + const enumValuesArray = tsArrayLiteralExpression( + enumValuesVariableName, + // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type + fromAdditionalProperties ? ts.factory.createIndexedAccessTypeNode( + oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), + ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("string")) + ) : oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), + schemaObject.enum, + { + export: true, + readonly: true, + injectFooter: options.ctx.injectFooter + } + ); + options.ctx.injectFooter.push(enumValuesArray); } - const cleanedRefPath = createRef(cleanedPointer); - const enumValuesArray = tsArrayLiteralExpression( - enumValuesVariableName, - // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type - fromAdditionalProperties ? ts.factory.createIndexedAccessTypeNode( - oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), - ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("string")) - ) : oapiRef(cleanedRefPath, void 0, { deep: true, extractProperties }), - schemaObject.enum, - { - export: true, - readonly: true, - injectFooter: options.ctx.injectFooter - } - ); - options.ctx.injectFooter.push(enumValuesArray); + return unionType; } - return unionType; } function collectUnionCompositions(items, unionKey) { const output = []; @@ -140,12 +144,7 @@ function transformSchemaObjectWithComposition(schemaObject, options, fromAdditio } itemType = transformSchemaObject({ ...item, required: itemRequired }, options); } - const discriminator = "$ref" in item && options.ctx.discriminators.objects[item.$ref] || item.discriminator; - if (discriminator) { - output.push(tsOmit(itemType, [discriminator.propertyName])); - } else { - output.push(itemType); - } + output.push(itemType); } return output; } @@ -314,7 +313,7 @@ function transformSchemaObjectCore(schemaObject, options) { } } if ("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length || "additionalProperties" in schemaObject && schemaObject.additionalProperties || "patternProperties" in schemaObject && schemaObject.patternProperties || "$defs" in schemaObject && schemaObject.$defs) { - if (Object.keys(schemaObject.properties ?? {}).length) { + if ("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject?.properties).length) { for (const [k, v] of getEntries(schemaObject.properties ?? {}, options.ctx)) { if (typeof v !== "object" && typeof v !== "boolean" || Array.isArray(v)) { throw new Error( @@ -375,7 +374,7 @@ function transformSchemaObjectCore(schemaObject, options) { coreObjectType.push(property); } } - if (schemaObject.$defs && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { + if ("$defs" in schemaObject && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { const defKeys = []; for (const [k, v] of Object.entries(schemaObject.$defs)) { const defReadOnly = "readOnly" in v && !!v.readOnly; @@ -425,7 +424,8 @@ function transformSchemaObjectCore(schemaObject, options) { } const hasExplicitAdditionalProperties = typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length; const hasImplicitAdditionalProperties = schemaObject.additionalProperties === true || typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length === 0; - const hasExplicitPatternProperties = typeof schemaObject.patternProperties === "object" && Object.keys(schemaObject.patternProperties).length; + const patternProperties = hasKey(schemaObject, "patternProperties") ? schemaObject.patternProperties : void 0; + const hasExplicitPatternProperties = typeof patternProperties === "object" && patternProperties !== null && Object.keys(patternProperties).length > 0; const stringIndexTypes = []; if (hasExplicitAdditionalProperties) { stringIndexTypes.push(transformSchemaObject(schemaObject.additionalProperties, options, true)); @@ -433,8 +433,11 @@ function transformSchemaObjectCore(schemaObject, options) { if (hasImplicitAdditionalProperties || !schemaObject.additionalProperties && options.ctx.additionalProperties) { stringIndexTypes.push(UNKNOWN); } - if (hasExplicitPatternProperties) { - for (const [_, v] of getEntries(schemaObject.patternProperties ?? {}, options.ctx)) { + if (hasExplicitPatternProperties && patternProperties && typeof patternProperties === "object") { + for (const [_, v] of getEntries( + patternProperties, + options.ctx + )) { stringIndexTypes.push(transformSchemaObject(v, options)); } } @@ -476,6 +479,13 @@ function transformSchemaObjectCore(schemaObject, options) { function hasKey(possibleObject, key) { return typeof possibleObject === "object" && possibleObject !== null && key in possibleObject; } +function applyAdditionalPropertiesToEnum(hasAdditionalProperties, unionType, schemaObject) { + if (hasAdditionalProperties && schemaObject.type === "string") { + const stringAndEmptyObject = tsIntersection([STRING, ts.factory.createTypeLiteralNode([])]); + return tsUnion([unionType, stringAndEmptyObject]); + } + return unionType; +} function wrapWithReadWriteMarker(type, readOnly, writeOnly, ctx) { if (!ctx.readWriteMarkers || readOnly && writeOnly) { return type; diff --git a/dist/transform/schema-object.mjs.map b/dist/transform/schema-object.mjs.map index 452cebcb435ee9d7123da76c7ff2b10c6e53a494..b0d6edffb8fda895ed37f45a99f673143803960c 100644 --- a/dist/transform/schema-object.mjs.map +++ b/dist/transform/schema-object.mjs.map @@ -1 +1 @@ -{"version":3,"file":"schema-object.mjs","sources":["../../src/transform/schema-object.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport ts from \"typescript\";\nimport {\n addJSDocComment,\n BOOLEAN,\n NEVER,\n NULL,\n NUMBER,\n oapiRef,\n QUESTION_TOKEN,\n STRING,\n tsArrayLiteralExpression,\n tsEnum,\n tsIntersection,\n tsIsPrimitive,\n tsLiteral,\n tsModifiers,\n tsNullable,\n tsOmit,\n tsPropertyIndex,\n tsRecord,\n tsUnion,\n tsWithRequired,\n UNDEFINED,\n UNKNOWN,\n} from \"../lib/ts.js\";\nimport { createDiscriminatorProperty, createRef, getEntries } from \"../lib/utils.js\";\nimport type { ReferenceObject, SchemaObject, TransformNodeOptions } from \"../types.js\";\n\n/**\n * Transform SchemaObject nodes (4.8.24)\n * @see https://spec.openapis.org/oas/v3.1.0#schema-object\n */\nexport default function transformSchemaObject(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n const type = transformSchemaObjectWithComposition(schemaObject, options, fromAdditionalProperties);\n if (typeof options.ctx.postTransform === \"function\") {\n const postTransformResult = options.ctx.postTransform(type, options);\n if (postTransformResult) {\n return postTransformResult;\n }\n }\n return type;\n}\n\n/**\n * Transform SchemaObjects\n */\nexport function transformSchemaObjectWithComposition(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n /**\n * Unexpected types & edge cases\n */\n\n // missing/falsy type returns `never`\n if (!schemaObject) {\n return NEVER;\n }\n // `true` returns `unknown` (this exists, but is untyped)\n if ((schemaObject as unknown) === true) {\n return UNKNOWN;\n }\n // for any other unexpected type, throw error\n if (Array.isArray(schemaObject) || typeof schemaObject !== \"object\") {\n throw new Error(\n `Expected SchemaObject, received ${Array.isArray(schemaObject) ? \"Array\" : typeof schemaObject} at ${options.path}`,\n );\n }\n\n /**\n * ReferenceObject\n */\n if (\"$ref\" in schemaObject) {\n return oapiRef(schemaObject.$ref);\n }\n\n /**\n * const (valid for any type)\n */\n if (schemaObject.const !== null && schemaObject.const !== undefined) {\n return tsLiteral(schemaObject.const);\n }\n\n /**\n * enum (non-objects)\n * note: enum is valid for any type, but for objects, handle in oneOf below\n */\n if (\n Array.isArray(schemaObject.enum) &&\n (!(\"type\" in schemaObject) || schemaObject.type !== \"object\") &&\n !(\"properties\" in schemaObject) &&\n !(\"additionalProperties\" in schemaObject)\n ) {\n // hoist enum to top level if string/number enum and option is enabled\n if (shouldTransformToTsEnum(options, schemaObject)) {\n let enumName = parseRef(options.path ?? \"\").pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumName = enumName.replace(\"components/schemas\", \"\");\n const metadata = schemaObject.enum.map((_, i) => ({\n name: schemaObject[\"x-enum-varnames\"]?.[i] ?? schemaObject[\"x-enumNames\"]?.[i],\n description: schemaObject[\"x-enum-descriptions\"]?.[i] ?? schemaObject[\"x-enumDescriptions\"]?.[i],\n }));\n\n // enums can contain null values, but dont want to output them\n let hasNull = false;\n const validSchemaEnums = schemaObject.enum.filter((enumValue) => {\n if (enumValue === null) {\n hasNull = true;\n return false;\n }\n\n return true;\n });\n const enumType = tsEnum(enumName, validSchemaEnums as (string | number)[], metadata, {\n shouldCache: options.ctx.dedupeEnums,\n export: true,\n // readonly: TS enum do not support the readonly modifier\n });\n if (!options.ctx.injectFooter.includes(enumType)) {\n options.ctx.injectFooter.push(enumType);\n }\n const ref = ts.factory.createTypeReferenceNode(enumType.name);\n return hasNull ? tsUnion([ref, NULL]) : ref;\n }\n const enumType = schemaObject.enum.map(tsLiteral);\n if ((Array.isArray(schemaObject.type) && schemaObject.type.includes(\"null\")) || schemaObject.nullable) {\n enumType.push(NULL);\n }\n\n const unionType = tsUnion(enumType);\n\n // hoist array with valid enum values to top level if string/number enum and option is enabled\n if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === \"string\" || typeof v === \"number\")) {\n const parsed = parseRef(options.path ?? \"\");\n let enumValuesVariableName = parsed.pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumValuesVariableName = enumValuesVariableName.replace(\"components/schemas\", \"\");\n enumValuesVariableName = `${enumValuesVariableName}Values`;\n\n // build a ref path for the type that ignores union indices (anyOf/oneOf) so\n // type references remain stable even when names include union positions\n const cleanedPointer: string[] = [];\n // Track ALL properties after a oneOf/anyOf that need Extract<> narrowing.\n // We apply Extract<> before EVERY property access after a union index because:\n // - When the property exists on ALL variants, Extract<> is a no-op (returns same type)\n // - When the property only exists on SOME variants, it correctly narrows the union\n // - When both variants have same property name but different inner schemas,\n // we still narrow at each level to handle nested unions correctly\n // This robust approach handles both simple and complex union structures.\n const extractProperties: string[] = [];\n for (let i = 0; i < parsed.pointer.length; i++) {\n // Example: #/paths/analytics/data/get/responses/400/content/application/json/anyOf/0/message\n const segment = parsed.pointer[i];\n if ((segment === \"anyOf\" || segment === \"oneOf\") && i < parsed.pointer.length - 1) {\n const next = parsed.pointer[i + 1];\n if (/^\\d+$/.test(next)) {\n // If we encounter something like \"anyOf/0\", we want to skip that part of the path\n i++;\n // Collect ALL remaining segments after the union index.\n // Each one will be wrapped with Extract<> to safely narrow the type\n // at each level, handling both top-level and nested union variants.\n const remainingSegments = parsed.pointer.slice(i + 1);\n for (const seg of remainingSegments) {\n // Skip union keywords and indices, only add actual property names\n if (seg !== \"anyOf\" && seg !== \"oneOf\" && !/^\\d+$/.test(seg)) {\n extractProperties.push(seg);\n }\n }\n continue;\n }\n }\n cleanedPointer.push(segment);\n }\n const cleanedRefPath = createRef(cleanedPointer);\n\n const enumValuesArray = tsArrayLiteralExpression(\n enumValuesVariableName,\n // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type\n fromAdditionalProperties\n ? ts.factory.createIndexedAccessTypeNode(\n oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"string\")),\n )\n : oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n schemaObject.enum as (string | number)[],\n {\n export: true,\n readonly: true,\n injectFooter: options.ctx.injectFooter,\n },\n );\n\n options.ctx.injectFooter.push(enumValuesArray);\n }\n\n return unionType;\n }\n\n /**\n * Object + composition (anyOf/allOf/oneOf) types\n */\n\n /** Collect oneOf/anyOf */\n function collectUnionCompositions(items: (SchemaObject | ReferenceObject)[], unionKey: \"anyOf\" | \"oneOf\") {\n const output: ts.TypeNode[] = [];\n for (const [index, item] of items.entries()) {\n output.push(\n transformSchemaObject(item, {\n ...options,\n // include index in path so generated names from nested enums/enumValues are unique\n path: createRef([options.path, unionKey, String(index)]),\n }),\n );\n }\n\n return output;\n }\n\n /** Collect allOf with Omit<> for discriminators */\n function collectAllOfCompositions(items: (SchemaObject | ReferenceObject)[], required?: string[]): ts.TypeNode[] {\n const output: ts.TypeNode[] = [];\n for (const item of items) {\n let itemType: ts.TypeNode;\n // if this is a $ref, use WithRequired if parent specifies required properties\n // (but only for valid keys)\n if (\"$ref\" in item) {\n itemType = transformSchemaObject(item, options);\n\n const resolved = options.ctx.resolve(item.$ref);\n\n // make keys required, if necessary\n if (\n resolved &&\n typeof resolved === \"object\" &&\n \"properties\" in resolved &&\n // we have already handled this item (discriminator property was already added as required)\n !options.ctx.discriminators.refsHandled.includes(item.$ref)\n ) {\n // add WithRequired if necessary\n const validRequired = (required ?? []).filter((key) => !!resolved.properties?.[key]);\n if (validRequired.length) {\n itemType = tsWithRequired(itemType, validRequired, options.ctx.injectFooter);\n }\n }\n }\n // otherwise, if this is a schema object, combine parent `required[]` with its own, if any\n else {\n const itemRequired = [...(required ?? [])];\n if (typeof item === \"object\" && Array.isArray(item.required)) {\n itemRequired.push(...item.required);\n }\n itemType = transformSchemaObject({ ...item, required: itemRequired }, options);\n }\n\n const discriminator =\n (\"$ref\" in item && options.ctx.discriminators.objects[item.$ref]) || (item as any).discriminator;\n if (discriminator) {\n output.push(tsOmit(itemType, [discriminator.propertyName]));\n } else {\n output.push(itemType);\n }\n }\n return output;\n }\n\n // compile final type\n let finalType: ts.TypeNode | undefined;\n\n // core + allOf: intersect\n const coreObjectType = transformSchemaObjectCore(schemaObject, options);\n const allOfType = collectAllOfCompositions(schemaObject.allOf ?? [], schemaObject.required);\n if (coreObjectType || allOfType.length) {\n const allOf: ts.TypeNode | undefined = allOfType.length ? tsIntersection(allOfType) : undefined;\n finalType = tsIntersection([...(coreObjectType ? [coreObjectType] : []), ...(allOf ? [allOf] : [])]);\n }\n // anyOf: union\n // (note: this may seem counterintuitive, but as TypeScript’s unions are not true XORs, they mimic behavior closer to anyOf than oneOf)\n const anyOfType = collectUnionCompositions(schemaObject.anyOf ?? [], \"anyOf\");\n if (anyOfType.length) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...anyOfType]);\n }\n // oneOf: union (within intersection with other types, if any)\n const oneOfType = collectUnionCompositions(\n schemaObject.oneOf ||\n (\"type\" in schemaObject &&\n schemaObject.type === \"object\" &&\n (schemaObject.enum as (SchemaObject | ReferenceObject)[])) ||\n [],\n \"oneOf\",\n );\n if (oneOfType.length) {\n // note: oneOf is the only type that may include primitives\n if (oneOfType.every(tsIsPrimitive)) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...oneOfType]);\n } else {\n finalType = tsIntersection([...(finalType ? [finalType] : []), tsUnion(oneOfType)]);\n }\n }\n\n // When no final type can be generated, fall back to unknown type (or related variants)\n if (!finalType) {\n if (\"type\" in schemaObject) {\n finalType = tsRecord(STRING, options.ctx.emptyObjectsUnknown ? UNKNOWN : NEVER);\n } else {\n finalType = UNKNOWN;\n }\n }\n\n if (finalType !== UNKNOWN && schemaObject.nullable) {\n finalType = tsNullable([finalType]);\n }\n\n return finalType;\n}\n\n/**\n * Check if the given OAPI enum should be transformed to a TypeScript enum\n */\nfunction shouldTransformToTsEnum(options: TransformNodeOptions, schemaObject: SchemaObject): boolean {\n // Enum conversion not enabled or no enum present\n if (!options.ctx.enum || !schemaObject.enum) {\n return false;\n }\n\n // Enum must have string, number or null values\n if (!schemaObject.enum.every((v) => [\"string\", \"number\", null].includes(typeof v))) {\n return false;\n }\n\n // If conditionalEnums is enabled, only convert if x-enum-* metadata is present\n if (options.ctx.conditionalEnums) {\n const hasEnumMetadata =\n Array.isArray(schemaObject[\"x-enum-varnames\"]) ||\n Array.isArray(schemaObject[\"x-enumNames\"]) ||\n Array.isArray(schemaObject[\"x-enum-descriptions\"]) ||\n Array.isArray(schemaObject[\"x-enumDescriptions\"]);\n if (!hasEnumMetadata) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Handle SchemaObject minus composition (anyOf/allOf/oneOf)\n */\nfunction transformSchemaObjectCore(schemaObject: SchemaObject, options: TransformNodeOptions): ts.TypeNode | undefined {\n if (\"type\" in schemaObject && schemaObject.type) {\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(schemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n if (result.questionToken) {\n return ts.factory.createUnionTypeNode([result.schema, UNDEFINED]);\n } else {\n return result.schema;\n }\n } else {\n return result;\n }\n }\n }\n\n // primitives\n // type: null\n if (schemaObject.type === \"null\") {\n return NULL;\n }\n // type: string\n if (schemaObject.type === \"string\") {\n return STRING;\n }\n // type: number / type: integer\n if (schemaObject.type === \"number\" || schemaObject.type === \"integer\") {\n return NUMBER;\n }\n // type: boolean\n if (schemaObject.type === \"boolean\") {\n return BOOLEAN;\n }\n\n // type: array (with support for tuples)\n if (schemaObject.type === \"array\") {\n // default to `unknown[]`\n let itemType: ts.TypeNode = UNKNOWN;\n // tuple type\n if (schemaObject.prefixItems || Array.isArray(schemaObject.items)) {\n const prefixItems = schemaObject.prefixItems ?? (schemaObject.items as (SchemaObject | ReferenceObject)[]);\n itemType = ts.factory.createTupleTypeNode(prefixItems.map((item) => transformSchemaObject(item, options)));\n }\n // standard array type\n else if (schemaObject.items) {\n if (hasKey(schemaObject.items, \"type\") && schemaObject.items.type === \"array\") {\n itemType = ts.factory.createArrayTypeNode(transformSchemaObject(schemaObject.items, options));\n } else {\n itemType = transformSchemaObject(schemaObject.items, options);\n }\n }\n\n const min: number =\n typeof schemaObject.minItems === \"number\" && schemaObject.minItems >= 0 ? schemaObject.minItems : 0;\n const max: number | undefined =\n typeof schemaObject.maxItems === \"number\" && schemaObject.maxItems >= 0 && min <= schemaObject.maxItems\n ? schemaObject.maxItems\n : undefined;\n const estimateCodeSize = typeof max !== \"number\" ? min : (max * (max + 1) - min * (min - 1)) / 2;\n if (\n options.ctx.arrayLength &&\n (min !== 0 || max !== undefined) &&\n estimateCodeSize < 30 // \"30\" is an arbitrary number but roughly around when TS starts to struggle with tuple inference in practice\n ) {\n if (min === max) {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n return tsUnion([ts.factory.createTupleTypeNode(elements)]);\n } else if ((schemaObject.maxItems as number) > 0) {\n // if maxItems is set, then return a union of all permutations of possible tuple types\n const members: ts.TypeNode[] = [];\n // populate 1 short of min …\n for (let i = 0; i <= (max ?? 0) - min; i++) {\n const elements: ts.TypeNode[] = [];\n for (let j = min; j < i + min; j++) {\n elements.push(itemType);\n }\n members.push(ts.factory.createTupleTypeNode(elements));\n }\n return tsUnion(members);\n }\n // if maxItems not set, then return a simple tuple type the length of `min`\n else {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n elements.push(ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(itemType)));\n return ts.factory.createTupleTypeNode(elements);\n }\n }\n\n const finalType =\n ts.isTupleTypeNode(itemType) || ts.isArrayTypeNode(itemType)\n ? itemType\n : ts.factory.createArrayTypeNode(itemType); // wrap itemType in array type, but only if not a tuple or array already\n\n return options.ctx.immutable\n ? ts.factory.createTypeOperatorNode(ts.SyntaxKind.ReadonlyKeyword, finalType)\n : finalType;\n }\n\n // polymorphic, or 3.1 nullable\n if (Array.isArray(schemaObject.type) && !Array.isArray(schemaObject)) {\n // skip any primitive types that appear in oneOf as well\n const uniqueTypes: ts.TypeNode[] = [];\n if (Array.isArray(schemaObject.oneOf)) {\n for (const t of schemaObject.type) {\n if (\n (t === \"boolean\" || t === \"string\" || t === \"number\" || t === \"integer\" || t === \"null\") &&\n schemaObject.oneOf.find((o) => typeof o === \"object\" && \"type\" in o && o.type === t)\n ) {\n continue;\n }\n uniqueTypes.push(\n t === \"null\" || t === null\n ? NULL\n : transformSchemaObject(\n { ...schemaObject, type: t, oneOf: undefined } as SchemaObject, // don’t stack oneOf transforms\n options,\n ),\n );\n }\n } else {\n for (const t of schemaObject.type) {\n if (t === \"null\" || t === null) {\n uniqueTypes.push(NULL);\n } else {\n uniqueTypes.push(transformSchemaObject({ ...schemaObject, type: t } as SchemaObject, options));\n }\n }\n }\n return tsUnion(uniqueTypes);\n }\n }\n\n // type: object\n const coreObjectType: ts.TypeElement[] = [];\n\n // discriminators: explicit mapping on schema object\n for (const k of [\"allOf\", \"anyOf\"] as const) {\n if (!schemaObject[k]) {\n continue;\n }\n // for all magic inheritance, we will have already gathered it into\n // ctx.discriminators. But stop objects from referencing their own\n // discriminator meant for children (!schemaObject.discriminator)\n // and don't add discriminator properties if we already added/patched\n // them (options.ctx.discriminators.refsHandled.includes(options.path!).\n const discriminator =\n !schemaObject.discriminator &&\n !options.ctx.discriminators.refsHandled.includes(options.path ?? \"\") &&\n options.ctx.discriminators.objects[options.path ?? \"\"];\n if (discriminator) {\n coreObjectType.unshift(\n createDiscriminatorProperty(discriminator, {\n path: options.path ?? \"\",\n readonly: options.ctx.immutable,\n }),\n );\n break;\n }\n }\n\n if (\n (\"properties\" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) ||\n (\"additionalProperties\" in schemaObject && schemaObject.additionalProperties) ||\n (\"patternProperties\" in schemaObject && schemaObject.patternProperties) ||\n (\"$defs\" in schemaObject && schemaObject.$defs)\n ) {\n // properties\n if (Object.keys(schemaObject.properties ?? {}).length) {\n for (const [k, v] of getEntries(schemaObject.properties ?? {}, options.ctx)) {\n if ((typeof v !== \"object\" && typeof v !== \"boolean\") || Array.isArray(v)) {\n throw new Error(\n `${options.path}: invalid property ${k}. Expected Schema Object or boolean, got ${\n Array.isArray(v) ? \"Array\" : typeof v\n }`,\n );\n }\n\n const { $ref, readOnly, writeOnly, hasDefault } =\n typeof v === \"object\"\n ? {\n $ref: \"$ref\" in v && v.$ref,\n readOnly: \"readOnly\" in v && v.readOnly,\n writeOnly: \"writeOnly\" in v && v.writeOnly,\n hasDefault: \"default\" in v && v.default !== undefined,\n }\n : {};\n\n // handle excludeDeprecated option\n if (options.ctx.excludeDeprecated) {\n const resolved = $ref ? options.ctx.resolve($ref) : v;\n if ((resolved as SchemaObject)?.deprecated) {\n continue;\n }\n }\n let optional =\n schemaObject.required?.includes(k) ||\n (schemaObject.required === undefined && options.ctx.propertiesRequiredByDefault) ||\n (hasDefault &&\n options.ctx.defaultNonNullable &&\n !options.path?.includes(\"parameters\") &&\n !options.path?.includes(\"requestBody\") &&\n !options.path?.includes(\"requestBodies\")) // can’t be required, even with defaults\n ? undefined\n : QUESTION_TOKEN;\n let type = $ref\n ? oapiRef($ref)\n : transformSchemaObject(v, {\n ...options,\n path: createRef([options.path, k]),\n });\n\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(v as SchemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n type = result.schema;\n optional = result.questionToken ? QUESTION_TOKEN : optional;\n } else {\n type = result;\n }\n }\n }\n\n type = wrapWithReadWriteMarker(type, !!readOnly, !!writeOnly, options.ctx);\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && readOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ optional,\n /* type */ type,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n coreObjectType.push(property);\n }\n }\n\n // $defs\n if (schemaObject.$defs && typeof schemaObject.$defs === \"object\" && Object.keys(schemaObject.$defs).length) {\n const defKeys: ts.TypeElement[] = [];\n for (const [k, v] of Object.entries(schemaObject.$defs)) {\n const defReadOnly = \"readOnly\" in v && !!v.readOnly;\n const defWriteOnly = \"writeOnly\" in v && !!v.writeOnly;\n const defType = wrapWithReadWriteMarker(\n transformSchemaObject(v, { ...options, path: createRef([options.path, \"$defs\", k]) }),\n defReadOnly,\n defWriteOnly,\n options.ctx,\n );\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && defReadOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ undefined,\n /* type */ defType,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, \"$defs\", k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n defKeys.push(property);\n }\n coreObjectType.push(\n ts.factory.createPropertySignature(\n /* modifiers */ undefined,\n /* name */ tsPropertyIndex(\"$defs\"),\n /* questionToken */ undefined,\n /* type */ ts.factory.createTypeLiteralNode(defKeys),\n ),\n );\n }\n\n // additionalProperties / patternProperties\n const hasExplicitAdditionalProperties =\n typeof schemaObject.additionalProperties === \"object\" && Object.keys(schemaObject.additionalProperties).length;\n const hasImplicitAdditionalProperties =\n schemaObject.additionalProperties === true ||\n (typeof schemaObject.additionalProperties === \"object\" &&\n Object.keys(schemaObject.additionalProperties).length === 0);\n const hasExplicitPatternProperties =\n typeof schemaObject.patternProperties === \"object\" && Object.keys(schemaObject.patternProperties).length;\n const stringIndexTypes = [];\n if (hasExplicitAdditionalProperties) {\n stringIndexTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options, true));\n }\n if (hasImplicitAdditionalProperties || (!schemaObject.additionalProperties && options.ctx.additionalProperties)) {\n stringIndexTypes.push(UNKNOWN);\n }\n if (hasExplicitPatternProperties) {\n for (const [_, v] of getEntries(schemaObject.patternProperties ?? {}, options.ctx)) {\n stringIndexTypes.push(transformSchemaObject(v, options));\n }\n }\n\n if (stringIndexTypes.length === 0) {\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n }\n\n const stringIndexType = tsUnion(stringIndexTypes);\n\n return tsIntersection([\n ...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []),\n ts.factory.createTypeLiteralNode([\n ts.factory.createIndexSignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable,\n }),\n /* parameters */ [\n ts.factory.createParameterDeclaration(\n /* modifiers */ undefined,\n /* dotDotDotToken */ undefined,\n /* name */ ts.factory.createIdentifier(\"key\"),\n /* questionToken */ undefined,\n /* type */ STRING,\n ),\n ],\n /* type */ stringIndexType,\n ),\n ]),\n ]);\n }\n\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n}\n\n/**\n * Check if an object has a key\n * @param possibleObject - The object to check\n * @param key - The key to check for\n * @returns True if the object has the key, false otherwise\n */\nfunction hasKey(possibleObject: unknown, key: K): possibleObject is { [key in K]: unknown } {\n return typeof possibleObject === \"object\" && possibleObject !== null && key in possibleObject;\n}\n\n/** Wrap type with $Read or $Write marker when readWriteMarkers flag is enabled */\nfunction wrapWithReadWriteMarker(\n type: ts.TypeNode,\n readOnly: boolean,\n writeOnly: boolean,\n ctx: { readWriteMarkers: boolean },\n): ts.TypeNode {\n if (!ctx.readWriteMarkers || (readOnly && writeOnly)) {\n return type;\n }\n if (readOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Read\"), [type]);\n }\n if (writeOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Write\"), [type]);\n }\n return type;\n}\n"],"names":["enumType"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"schema-object.mjs","sources":["../../src/transform/schema-object.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport ts from \"typescript\";\nimport {\n addJSDocComment,\n BOOLEAN,\n NEVER,\n NULL,\n NUMBER,\n oapiRef,\n QUESTION_TOKEN,\n STRING,\n tsArrayLiteralExpression,\n tsEnum,\n tsIntersection,\n tsIsPrimitive,\n tsLiteral,\n tsModifiers,\n tsNullable,\n tsPropertyIndex,\n tsRecord,\n tsUnion,\n tsWithRequired,\n UNDEFINED,\n UNKNOWN,\n} from \"../lib/ts.js\";\nimport { createDiscriminatorProperty, createRef, getEntries } from \"../lib/utils.js\";\nimport type { ReferenceObject, SchemaObject, TransformNodeOptions } from \"../types.js\";\n\n/**\n * Transform SchemaObject nodes (4.8.24)\n * @see https://spec.openapis.org/oas/v3.1.0#schema-object\n */\nexport default function transformSchemaObject(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n const type = transformSchemaObjectWithComposition(schemaObject, options, fromAdditionalProperties);\n if (typeof options.ctx.postTransform === \"function\") {\n const postTransformResult = options.ctx.postTransform(type, options);\n if (postTransformResult) {\n return postTransformResult;\n }\n }\n return type;\n}\n\n/**\n * Transform SchemaObjects\n */\nexport function transformSchemaObjectWithComposition(\n schemaObject: SchemaObject | ReferenceObject,\n options: TransformNodeOptions,\n fromAdditionalProperties = false,\n): ts.TypeNode {\n /**\n * Unexpected types & edge cases\n */\n\n // missing/falsy type returns `never`\n if (!schemaObject) {\n return NEVER;\n }\n // `true` returns `unknown` (this exists, but is untyped)\n if ((schemaObject as unknown) === true) {\n return UNKNOWN;\n }\n // for any other unexpected type, throw error\n if (Array.isArray(schemaObject) || typeof schemaObject !== \"object\") {\n throw new Error(\n `Expected SchemaObject, received ${Array.isArray(schemaObject) ? \"Array\" : typeof schemaObject} at ${options.path}`,\n );\n }\n\n /**\n * ReferenceObject\n */\n if (\"$ref\" in schemaObject) {\n return oapiRef(schemaObject.$ref);\n }\n\n /**\n * const (valid for any type)\n */\n if (schemaObject.const !== null && schemaObject.const !== undefined) {\n return tsLiteral(schemaObject.const);\n }\n\n /**\n * enum (non-objects)\n * note: enum is valid for any type, but for objects, handle in oneOf below\n */\n if (\n Array.isArray(schemaObject.enum) &&\n (!(\"type\" in schemaObject) || schemaObject.type !== \"object\") &&\n !(\"properties\" in schemaObject)\n ) {\n const hasAdditionalProperties = \"additionalProperties\" in schemaObject && !!schemaObject.additionalProperties;\n\n if (!hasAdditionalProperties || (schemaObject.type === \"string\" && hasAdditionalProperties)) {\n // hoist enum to top level if string/number enum and option is enabled\n if (shouldTransformToTsEnum(options, schemaObject)) {\n let enumName = parseRef(options.path ?? \"\").pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumName = enumName.replace(\"components/schemas\", \"\");\n const metadata = schemaObject.enum.map((_, i) => ({\n name: schemaObject[\"x-enum-varnames\"]?.[i] ?? schemaObject[\"x-enumNames\"]?.[i],\n description: schemaObject[\"x-enum-descriptions\"]?.[i] ?? schemaObject[\"x-enumDescriptions\"]?.[i],\n }));\n\n // enums can contain null values, but dont want to output them\n let hasNull = false;\n const validSchemaEnums = schemaObject.enum.filter((enumValue) => {\n if (enumValue === null) {\n hasNull = true;\n return false;\n }\n\n return true;\n });\n const enumType = tsEnum(enumName, validSchemaEnums as (string | number)[], metadata, {\n shouldCache: options.ctx.dedupeEnums,\n export: true,\n // readonly: TS enum do not support the readonly modifier\n });\n if (!options.ctx.injectFooter.includes(enumType)) {\n options.ctx.injectFooter.push(enumType);\n }\n const ref = ts.factory.createTypeReferenceNode(enumType.name);\n\n const finalType: ts.TypeNode = hasNull ? tsUnion([ref, NULL]) : ref;\n\n return applyAdditionalPropertiesToEnum(hasAdditionalProperties, finalType, schemaObject);\n }\n\n const enumType = schemaObject.enum.map(tsLiteral);\n if ((Array.isArray(schemaObject.type) && schemaObject.type.includes(\"null\")) || schemaObject.nullable) {\n enumType.push(NULL);\n }\n\n const unionType = applyAdditionalPropertiesToEnum(hasAdditionalProperties, tsUnion(enumType), schemaObject);\n\n // hoist array with valid enum values to top level if string/number enum and option is enabled\n if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === \"string\" || typeof v === \"number\")) {\n const parsed = parseRef(options.path ?? \"\");\n let enumValuesVariableName = parsed.pointer.join(\"/\");\n // allow #/components/schemas to have simpler names\n enumValuesVariableName = enumValuesVariableName.replace(\"components/schemas\", \"\");\n enumValuesVariableName = `${enumValuesVariableName}Values`;\n\n // build a ref path for the type that ignores union indices (anyOf/oneOf) so\n // type references remain stable even when names include union positions\n const cleanedPointer: string[] = [];\n // Track ALL properties after a oneOf/anyOf that need Extract<> narrowing.\n // We apply Extract<> before EVERY property access after a union index because:\n // - When the property exists on ALL variants, Extract<> is a no-op (returns same type)\n // - When the property only exists on SOME variants, it correctly narrows the union\n // - When both variants have same property name but different inner schemas,\n // we still narrow at each level to handle nested unions correctly\n // This robust approach handles both simple and complex union structures.\n const extractProperties: string[] = [];\n for (let i = 0; i < parsed.pointer.length; i++) {\n // Example: #/paths/analytics/data/get/responses/400/content/application/json/anyOf/0/message\n const segment = parsed.pointer[i];\n if ((segment === \"anyOf\" || segment === \"oneOf\") && i < parsed.pointer.length - 1) {\n const next = parsed.pointer[i + 1];\n if (/^\\d+$/.test(next)) {\n // If we encounter something like \"anyOf/0\", we want to skip that part of the path\n i++;\n // Collect ALL remaining segments after the union index.\n // Each one will be wrapped with Extract<> to safely narrow the type\n // at each level, handling both top-level and nested union variants.\n const remainingSegments = parsed.pointer.slice(i + 1);\n for (const seg of remainingSegments) {\n // Skip union keywords and indices, only add actual property names\n if (seg !== \"anyOf\" && seg !== \"oneOf\" && !/^\\d+$/.test(seg)) {\n extractProperties.push(seg);\n }\n }\n continue;\n }\n }\n cleanedPointer.push(segment);\n }\n const cleanedRefPath = createRef(cleanedPointer);\n\n const enumValuesArray = tsArrayLiteralExpression(\n enumValuesVariableName,\n // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type\n fromAdditionalProperties\n ? ts.factory.createIndexedAccessTypeNode(\n oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"string\")),\n )\n : oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }),\n schemaObject.enum as (string | number)[],\n {\n export: true,\n readonly: true,\n injectFooter: options.ctx.injectFooter,\n },\n );\n\n options.ctx.injectFooter.push(enumValuesArray);\n }\n\n return unionType;\n }\n }\n\n /**\n * Object + composition (anyOf/allOf/oneOf) types\n */\n\n /** Collect oneOf/anyOf */\n function collectUnionCompositions(items: (SchemaObject | ReferenceObject)[], unionKey: \"anyOf\" | \"oneOf\") {\n const output: ts.TypeNode[] = [];\n for (const [index, item] of items.entries()) {\n output.push(\n transformSchemaObject(item, {\n ...options,\n // include index in path so generated names from nested enums/enumValues are unique\n path: createRef([options.path, unionKey, String(index)]),\n }),\n );\n }\n\n return output;\n }\n\n /** Collect allOf with Omit<> for discriminators */\n function collectAllOfCompositions(items: (SchemaObject | ReferenceObject)[], required?: string[]): ts.TypeNode[] {\n const output: ts.TypeNode[] = [];\n for (const item of items) {\n let itemType: ts.TypeNode;\n // if this is a $ref, use WithRequired if parent specifies required properties\n // (but only for valid keys)\n if (\"$ref\" in item) {\n itemType = transformSchemaObject(item, options);\n\n const resolved = options.ctx.resolve(item.$ref);\n\n // make keys required, if necessary\n if (\n resolved &&\n typeof resolved === \"object\" &&\n \"properties\" in resolved &&\n // we have already handled this item (discriminator property was already added as required)\n !options.ctx.discriminators.refsHandled.includes(item.$ref)\n ) {\n // add WithRequired if necessary\n const validRequired = (required ?? []).filter((key) => !!resolved.properties?.[key]);\n if (validRequired.length) {\n itemType = tsWithRequired(itemType, validRequired, options.ctx.injectFooter);\n }\n }\n }\n // otherwise, if this is a schema object, combine parent `required[]` with its own, if any\n else {\n const itemRequired = [...(required ?? [])];\n if (typeof item === \"object\" && Array.isArray(item.required)) {\n itemRequired.push(...item.required);\n }\n itemType = transformSchemaObject({ ...item, required: itemRequired }, options);\n }\n\n output.push(itemType);\n }\n return output;\n }\n\n // compile final type\n let finalType: ts.TypeNode | undefined;\n\n // core + allOf: intersect\n const coreObjectType = transformSchemaObjectCore(schemaObject, options);\n const allOfType = collectAllOfCompositions(schemaObject.allOf ?? [], schemaObject.required);\n if (coreObjectType || allOfType.length) {\n const allOf: ts.TypeNode | undefined = allOfType.length ? tsIntersection(allOfType) : undefined;\n finalType = tsIntersection([...(coreObjectType ? [coreObjectType] : []), ...(allOf ? [allOf] : [])]);\n }\n // anyOf: union\n // (note: this may seem counterintuitive, but as TypeScript’s unions are not true XORs, they mimic behavior closer to anyOf than oneOf)\n const anyOfType = collectUnionCompositions(schemaObject.anyOf ?? [], \"anyOf\");\n if (anyOfType.length) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...anyOfType]);\n }\n // oneOf: union (within intersection with other types, if any)\n const oneOfType = collectUnionCompositions(\n schemaObject.oneOf ||\n (\"type\" in schemaObject &&\n schemaObject.type === \"object\" &&\n (schemaObject.enum as (SchemaObject | ReferenceObject)[])) ||\n [],\n \"oneOf\",\n );\n if (oneOfType.length) {\n // note: oneOf is the only type that may include primitives\n if (oneOfType.every(tsIsPrimitive)) {\n finalType = tsUnion([...(finalType ? [finalType] : []), ...oneOfType]);\n } else {\n finalType = tsIntersection([...(finalType ? [finalType] : []), tsUnion(oneOfType)]);\n }\n }\n\n // When no final type can be generated, fall back to unknown type (or related variants)\n if (!finalType) {\n if (\"type\" in schemaObject) {\n finalType = tsRecord(STRING, options.ctx.emptyObjectsUnknown ? UNKNOWN : NEVER);\n } else {\n finalType = UNKNOWN;\n }\n }\n\n if (finalType !== UNKNOWN && schemaObject.nullable) {\n finalType = tsNullable([finalType]);\n }\n\n return finalType;\n}\n\n/**\n * Check if the given OAPI enum should be transformed to a TypeScript enum\n */\nfunction shouldTransformToTsEnum(options: TransformNodeOptions, schemaObject: SchemaObject): boolean {\n // Enum conversion not enabled or no enum present\n if (!options.ctx.enum || !schemaObject.enum) {\n return false;\n }\n\n // Enum must have string, number or null values\n if (!schemaObject.enum.every((v) => [\"string\", \"number\", null].includes(typeof v))) {\n return false;\n }\n\n // If conditionalEnums is enabled, only convert if x-enum-* metadata is present\n if (options.ctx.conditionalEnums) {\n const hasEnumMetadata =\n Array.isArray(schemaObject[\"x-enum-varnames\"]) ||\n Array.isArray(schemaObject[\"x-enumNames\"]) ||\n Array.isArray(schemaObject[\"x-enum-descriptions\"]) ||\n Array.isArray(schemaObject[\"x-enumDescriptions\"]);\n if (!hasEnumMetadata) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Handle SchemaObject minus composition (anyOf/allOf/oneOf)\n */\nfunction transformSchemaObjectCore(schemaObject: SchemaObject, options: TransformNodeOptions): ts.TypeNode | undefined {\n if (\"type\" in schemaObject && schemaObject.type) {\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(schemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n if (result.questionToken) {\n return ts.factory.createUnionTypeNode([result.schema, UNDEFINED]);\n } else {\n return result.schema;\n }\n } else {\n return result;\n }\n }\n }\n\n // primitives\n // type: null\n if (schemaObject.type === \"null\") {\n return NULL;\n }\n // type: string\n if (schemaObject.type === \"string\") {\n return STRING;\n }\n // type: number / type: integer\n if (schemaObject.type === \"number\" || schemaObject.type === \"integer\") {\n return NUMBER;\n }\n // type: boolean\n if (schemaObject.type === \"boolean\") {\n return BOOLEAN;\n }\n\n // type: array (with support for tuples)\n if (schemaObject.type === \"array\") {\n // default to `unknown[]`\n let itemType: ts.TypeNode = UNKNOWN;\n // tuple type\n if (schemaObject.prefixItems || Array.isArray(schemaObject.items)) {\n const prefixItems = schemaObject.prefixItems ?? (schemaObject.items as (SchemaObject | ReferenceObject)[]);\n itemType = ts.factory.createTupleTypeNode(prefixItems.map((item) => transformSchemaObject(item, options)));\n }\n // standard array type\n else if (schemaObject.items) {\n if (hasKey(schemaObject.items, \"type\") && schemaObject.items.type === \"array\") {\n itemType = ts.factory.createArrayTypeNode(transformSchemaObject(schemaObject.items, options));\n } else {\n itemType = transformSchemaObject(schemaObject.items, options);\n }\n }\n\n const min: number =\n typeof schemaObject.minItems === \"number\" && schemaObject.minItems >= 0 ? schemaObject.minItems : 0;\n const max: number | undefined =\n typeof schemaObject.maxItems === \"number\" && schemaObject.maxItems >= 0 && min <= schemaObject.maxItems\n ? schemaObject.maxItems\n : undefined;\n const estimateCodeSize = typeof max !== \"number\" ? min : (max * (max + 1) - min * (min - 1)) / 2;\n if (\n options.ctx.arrayLength &&\n (min !== 0 || max !== undefined) &&\n estimateCodeSize < 30 // \"30\" is an arbitrary number but roughly around when TS starts to struggle with tuple inference in practice\n ) {\n if (min === max) {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n return tsUnion([ts.factory.createTupleTypeNode(elements)]);\n } else if ((schemaObject.maxItems as number) > 0) {\n // if maxItems is set, then return a union of all permutations of possible tuple types\n const members: ts.TypeNode[] = [];\n // populate 1 short of min …\n for (let i = 0; i <= (max ?? 0) - min; i++) {\n const elements: ts.TypeNode[] = [];\n for (let j = min; j < i + min; j++) {\n elements.push(itemType);\n }\n members.push(ts.factory.createTupleTypeNode(elements));\n }\n return tsUnion(members);\n }\n // if maxItems not set, then return a simple tuple type the length of `min`\n else {\n const elements: ts.TypeNode[] = [];\n for (let i = 0; i < min; i++) {\n elements.push(itemType);\n }\n elements.push(ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(itemType)));\n return ts.factory.createTupleTypeNode(elements);\n }\n }\n\n const finalType =\n ts.isTupleTypeNode(itemType) || ts.isArrayTypeNode(itemType)\n ? itemType\n : ts.factory.createArrayTypeNode(itemType); // wrap itemType in array type, but only if not a tuple or array already\n\n return options.ctx.immutable\n ? ts.factory.createTypeOperatorNode(ts.SyntaxKind.ReadonlyKeyword, finalType)\n : finalType;\n }\n\n // polymorphic, or 3.1 nullable\n if (Array.isArray(schemaObject.type) && !Array.isArray(schemaObject)) {\n // skip any primitive types that appear in oneOf as well\n const uniqueTypes: ts.TypeNode[] = [];\n if (Array.isArray(schemaObject.oneOf)) {\n for (const t of schemaObject.type) {\n if (\n (t === \"boolean\" || t === \"string\" || t === \"number\" || t === \"integer\" || t === \"null\") &&\n schemaObject.oneOf.find((o) => typeof o === \"object\" && \"type\" in o && o.type === t)\n ) {\n continue;\n }\n uniqueTypes.push(\n t === \"null\" || t === null\n ? NULL\n : transformSchemaObject(\n { ...schemaObject, type: t, oneOf: undefined } as SchemaObject, // don’t stack oneOf transforms\n options,\n ),\n );\n }\n } else {\n for (const t of schemaObject.type) {\n if (t === \"null\" || t === null) {\n uniqueTypes.push(NULL);\n } else {\n uniqueTypes.push(transformSchemaObject({ ...schemaObject, type: t } as SchemaObject, options));\n }\n }\n }\n return tsUnion(uniqueTypes);\n }\n }\n\n // type: object\n const coreObjectType: ts.TypeElement[] = [];\n\n // discriminators: explicit mapping on schema object\n for (const k of [\"allOf\", \"anyOf\"] as const) {\n if (!schemaObject[k]) {\n continue;\n }\n // for all magic inheritance, we will have already gathered it into\n // ctx.discriminators. But stop objects from referencing their own\n // discriminator meant for children (!schemaObject.discriminator)\n // and don't add discriminator properties if we already added/patched\n // them (options.ctx.discriminators.refsHandled.includes(options.path!).\n const discriminator =\n !schemaObject.discriminator &&\n !options.ctx.discriminators.refsHandled.includes(options.path ?? \"\") &&\n options.ctx.discriminators.objects[options.path ?? \"\"];\n if (discriminator) {\n coreObjectType.unshift(\n createDiscriminatorProperty(discriminator, {\n path: options.path ?? \"\",\n readonly: options.ctx.immutable,\n }),\n );\n break;\n }\n }\n\n if (\n (\"properties\" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) ||\n (\"additionalProperties\" in schemaObject && schemaObject.additionalProperties) ||\n (\"patternProperties\" in schemaObject && schemaObject.patternProperties) ||\n (\"$defs\" in schemaObject && schemaObject.$defs)\n ) {\n // properties\n if (\"properties\" in schemaObject && schemaObject.properties && Object.keys(schemaObject?.properties).length) {\n for (const [k, v] of getEntries(schemaObject.properties ?? {}, options.ctx)) {\n if ((typeof v !== \"object\" && typeof v !== \"boolean\") || Array.isArray(v)) {\n throw new Error(\n `${options.path}: invalid property ${k}. Expected Schema Object or boolean, got ${\n Array.isArray(v) ? \"Array\" : typeof v\n }`,\n );\n }\n\n const { $ref, readOnly, writeOnly, hasDefault } =\n typeof v === \"object\"\n ? {\n $ref: \"$ref\" in v && v.$ref,\n readOnly: \"readOnly\" in v && v.readOnly,\n writeOnly: \"writeOnly\" in v && v.writeOnly,\n hasDefault: \"default\" in v && v.default !== undefined,\n }\n : {};\n\n // handle excludeDeprecated option\n if (options.ctx.excludeDeprecated) {\n const resolved = $ref ? options.ctx.resolve($ref) : v;\n if ((resolved as SchemaObject)?.deprecated) {\n continue;\n }\n }\n let optional =\n schemaObject.required?.includes(k) ||\n (schemaObject.required === undefined && options.ctx.propertiesRequiredByDefault) ||\n (hasDefault &&\n options.ctx.defaultNonNullable &&\n !options.path?.includes(\"parameters\") &&\n !options.path?.includes(\"requestBody\") &&\n !options.path?.includes(\"requestBodies\")) // can’t be required, even with defaults\n ? undefined\n : QUESTION_TOKEN;\n let type = $ref\n ? oapiRef($ref)\n : transformSchemaObject(v, {\n ...options,\n path: createRef([options.path, k]),\n });\n\n if (typeof options.ctx.transform === \"function\") {\n const result = options.ctx.transform(v as SchemaObject, options);\n if (result && typeof result === \"object\") {\n if (\"schema\" in result) {\n type = result.schema;\n optional = result.questionToken ? QUESTION_TOKEN : optional;\n } else {\n type = result;\n }\n }\n }\n\n type = wrapWithReadWriteMarker(type, !!readOnly, !!writeOnly, options.ctx);\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && readOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ optional,\n /* type */ type,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n coreObjectType.push(property);\n }\n }\n\n // $defs\n if (\"$defs\" in schemaObject && typeof schemaObject.$defs === \"object\" && Object.keys(schemaObject.$defs).length) {\n const defKeys: ts.TypeElement[] = [];\n for (const [k, v] of Object.entries(schemaObject.$defs)) {\n const defReadOnly = \"readOnly\" in v && !!v.readOnly;\n const defWriteOnly = \"writeOnly\" in v && !!v.writeOnly;\n const defType = wrapWithReadWriteMarker(\n transformSchemaObject(v, { ...options, path: createRef([options.path, \"$defs\", k]) }),\n defReadOnly,\n defWriteOnly,\n options.ctx,\n );\n\n let property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable || (!options.ctx.readWriteMarkers && defReadOnly),\n }),\n /* name */ tsPropertyIndex(k),\n /* questionToken */ undefined,\n /* type */ defType,\n );\n\n // Apply transformProperty hook if available\n if (typeof options.ctx.transformProperty === \"function\") {\n const result = options.ctx.transformProperty(property, v as SchemaObject, {\n ...options,\n path: createRef([options.path, \"$defs\", k]),\n });\n if (result) {\n property = result;\n }\n }\n\n addJSDocComment(v, property);\n defKeys.push(property);\n }\n coreObjectType.push(\n ts.factory.createPropertySignature(\n /* modifiers */ undefined,\n /* name */ tsPropertyIndex(\"$defs\"),\n /* questionToken */ undefined,\n /* type */ ts.factory.createTypeLiteralNode(defKeys),\n ),\n );\n }\n\n // additionalProperties / patternProperties\n const hasExplicitAdditionalProperties =\n typeof schemaObject.additionalProperties === \"object\" && Object.keys(schemaObject.additionalProperties).length;\n const hasImplicitAdditionalProperties =\n schemaObject.additionalProperties === true ||\n (typeof schemaObject.additionalProperties === \"object\" &&\n Object.keys(schemaObject.additionalProperties).length === 0);\n const patternProperties = hasKey(schemaObject, \"patternProperties\") ? schemaObject.patternProperties : undefined;\n const hasExplicitPatternProperties =\n typeof patternProperties === \"object\" && patternProperties !== null && Object.keys(patternProperties).length > 0;\n const stringIndexTypes = [];\n if (hasExplicitAdditionalProperties) {\n stringIndexTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options, true));\n }\n if (hasImplicitAdditionalProperties || (!schemaObject.additionalProperties && options.ctx.additionalProperties)) {\n stringIndexTypes.push(UNKNOWN);\n }\n if (hasExplicitPatternProperties && patternProperties && typeof patternProperties === \"object\") {\n for (const [_, v] of getEntries(\n patternProperties as Record,\n options.ctx,\n )) {\n stringIndexTypes.push(transformSchemaObject(v, options));\n }\n }\n\n if (stringIndexTypes.length === 0) {\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n }\n\n const stringIndexType = tsUnion(stringIndexTypes);\n\n return tsIntersection([\n ...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []),\n ts.factory.createTypeLiteralNode([\n ts.factory.createIndexSignature(\n /* modifiers */ tsModifiers({\n readonly: options.ctx.immutable,\n }),\n /* parameters */ [\n ts.factory.createParameterDeclaration(\n /* modifiers */ undefined,\n /* dotDotDotToken */ undefined,\n /* name */ ts.factory.createIdentifier(\"key\"),\n /* questionToken */ undefined,\n /* type */ STRING,\n ),\n ],\n /* type */ stringIndexType,\n ),\n ]),\n ]);\n }\n\n return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined;\n}\n\n/**\n * Check if an object has a key\n * @param possibleObject - The object to check\n * @param key - The key to check for\n * @returns True if the object has the key, false otherwise\n */\nfunction hasKey(possibleObject: unknown, key: K): possibleObject is { [key in K]: unknown } {\n return typeof possibleObject === \"object\" && possibleObject !== null && key in possibleObject;\n}\n\nfunction applyAdditionalPropertiesToEnum(\n hasAdditionalProperties: boolean,\n unionType: ts.TypeNode,\n schemaObject: SchemaObject,\n) {\n // If additionalProperties is true, add (string & {}) to the union\n if (hasAdditionalProperties && schemaObject.type === \"string\") {\n const stringAndEmptyObject = tsIntersection([STRING, ts.factory.createTypeLiteralNode([])]);\n return tsUnion([unionType, stringAndEmptyObject]);\n }\n return unionType;\n}\n\n/** Wrap type with $Read or $Write marker when readWriteMarkers flag is enabled */\nfunction wrapWithReadWriteMarker(\n type: ts.TypeNode,\n readOnly: boolean,\n writeOnly: boolean,\n ctx: { readWriteMarkers: boolean },\n): ts.TypeNode {\n if (!ctx.readWriteMarkers || (readOnly && writeOnly)) {\n return type;\n }\n if (readOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Read\"), [type]);\n }\n if (writeOnly) {\n return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(\"$Write\"), [type]);\n }\n return type;\n}\n"],"names":["enumType","finalType"],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/index.cjs b/package/dist/index.cjs new file mode 100644 index 0000000000000000000000000000000000000000..a2a38744991540e00b6a085aed403feedf0c51b6 --- /dev/null +++ b/package/dist/index.cjs @@ -0,0 +1,3362 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __typeError = (msg) => { + throw TypeError(msg); +}; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); +var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); +var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); +var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value); + +// ../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js +var require_picocolors = __commonJS({ + "../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js"(exports2, module2) { + var p = process || {}; + var argv = p.argv || []; + var env2 = p.env || {}; + var isColorSupported = !(!!env2.NO_COLOR || argv.includes("--no-color")) && (!!env2.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env2.TERM !== "dumb" || !!env2.CI); + var formatter = (open, close, replace = open) => (input) => { + let string = "" + input, index = string.indexOf(close, open.length); + return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close; + }; + var replaceClose = (string, close, replace, index) => { + let result = "", cursor = 0; + do { + result += string.substring(cursor, index) + replace; + cursor = index + close.length; + index = string.indexOf(close, cursor); + } while (~index); + return result + string.substring(cursor); + }; + var createColors = (enabled = isColorSupported) => { + let f = enabled ? formatter : () => String; + return { + isColorSupported: enabled, + reset: f("\x1B[0m", "\x1B[0m"), + bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"), + dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"), + italic: f("\x1B[3m", "\x1B[23m"), + underline: f("\x1B[4m", "\x1B[24m"), + inverse: f("\x1B[7m", "\x1B[27m"), + hidden: f("\x1B[8m", "\x1B[28m"), + strikethrough: f("\x1B[9m", "\x1B[29m"), + black: f("\x1B[30m", "\x1B[39m"), + red: f("\x1B[31m", "\x1B[39m"), + green: f("\x1B[32m", "\x1B[39m"), + yellow: f("\x1B[33m", "\x1B[39m"), + blue: f("\x1B[34m", "\x1B[39m"), + magenta: f("\x1B[35m", "\x1B[39m"), + cyan: f("\x1B[36m", "\x1B[39m"), + white: f("\x1B[37m", "\x1B[39m"), + gray: f("\x1B[90m", "\x1B[39m"), + bgBlack: f("\x1B[40m", "\x1B[49m"), + bgRed: f("\x1B[41m", "\x1B[49m"), + bgGreen: f("\x1B[42m", "\x1B[49m"), + bgYellow: f("\x1B[43m", "\x1B[49m"), + bgBlue: f("\x1B[44m", "\x1B[49m"), + bgMagenta: f("\x1B[45m", "\x1B[49m"), + bgCyan: f("\x1B[46m", "\x1B[49m"), + bgWhite: f("\x1B[47m", "\x1B[49m"), + blackBright: f("\x1B[90m", "\x1B[39m"), + redBright: f("\x1B[91m", "\x1B[39m"), + greenBright: f("\x1B[92m", "\x1B[39m"), + yellowBright: f("\x1B[93m", "\x1B[39m"), + blueBright: f("\x1B[94m", "\x1B[39m"), + magentaBright: f("\x1B[95m", "\x1B[39m"), + cyanBright: f("\x1B[96m", "\x1B[39m"), + whiteBright: f("\x1B[97m", "\x1B[39m"), + bgBlackBright: f("\x1B[100m", "\x1B[49m"), + bgRedBright: f("\x1B[101m", "\x1B[49m"), + bgGreenBright: f("\x1B[102m", "\x1B[49m"), + bgYellowBright: f("\x1B[103m", "\x1B[49m"), + bgBlueBright: f("\x1B[104m", "\x1B[49m"), + bgMagentaBright: f("\x1B[105m", "\x1B[49m"), + bgCyanBright: f("\x1B[106m", "\x1B[49m"), + bgWhiteBright: f("\x1B[107m", "\x1B[49m") + }; + }; + module2.exports = createColors(); + module2.exports.createColors = createColors; + } +}); + +// ../../node_modules/.pnpm/js-tokens@4.0.0/node_modules/js-tokens/index.js +var require_js_tokens = __commonJS({ + "../../node_modules/.pnpm/js-tokens@4.0.0/node_modules/js-tokens/index.js"(exports2) { + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g; + exports2.matchToToken = function(match) { + var token = { type: "invalid", value: match[0], closed: void 0 }; + if (match[1]) token.type = "string", token.closed = !!(match[3] || match[4]); + else if (match[5]) token.type = "comment"; + else if (match[6]) token.type = "comment", token.closed = !!match[7]; + else if (match[8]) token.type = "regex"; + else if (match[9]) token.type = "number"; + else if (match[10]) token.type = "name"; + else if (match[11]) token.type = "punctuator"; + else if (match[12]) token.type = "whitespace"; + return token; + }; + } +}); + +// ../../node_modules/.pnpm/@babel+helper-validator-identifier@7.25.9/node_modules/@babel/helper-validator-identifier/lib/identifier.js +var require_identifier = __commonJS({ + "../../node_modules/.pnpm/@babel+helper-validator-identifier@7.25.9/node_modules/@babel/helper-validator-identifier/lib/identifier.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.isIdentifierChar = isIdentifierChar; + exports2.isIdentifierName = isIdentifierName; + exports2.isIdentifierStart = isIdentifierStart; + var nonASCIIidentifierStartChars = "\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CD\uA7D0\uA7D1\uA7D3\uA7D5-\uA7DC\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC"; + var nonASCIIidentifierChars = "\xB7\u0300-\u036F\u0387\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u0669\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u06F0-\u06F9\u0711\u0730-\u074A\u07A6-\u07B0\u07C0-\u07C9\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0897-\u089F\u08CA-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0966-\u096F\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09E6-\u09EF\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A66-\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AE6-\u0AEF\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B62\u0B63\u0B66-\u0B6F\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE6-\u0BEF\u0C00-\u0C04\u0C3C\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0CE6-\u0CEF\u0CF3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D66-\u0D6F\u0D81-\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0E50-\u0E59\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECE\u0ED0-\u0ED9\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1040-\u1049\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F-\u109D\u135D-\u135F\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u18A9\u1920-\u192B\u1930-\u193B\u1946-\u194F\u19D0-\u19DA\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B04\u1B34-\u1B44\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BB0-\u1BB9\u1BE6-\u1BF3\u1C24-\u1C37\u1C40-\u1C49\u1C50-\u1C59\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DFF\u200C\u200D\u203F\u2040\u2054\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\u30FB\uA620-\uA629\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA82C\uA880\uA881\uA8B4-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F1\uA8FF-\uA909\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9D0-\uA9D9\uA9E5\uA9F0-\uA9F9\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA50-\uAA59\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uABF0-\uABF9\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFF10-\uFF19\uFF3F\uFF65"; + var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; + var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; + var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + function isInAstralSet(code, set) { + let pos = 65536; + for (let i = 0, length = set.length; i < length; i += 2) { + pos += set[i]; + if (pos > code) return false; + pos += set[i + 1]; + if (pos >= code) return true; + } + return false; + } + function isIdentifierStart(code) { + if (code < 65) return code === 36; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 65535) { + return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes); + } + function isIdentifierChar(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + if (code <= 65535) { + return code >= 170 && nonASCIIidentifier.test(String.fromCharCode(code)); + } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); + } + function isIdentifierName(name) { + let isFirst = true; + for (let i = 0; i < name.length; i++) { + let cp = name.charCodeAt(i); + if ((cp & 64512) === 55296 && i + 1 < name.length) { + const trail = name.charCodeAt(++i); + if ((trail & 64512) === 56320) { + cp = 65536 + ((cp & 1023) << 10) + (trail & 1023); + } + } + if (isFirst) { + isFirst = false; + if (!isIdentifierStart(cp)) { + return false; + } + } else if (!isIdentifierChar(cp)) { + return false; + } + } + return !isFirst; + } + } +}); + +// ../../node_modules/.pnpm/@babel+helper-validator-identifier@7.25.9/node_modules/@babel/helper-validator-identifier/lib/keyword.js +var require_keyword = __commonJS({ + "../../node_modules/.pnpm/@babel+helper-validator-identifier@7.25.9/node_modules/@babel/helper-validator-identifier/lib/keyword.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.isKeyword = isKeyword; + exports2.isReservedWord = isReservedWord; + exports2.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; + exports2.isStrictBindReservedWord = isStrictBindReservedWord; + exports2.isStrictReservedWord = isStrictReservedWord; + var reservedWords = { + keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], + strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], + strictBind: ["eval", "arguments"] + }; + var keywords = new Set(reservedWords.keyword); + var reservedWordsStrictSet = new Set(reservedWords.strict); + var reservedWordsStrictBindSet = new Set(reservedWords.strictBind); + function isReservedWord(word, inModule) { + return inModule && word === "await" || word === "enum"; + } + function isStrictReservedWord(word, inModule) { + return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); + } + function isStrictBindOnlyReservedWord(word) { + return reservedWordsStrictBindSet.has(word); + } + function isStrictBindReservedWord(word, inModule) { + return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); + } + function isKeyword(word) { + return keywords.has(word); + } + } +}); + +// ../../node_modules/.pnpm/@babel+helper-validator-identifier@7.25.9/node_modules/@babel/helper-validator-identifier/lib/index.js +var require_lib = __commonJS({ + "../../node_modules/.pnpm/@babel+helper-validator-identifier@7.25.9/node_modules/@babel/helper-validator-identifier/lib/index.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + Object.defineProperty(exports2, "isIdentifierChar", { + enumerable: true, + get: function() { + return _identifier.isIdentifierChar; + } + }); + Object.defineProperty(exports2, "isIdentifierName", { + enumerable: true, + get: function() { + return _identifier.isIdentifierName; + } + }); + Object.defineProperty(exports2, "isIdentifierStart", { + enumerable: true, + get: function() { + return _identifier.isIdentifierStart; + } + }); + Object.defineProperty(exports2, "isKeyword", { + enumerable: true, + get: function() { + return _keyword.isKeyword; + } + }); + Object.defineProperty(exports2, "isReservedWord", { + enumerable: true, + get: function() { + return _keyword.isReservedWord; + } + }); + Object.defineProperty(exports2, "isStrictBindOnlyReservedWord", { + enumerable: true, + get: function() { + return _keyword.isStrictBindOnlyReservedWord; + } + }); + Object.defineProperty(exports2, "isStrictBindReservedWord", { + enumerable: true, + get: function() { + return _keyword.isStrictBindReservedWord; + } + }); + Object.defineProperty(exports2, "isStrictReservedWord", { + enumerable: true, + get: function() { + return _keyword.isStrictReservedWord; + } + }); + var _identifier = require_identifier(); + var _keyword = require_keyword(); + } +}); + +// ../../node_modules/.pnpm/@babel+code-frame@7.26.2/node_modules/@babel/code-frame/lib/index.js +var require_lib2 = __commonJS({ + "../../node_modules/.pnpm/@babel+code-frame@7.26.2/node_modules/@babel/code-frame/lib/index.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + var picocolors = require_picocolors(); + var jsTokens = require_js_tokens(); + var helperValidatorIdentifier = require_lib(); + function isColorSupported() { + return typeof process === "object" && (process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false") ? false : picocolors.isColorSupported; + } + var compose = (f, g) => (v) => f(g(v)); + function buildDefs(colors) { + return { + keyword: colors.cyan, + capitalized: colors.yellow, + jsxIdentifier: colors.yellow, + punctuator: colors.yellow, + number: colors.magenta, + string: colors.green, + regex: colors.magenta, + comment: colors.gray, + invalid: compose(compose(colors.white, colors.bgRed), colors.bold), + gutter: colors.gray, + marker: compose(colors.red, colors.bold), + message: compose(colors.red, colors.bold), + reset: colors.reset + }; + } + var defsOn = buildDefs(picocolors.createColors(true)); + var defsOff = buildDefs(picocolors.createColors(false)); + function getDefs(enabled) { + return enabled ? defsOn : defsOff; + } + var sometimesKeywords = /* @__PURE__ */ new Set(["as", "async", "from", "get", "of", "set"]); + var NEWLINE$1 = /\r\n|[\n\r\u2028\u2029]/; + var BRACKET = /^[()[\]{}]$/; + var tokenize; + { + const JSX_TAG = /^[a-z][\w-]*$/i; + const getTokenType = function(token, offset, text) { + if (token.type === "name") { + if (helperValidatorIdentifier.isKeyword(token.value) || helperValidatorIdentifier.isStrictReservedWord(token.value, true) || sometimesKeywords.has(token.value)) { + return "keyword"; + } + if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.slice(offset - 2, offset) === " defs[type](str)).join("\n"); + } else { + highlighted += value; + } + } + return highlighted; + } + var deprecationWarningShown = false; + var NEWLINE = /\r\n|[\n\r\u2028\u2029]/; + function getMarkerLines(loc, source, opts) { + const startLoc = Object.assign({ + column: 0, + line: -1 + }, loc.start); + const endLoc = Object.assign({}, startLoc, loc.end); + const { + linesAbove = 2, + linesBelow = 3 + } = opts || {}; + const startLine = startLoc.line; + const startColumn = startLoc.column; + const endLine = endLoc.line; + const endColumn = endLoc.column; + let start = Math.max(startLine - (linesAbove + 1), 0); + let end = Math.min(source.length, endLine + linesBelow); + if (startLine === -1) { + start = 0; + } + if (endLine === -1) { + end = source.length; + } + const lineDiff = endLine - startLine; + const markerLines = {}; + if (lineDiff) { + for (let i = 0; i <= lineDiff; i++) { + const lineNumber = i + startLine; + if (!startColumn) { + markerLines[lineNumber] = true; + } else if (i === 0) { + const sourceLength = source[lineNumber - 1].length; + markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; + } else if (i === lineDiff) { + markerLines[lineNumber] = [0, endColumn]; + } else { + const sourceLength = source[lineNumber - i].length; + markerLines[lineNumber] = [0, sourceLength]; + } + } + } else { + if (startColumn === endColumn) { + if (startColumn) { + markerLines[startLine] = [startColumn, 0]; + } else { + markerLines[startLine] = true; + } + } else { + markerLines[startLine] = [startColumn, endColumn - startColumn]; + } + } + return { + start, + end, + markerLines + }; + } + function codeFrameColumns2(rawLines, loc, opts = {}) { + const shouldHighlight = opts.forceColor || isColorSupported() && opts.highlightCode; + const defs = getDefs(shouldHighlight); + const lines = rawLines.split(NEWLINE); + const { + start, + end, + markerLines + } = getMarkerLines(loc, lines, opts); + const hasColumns = loc.start && typeof loc.start.column === "number"; + const numberMaxWidth = String(end).length; + const highlightedLines = shouldHighlight ? highlight(rawLines) : rawLines; + let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index2) => { + const number = start + 1 + index2; + const paddedNumber = ` ${number}`.slice(-numberMaxWidth); + const gutter = ` ${paddedNumber} |`; + const hasMarker = markerLines[number]; + const lastMarkerLine = !markerLines[number + 1]; + if (hasMarker) { + let markerLine = ""; + if (Array.isArray(hasMarker)) { + const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); + const numberOfMarkers = hasMarker[1] || 1; + markerLine = ["\n ", defs.gutter(gutter.replace(/\d/g, " ")), " ", markerSpacing, defs.marker("^").repeat(numberOfMarkers)].join(""); + if (lastMarkerLine && opts.message) { + markerLine += " " + defs.message(opts.message); + } + } + return [defs.marker(">"), defs.gutter(gutter), line.length > 0 ? ` ${line}` : "", markerLine].join(""); + } else { + return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : ""}`; + } + }).join("\n"); + if (opts.message && !hasColumns) { + frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message} +${frame}`; + } + if (shouldHighlight) { + return defs.reset(frame); + } else { + return frame; + } + } + function index(rawLines, lineNumber, colNumber, opts = {}) { + if (!deprecationWarningShown) { + deprecationWarningShown = true; + const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; + if (process.emitWarning) { + process.emitWarning(message, "DeprecationWarning"); + } else { + const deprecationError = new Error(message); + deprecationError.name = "DeprecationWarning"; + console.warn(new Error(message)); + } + } + colNumber = Math.max(colNumber, 0); + const location = { + start: { + column: colNumber, + line: lineNumber + } + }; + return codeFrameColumns2(rawLines, location, opts); + } + exports2.codeFrameColumns = codeFrameColumns2; + exports2.default = index; + exports2.highlight = highlight; + } +}); + +// ../../node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/symbols.js +var require_symbols = __commonJS({ + "../../node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/symbols.js"(exports2, module2) { + "use strict"; + var isHyper = typeof process !== "undefined" && process.env.TERM_PROGRAM === "Hyper"; + var isWindows = typeof process !== "undefined" && process.platform === "win32"; + var isLinux = typeof process !== "undefined" && process.platform === "linux"; + var common = { + ballotDisabled: "\u2612", + ballotOff: "\u2610", + ballotOn: "\u2611", + bullet: "\u2022", + bulletWhite: "\u25E6", + fullBlock: "\u2588", + heart: "\u2764", + identicalTo: "\u2261", + line: "\u2500", + mark: "\u203B", + middot: "\xB7", + minus: "\uFF0D", + multiplication: "\xD7", + obelus: "\xF7", + pencilDownRight: "\u270E", + pencilRight: "\u270F", + pencilUpRight: "\u2710", + percent: "%", + pilcrow2: "\u2761", + pilcrow: "\xB6", + plusMinus: "\xB1", + question: "?", + section: "\xA7", + starsOff: "\u2606", + starsOn: "\u2605", + upDownArrow: "\u2195" + }; + var windows = Object.assign({}, common, { + check: "\u221A", + cross: "\xD7", + ellipsisLarge: "...", + ellipsis: "...", + info: "i", + questionSmall: "?", + pointer: ">", + pointerSmall: "\xBB", + radioOff: "( )", + radioOn: "(*)", + warning: "\u203C" + }); + var other = Object.assign({}, common, { + ballotCross: "\u2718", + check: "\u2714", + cross: "\u2716", + ellipsisLarge: "\u22EF", + ellipsis: "\u2026", + info: "\u2139", + questionFull: "\uFF1F", + questionSmall: "\uFE56", + pointer: isLinux ? "\u25B8" : "\u276F", + pointerSmall: isLinux ? "\u2023" : "\u203A", + radioOff: "\u25EF", + radioOn: "\u25C9", + warning: "\u26A0" + }); + module2.exports = isWindows && !isHyper ? windows : other; + Reflect.defineProperty(module2.exports, "common", { enumerable: false, value: common }); + Reflect.defineProperty(module2.exports, "windows", { enumerable: false, value: windows }); + Reflect.defineProperty(module2.exports, "other", { enumerable: false, value: other }); + } +}); + +// ../../node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/index.js +var require_ansi_colors = __commonJS({ + "../../node_modules/.pnpm/ansi-colors@4.1.3/node_modules/ansi-colors/index.js"(exports2, module2) { + "use strict"; + var isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val); + var ANSI_REGEX = /[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g; + var hasColor = () => { + if (typeof process !== "undefined") { + return process.env.FORCE_COLOR !== "0"; + } + return false; + }; + var create = () => { + const colors = { + enabled: hasColor(), + visible: true, + styles: {}, + keys: {} + }; + const ansi = (style2) => { + let open = style2.open = `\x1B[${style2.codes[0]}m`; + let close = style2.close = `\x1B[${style2.codes[1]}m`; + let regex = style2.regex = new RegExp(`\\u001b\\[${style2.codes[1]}m`, "g"); + style2.wrap = (input, newline) => { + if (input.includes(close)) input = input.replace(regex, close + open); + let output = open + input + close; + return newline ? output.replace(/\r*\n/g, `${close}$&${open}`) : output; + }; + return style2; + }; + const wrap = (style2, input, newline) => { + return typeof style2 === "function" ? style2(input) : style2.wrap(input, newline); + }; + const style = (input, stack) => { + if (input === "" || input == null) return ""; + if (colors.enabled === false) return input; + if (colors.visible === false) return ""; + let str = "" + input; + let nl = str.includes("\n"); + let n = stack.length; + if (n > 0 && stack.includes("unstyle")) { + stack = [.../* @__PURE__ */ new Set(["unstyle", ...stack])].reverse(); + } + while (n-- > 0) str = wrap(colors.styles[stack[n]], str, nl); + return str; + }; + const define = (name, codes, type) => { + colors.styles[name] = ansi({ name, codes }); + let keys = colors.keys[type] || (colors.keys[type] = []); + keys.push(name); + Reflect.defineProperty(colors, name, { + configurable: true, + enumerable: true, + set(value) { + colors.alias(name, value); + }, + get() { + let color = (input) => style(input, color.stack); + Reflect.setPrototypeOf(color, colors); + color.stack = this.stack ? this.stack.concat(name) : [name]; + return color; + } + }); + }; + define("reset", [0, 0], "modifier"); + define("bold", [1, 22], "modifier"); + define("dim", [2, 22], "modifier"); + define("italic", [3, 23], "modifier"); + define("underline", [4, 24], "modifier"); + define("inverse", [7, 27], "modifier"); + define("hidden", [8, 28], "modifier"); + define("strikethrough", [9, 29], "modifier"); + define("black", [30, 39], "color"); + define("red", [31, 39], "color"); + define("green", [32, 39], "color"); + define("yellow", [33, 39], "color"); + define("blue", [34, 39], "color"); + define("magenta", [35, 39], "color"); + define("cyan", [36, 39], "color"); + define("white", [37, 39], "color"); + define("gray", [90, 39], "color"); + define("grey", [90, 39], "color"); + define("bgBlack", [40, 49], "bg"); + define("bgRed", [41, 49], "bg"); + define("bgGreen", [42, 49], "bg"); + define("bgYellow", [43, 49], "bg"); + define("bgBlue", [44, 49], "bg"); + define("bgMagenta", [45, 49], "bg"); + define("bgCyan", [46, 49], "bg"); + define("bgWhite", [47, 49], "bg"); + define("blackBright", [90, 39], "bright"); + define("redBright", [91, 39], "bright"); + define("greenBright", [92, 39], "bright"); + define("yellowBright", [93, 39], "bright"); + define("blueBright", [94, 39], "bright"); + define("magentaBright", [95, 39], "bright"); + define("cyanBright", [96, 39], "bright"); + define("whiteBright", [97, 39], "bright"); + define("bgBlackBright", [100, 49], "bgBright"); + define("bgRedBright", [101, 49], "bgBright"); + define("bgGreenBright", [102, 49], "bgBright"); + define("bgYellowBright", [103, 49], "bgBright"); + define("bgBlueBright", [104, 49], "bgBright"); + define("bgMagentaBright", [105, 49], "bgBright"); + define("bgCyanBright", [106, 49], "bgBright"); + define("bgWhiteBright", [107, 49], "bgBright"); + colors.ansiRegex = ANSI_REGEX; + colors.hasColor = colors.hasAnsi = (str) => { + colors.ansiRegex.lastIndex = 0; + return typeof str === "string" && str !== "" && colors.ansiRegex.test(str); + }; + colors.alias = (name, color) => { + let fn = typeof color === "string" ? colors[color] : color; + if (typeof fn !== "function") { + throw new TypeError("Expected alias to be the name of an existing color (string) or a function"); + } + if (!fn.stack) { + Reflect.defineProperty(fn, "name", { value: name }); + colors.styles[name] = fn; + fn.stack = [name]; + } + Reflect.defineProperty(colors, name, { + configurable: true, + enumerable: true, + set(value) { + colors.alias(name, value); + }, + get() { + let color2 = (input) => style(input, color2.stack); + Reflect.setPrototypeOf(color2, colors); + color2.stack = this.stack ? this.stack.concat(fn.stack) : fn.stack; + return color2; + } + }); + }; + colors.theme = (custom) => { + if (!isObject(custom)) throw new TypeError("Expected theme to be an object"); + for (let name of Object.keys(custom)) { + colors.alias(name, custom[name]); + } + return colors; + }; + colors.alias("unstyle", (str) => { + if (typeof str === "string" && str !== "") { + colors.ansiRegex.lastIndex = 0; + return str.replace(colors.ansiRegex, ""); + } + return ""; + }); + colors.alias("noop", (str) => str); + colors.none = colors.clear = colors.noop; + colors.stripColor = colors.unstyle; + colors.symbols = require_symbols(); + colors.define = define; + return colors; + }; + module2.exports = create(); + module2.exports.create = create; + } +}); + +// src/index.ts +var index_exports = {}; +__export(index_exports, { + BOOLEAN: () => BOOLEAN, + COMMENT_HEADER: () => COMMENT_HEADER, + FALSE: () => FALSE, + JS_ENUM_INVALID_CHARS_RE: () => JS_ENUM_INVALID_CHARS_RE, + JS_PROPERTY_INDEX_INVALID_CHARS_RE: () => JS_PROPERTY_INDEX_INVALID_CHARS_RE, + JS_PROPERTY_INDEX_RE: () => JS_PROPERTY_INDEX_RE, + NEVER: () => NEVER, + NULL: () => NULL, + NUMBER: () => NUMBER, + QUESTION_TOKEN: () => QUESTION_TOKEN, + SPECIAL_CHARACTER_MAP: () => SPECIAL_CHARACTER_MAP, + STRING: () => STRING, + TRUE: () => TRUE, + UNDEFINED: () => UNDEFINED, + UNKNOWN: () => UNKNOWN, + addJSDocComment: () => addJSDocComment, + astToString: () => astToString, + c: () => import_ansi_colors.default, + createDiscriminatorProperty: () => createDiscriminatorProperty, + createRef: () => createRef, + debug: () => debug, + default: () => openapiTS, + enumCache: () => enumCache, + error: () => error, + formatTime: () => formatTime, + getEntries: () => getEntries, + injectOperationObject: () => injectOperationObject, + oapiRef: () => oapiRef, + resolveRef: () => resolveRef, + scanDiscriminators: () => scanDiscriminators, + stringToAST: () => stringToAST, + transformComponentsObject: () => transformComponentsObject, + transformHeaderObject: () => transformHeaderObject, + transformMediaTypeObject: () => transformMediaTypeObject, + transformOperationObject: () => transformOperationObject, + transformParameterObject: () => transformParameterObject, + transformPathItemObject: () => transformPathItemObject, + transformPathsObject: () => transformPathsObject, + transformRequestBodyObject: () => transformRequestBodyObject, + transformResponseObject: () => transformResponseObject, + transformResponsesObject: () => transformResponsesObject, + transformSchema: () => transformSchema, + transformSchemaObject: () => transformSchemaObject, + transformSchemaObjectWithComposition: () => transformSchemaObjectWithComposition, + tsArrayLiteralExpression: () => tsArrayLiteralExpression, + tsDedupe: () => tsDedupe, + tsEnum: () => tsEnum, + tsEnumMember: () => tsEnumMember, + tsIntersection: () => tsIntersection, + tsIsPrimitive: () => tsIsPrimitive, + tsLiteral: () => tsLiteral, + tsModifiers: () => tsModifiers, + tsNullable: () => tsNullable, + tsOmit: () => tsOmit, + tsPropertyIndex: () => tsPropertyIndex, + tsReadonlyArray: () => tsReadonlyArray, + tsRecord: () => tsRecord, + tsUnion: () => tsUnion, + tsWithRequired: () => tsWithRequired, + walk: () => walk, + warn: () => warn +}); +module.exports = __toCommonJS(index_exports); +var import_openapi_core2 = require("@redocly/openapi-core"); +var import_node_perf_hooks5 = require("node:perf_hooks"); + +// src/lib/redoc.ts +var import_openapi_core = require("@redocly/openapi-core"); +var import_node_perf_hooks = require("node:perf_hooks"); +var import_node_stream = require("node:stream"); +var import_node_url = require("node:url"); + +// ../../node_modules/.pnpm/parse-json@8.1.0/node_modules/parse-json/index.js +var import_code_frame = __toESM(require_lib2(), 1); + +// ../../node_modules/.pnpm/index-to-position@0.1.2/node_modules/index-to-position/index.js +var safeLastIndexOf = (string, searchString, index) => index < 0 ? -1 : string.lastIndexOf(searchString, index); +function getPosition(text, textIndex) { + const lineBreakBefore = safeLastIndexOf(text, "\n", textIndex - 1); + const column = textIndex - lineBreakBefore - 1; + let line = 0; + for (let index = lineBreakBefore; index >= 0; index = safeLastIndexOf(text, "\n", index - 1)) { + line++; + } + return { line, column }; +} +function indexToLineColumn(text, textIndex, { oneBased = false } = {}) { + if (textIndex < 0 || textIndex >= text.length && text.length > 0) { + throw new RangeError("Index out of bounds"); + } + const position = getPosition(text, textIndex); + return oneBased ? { line: position.line + 1, column: position.column + 1 } : position; +} + +// ../../node_modules/.pnpm/parse-json@8.1.0/node_modules/parse-json/index.js +var getCodePoint = (character) => `\\u{${character.codePointAt(0).toString(16)}}`; +var _message; +var _JSONError = class _JSONError extends Error { + constructor(message) { + var _a; + super(); + __publicField(this, "name", "JSONError"); + __publicField(this, "fileName"); + __publicField(this, "codeFrame"); + __publicField(this, "rawCodeFrame"); + __privateAdd(this, _message); + __privateSet(this, _message, message); + (_a = Error.captureStackTrace) == null ? void 0 : _a.call(Error, this, _JSONError); + } + get message() { + const { fileName, codeFrame } = this; + return `${__privateGet(this, _message)}${fileName ? ` in ${fileName}` : ""}${codeFrame ? ` + +${codeFrame} +` : ""}`; + } + set message(message) { + __privateSet(this, _message, message); + } +}; +_message = new WeakMap(); +var JSONError = _JSONError; +var generateCodeFrame = (string, location, highlightCode = true) => (0, import_code_frame.codeFrameColumns)(string, { start: location }, { highlightCode }); +var getErrorLocation = (string, message) => { + const match = message.match(/in JSON at position (?\d+)(?: \(line (?\d+) column (?\d+)\))?$/); + if (!match) { + return; + } + let { index, line, column } = match.groups; + if (line && column) { + return { line: Number(line), column: Number(column) }; + } + index = Number(index); + if (index === string.length) { + const { line: line2, column: column2 } = indexToLineColumn(string, string.length - 1, { oneBased: true }); + return { line: line2, column: column2 + 1 }; + } + return indexToLineColumn(string, index, { oneBased: true }); +}; +var addCodePointToUnexpectedToken = (message) => message.replace( + // TODO[engine:node@>=20]: The token always quoted after Node.js 20 + /(?<=^Unexpected token )(?')?(.)\k/, + (_, _quote, token) => `"${token}"(${getCodePoint(token)})` +); +function parseJson(string, reviver, fileName) { + if (typeof reviver === "string") { + fileName = reviver; + reviver = void 0; + } + let message; + try { + return JSON.parse(string, reviver); + } catch (error2) { + message = error2.message; + } + let location; + if (string) { + location = getErrorLocation(string, message); + message = addCodePointToUnexpectedToken(message); + } else { + message += " while parsing empty string"; + } + const jsonError = new JSONError(message); + jsonError.fileName = fileName; + if (location) { + jsonError.codeFrame = generateCodeFrame(string, location); + jsonError.rawCodeFrame = generateCodeFrame( + string, + location, + /* highlightCode */ + false + ); + } + throw jsonError; +} + +// src/lib/utils.ts +var import_ref_utils2 = require("@redocly/openapi-core/lib/ref-utils.js"); +var import_ansi_colors = __toESM(require_ansi_colors(), 1); + +// ../../node_modules/.pnpm/supports-color@9.4.0/node_modules/supports-color/index.js +var import_node_process = __toESM(require("node:process"), 1); +var import_node_os = __toESM(require("node:os"), 1); +var import_node_tty = __toESM(require("node:tty"), 1); +function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : import_node_process.default.argv) { + const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--"; + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf("--"); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); +} +var { env } = import_node_process.default; +var flagForceColor; +if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) { + flagForceColor = 0; +} else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) { + flagForceColor = 1; +} +function envForceColor() { + if ("FORCE_COLOR" in env) { + if (env.FORCE_COLOR === "true") { + return 1; + } + if (env.FORCE_COLOR === "false") { + return 0; + } + return env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3); + } +} +function translateLevel(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} +function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) { + const noFlagForceColor = envForceColor(); + if (noFlagForceColor !== void 0) { + flagForceColor = noFlagForceColor; + } + const forceColor = sniffFlags ? flagForceColor : noFlagForceColor; + if (forceColor === 0) { + return 0; + } + if (sniffFlags) { + if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) { + return 3; + } + if (hasFlag("color=256")) { + return 2; + } + } + if ("TF_BUILD" in env && "AGENT_NAME" in env) { + return 1; + } + if (haveStream && !streamIsTTY && forceColor === void 0) { + return 0; + } + const min = forceColor || 0; + if (env.TERM === "dumb") { + return min; + } + if (import_node_process.default.platform === "win32") { + const osRelease = import_node_os.default.release().split("."); + if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + return 1; + } + if ("CI" in env) { + if ("GITHUB_ACTIONS" in env || "GITEA_ACTIONS" in env) { + return 3; + } + if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env) || env.CI_NAME === "codeship") { + return 1; + } + return min; + } + if ("TEAMCITY_VERSION" in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + if (env.COLORTERM === "truecolor") { + return 3; + } + if (env.TERM === "xterm-kitty") { + return 3; + } + if ("TERM_PROGRAM" in env) { + const version = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + switch (env.TERM_PROGRAM) { + case "iTerm.app": { + return version >= 3 ? 3 : 2; + } + case "Apple_Terminal": { + return 2; + } + } + } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ("COLORTERM" in env) { + return 1; + } + return min; +} +function createSupportsColor(stream, options = {}) { + const level = _supportsColor(stream, { + streamIsTTY: stream && stream.isTTY, + ...options + }); + return translateLevel(level); +} +var supportsColor = { + stdout: createSupportsColor({ isTTY: import_node_tty.default.isatty(1) }), + stderr: createSupportsColor({ isTTY: import_node_tty.default.isatty(2) }) +}; +var supports_color_default = supportsColor; + +// src/lib/utils.ts +var import_typescript2 = __toESM(require("typescript"), 1); + +// src/lib/ts.ts +var import_ref_utils = require("@redocly/openapi-core/lib/ref-utils.js"); +var import_typescript = __toESM(require("typescript"), 1); +var JS_PROPERTY_INDEX_RE = /^[A-Za-z_$][A-Za-z_$0-9]*$/; +var JS_ENUM_INVALID_CHARS_RE = /[^A-Za-z_$0-9]+(.)?/g; +var JS_PROPERTY_INDEX_INVALID_CHARS_RE = /[^A-Za-z_$0-9]+/g; +var SPECIAL_CHARACTER_MAP = { + "+": "Plus" + // Add more mappings as needed +}; +var BOOLEAN = import_typescript.default.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.BooleanKeyword); +var FALSE = import_typescript.default.factory.createLiteralTypeNode(import_typescript.default.factory.createFalse()); +var NEVER = import_typescript.default.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.NeverKeyword); +var NULL = import_typescript.default.factory.createLiteralTypeNode(import_typescript.default.factory.createNull()); +var NUMBER = import_typescript.default.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.NumberKeyword); +var QUESTION_TOKEN = import_typescript.default.factory.createToken(import_typescript.default.SyntaxKind.QuestionToken); +var STRING = import_typescript.default.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.StringKeyword); +var TRUE = import_typescript.default.factory.createLiteralTypeNode(import_typescript.default.factory.createTrue()); +var UNDEFINED = import_typescript.default.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.UndefinedKeyword); +var UNKNOWN = import_typescript.default.factory.createKeywordTypeNode(import_typescript.default.SyntaxKind.UnknownKeyword); +var LB_RE = /\r?\n/g; +var COMMENT_RE = /\*\//g; +function addJSDocComment(schemaObject, node) { + if (!schemaObject || typeof schemaObject !== "object" || Array.isArray(schemaObject)) { + return; + } + const output = []; + if (schemaObject.title) { + output.push(schemaObject.title.replace(LB_RE, "\n * ")); + } + if (schemaObject.summary) { + output.push(schemaObject.summary.replace(LB_RE, "\n * ")); + } + if (schemaObject.format) { + output.push(`Format: ${schemaObject.format}`); + } + if (schemaObject.deprecated) { + output.push("@deprecated"); + } + const supportedJsDocTags = ["description", "default", "example"]; + for (const field of supportedJsDocTags) { + const allowEmptyString = field === "default" || field === "example"; + if (schemaObject[field] === void 0) { + continue; + } + if (schemaObject[field] === "" && !allowEmptyString) { + continue; + } + const serialized = typeof schemaObject[field] === "object" ? JSON.stringify(schemaObject[field], null, 2) : schemaObject[field]; + output.push(`@${field} ${String(serialized).replace(LB_RE, "\n * ")}`); + } + if ("const" in schemaObject) { + output.push("@constant"); + } + if (schemaObject.enum) { + let type = "unknown"; + if (Array.isArray(schemaObject.type)) { + type = schemaObject.type.join("|"); + } else if (typeof schemaObject.type === "string") { + type = schemaObject.type; + } + output.push(`@enum {${type}${schemaObject.nullable ? "|null" : ""}}`); + } + if (output.length) { + let text = output.length === 1 ? `* ${output.join("\n")} ` : `* + * ${output.join("\n * ")} + `; + text = text.replace(COMMENT_RE, "*\\/"); + import_typescript.default.addSyntheticLeadingComment( + /* node */ + node, + /* kind */ + import_typescript.default.SyntaxKind.MultiLineCommentTrivia, + // note: MultiLine just refers to a "/* */" comment + /* text */ + text, + /* hasTrailingNewLine */ + true + ); + } +} +function oapiRef(path) { + const { pointer } = (0, import_ref_utils.parseRef)(path); + if (pointer.length === 0) { + throw new Error(`Error parsing $ref: ${path}. Is this a valid $ref?`); + } + let t = import_typescript.default.factory.createTypeReferenceNode( + import_typescript.default.factory.createIdentifier(String(pointer[0])) + ); + if (pointer.length > 1) { + for (let i = 1; i < pointer.length; i++) { + if (i > 2 && i < pointer.length - 1 && pointer[i] === "properties") { + continue; + } + t = import_typescript.default.factory.createIndexedAccessTypeNode( + t, + import_typescript.default.factory.createLiteralTypeNode( + typeof pointer[i] === "number" ? import_typescript.default.factory.createNumericLiteral(pointer[i]) : import_typescript.default.factory.createStringLiteral(pointer[i]) + ) + ); + } + } + return t; +} +function astToString(ast, options) { + var _a, _b; + const sourceFile = import_typescript.default.createSourceFile( + (_a = options == null ? void 0 : options.fileName) != null ? _a : "openapi-ts.ts", + (_b = options == null ? void 0 : options.sourceText) != null ? _b : "", + import_typescript.default.ScriptTarget.ESNext, + false, + import_typescript.default.ScriptKind.TS + ); + sourceFile.statements = import_typescript.default.factory.createNodeArray(Array.isArray(ast) ? ast : [ast]); + const printer = import_typescript.default.createPrinter({ + newLine: import_typescript.default.NewLineKind.LineFeed, + removeComments: false, + ...options == null ? void 0 : options.formatOptions + }); + return printer.printFile(sourceFile); +} +function stringToAST(source) { + return import_typescript.default.createSourceFile( + /* fileName */ + "stringInput", + /* sourceText */ + source, + /* languageVersion */ + import_typescript.default.ScriptTarget.ESNext, + /* setParentNodes */ + void 0, + /* scriptKind */ + void 0 + ).statements; +} +function tsDedupe(types) { + var _a, _b; + const encounteredTypes = /* @__PURE__ */ new Set(); + const filteredTypes = []; + for (const t of types) { + if (!("text" in ((_a = t.literal) != null ? _a : t))) { + const { kind } = (_b = t.literal) != null ? _b : t; + if (encounteredTypes.has(kind)) { + continue; + } + if (tsIsPrimitive(t)) { + encounteredTypes.add(kind); + } + } + filteredTypes.push(t); + } + return filteredTypes; +} +var enumCache = /* @__PURE__ */ new Map(); +function tsEnum(name, members, metadata, options) { + var _a; + let enumName = sanitizeMemberName(name); + enumName = `${enumName[0].toUpperCase()}${enumName.substring(1)}`; + let key = ""; + if (options == null ? void 0 : options.shouldCache) { + key = `${members.slice(0).sort().map((v, i) => { + var _a2, _b, _c; + return `${(_b = (_a2 = metadata == null ? void 0 : metadata[i]) == null ? void 0 : _a2.name) != null ? _b : String(v)}:${((_c = metadata == null ? void 0 : metadata[i]) == null ? void 0 : _c.description) || ""}`; + }).join(",")}`; + if (enumCache.has(key)) { + return enumCache.get(key); + } + } + const enumDeclaration = import_typescript.default.factory.createEnumDeclaration( + /* modifiers */ + options ? tsModifiers({ export: (_a = options.export) != null ? _a : false }) : void 0, + /* name */ + enumName, + /* members */ + members.map((value, i) => tsEnumMember(value, metadata == null ? void 0 : metadata[i])) + ); + (options == null ? void 0 : options.shouldCache) && enumCache.set(key, enumDeclaration); + return enumDeclaration; +} +function tsArrayLiteralExpression(name, elementType, values, options) { + var _a; + let variableName = sanitizeMemberName(name); + variableName = `${variableName[0].toLowerCase()}${variableName.substring(1)}`; + const arrayType = (options == null ? void 0 : options.readonly) ? tsReadonlyArray(elementType, options.injectFooter) : import_typescript.default.factory.createArrayTypeNode(elementType); + return import_typescript.default.factory.createVariableStatement( + options ? tsModifiers({ export: (_a = options.export) != null ? _a : false }) : void 0, + import_typescript.default.factory.createVariableDeclarationList( + [ + import_typescript.default.factory.createVariableDeclaration( + variableName, + void 0, + arrayType, + import_typescript.default.factory.createArrayLiteralExpression( + values.map((value) => { + if (typeof value === "number") { + if (value < 0) { + return import_typescript.default.factory.createPrefixUnaryExpression( + import_typescript.default.SyntaxKind.MinusToken, + import_typescript.default.factory.createNumericLiteral(Math.abs(value)) + ); + } else { + return import_typescript.default.factory.createNumericLiteral(value); + } + } else { + return import_typescript.default.factory.createStringLiteral(value); + } + }) + ) + ) + ], + import_typescript.default.NodeFlags.Const + ) + ); +} +function sanitizeMemberName(name) { + let sanitizedName = name.replace(JS_ENUM_INVALID_CHARS_RE, (c2) => { + const last = c2[c2.length - 1]; + return JS_PROPERTY_INDEX_INVALID_CHARS_RE.test(last) ? "" : last.toUpperCase(); + }); + if (Number(name[0]) >= 0) { + sanitizedName = `Value${name}`; + } + return sanitizedName; +} +function tsEnumMember(value, metadata = {}) { + var _a; + let name = (_a = metadata.name) != null ? _a : String(value); + if (!JS_PROPERTY_INDEX_RE.test(name)) { + if (Number(name[0]) >= 0) { + name = `Value${name}`.replace(".", "_"); + } else if (name[0] === "-") { + name = `ValueMinus${name.slice(1)}`; + } + const invalidCharMatch = name.match(JS_PROPERTY_INDEX_INVALID_CHARS_RE); + if (invalidCharMatch) { + if (invalidCharMatch[0] === name) { + name = `"${name}"`; + } else { + name = name.replace(JS_PROPERTY_INDEX_INVALID_CHARS_RE, (s) => { + return s in SPECIAL_CHARACTER_MAP ? SPECIAL_CHARACTER_MAP[s] : "_"; + }); + } + } + } + let member; + if (typeof value === "number") { + const literal = value < 0 ? import_typescript.default.factory.createPrefixUnaryExpression( + import_typescript.default.SyntaxKind.MinusToken, + import_typescript.default.factory.createNumericLiteral(Math.abs(value)) + ) : import_typescript.default.factory.createNumericLiteral(value); + member = import_typescript.default.factory.createEnumMember(name, literal); + } else { + member = import_typescript.default.factory.createEnumMember(name, import_typescript.default.factory.createStringLiteral(value)); + } + if (metadata.description === void 0) { + return member; + } + return import_typescript.default.addSyntheticLeadingComment( + member, + import_typescript.default.SyntaxKind.SingleLineCommentTrivia, + " ".concat(metadata.description.trim()), + true + ); +} +function tsIntersection(types) { + if (types.length === 0) { + return NEVER; + } + if (types.length === 1) { + return types[0]; + } + return import_typescript.default.factory.createIntersectionTypeNode(tsDedupe(types)); +} +function tsIsPrimitive(type) { + if (!type) { + return true; + } + return import_typescript.default.SyntaxKind[type.kind] === "BooleanKeyword" || import_typescript.default.SyntaxKind[type.kind] === "NeverKeyword" || import_typescript.default.SyntaxKind[type.kind] === "NullKeyword" || import_typescript.default.SyntaxKind[type.kind] === "NumberKeyword" || import_typescript.default.SyntaxKind[type.kind] === "StringKeyword" || import_typescript.default.SyntaxKind[type.kind] === "UndefinedKeyword" || "literal" in type && tsIsPrimitive(type.literal); +} +function tsLiteral(value) { + if (typeof value === "string") { + return import_typescript.default.factory.createIdentifier(JSON.stringify(value)); + } + if (typeof value === "number") { + const literal = value < 0 ? import_typescript.default.factory.createPrefixUnaryExpression( + import_typescript.default.SyntaxKind.MinusToken, + import_typescript.default.factory.createNumericLiteral(Math.abs(value)) + ) : import_typescript.default.factory.createNumericLiteral(value); + return import_typescript.default.factory.createLiteralTypeNode(literal); + } + if (typeof value === "boolean") { + return value === true ? TRUE : FALSE; + } + if (value === null) { + return NULL; + } + if (Array.isArray(value)) { + if (value.length === 0) { + return import_typescript.default.factory.createArrayTypeNode(NEVER); + } + return import_typescript.default.factory.createTupleTypeNode(value.map((v) => tsLiteral(v))); + } + if (typeof value === "object") { + const keys = []; + for (const [k, v] of Object.entries(value)) { + keys.push( + import_typescript.default.factory.createPropertySignature( + /* modifiers */ + void 0, + /* name */ + tsPropertyIndex(k), + /* questionToken */ + void 0, + /* type */ + tsLiteral(v) + ) + ); + } + return keys.length ? import_typescript.default.factory.createTypeLiteralNode(keys) : tsRecord(STRING, NEVER); + } + return UNKNOWN; +} +function tsModifiers(modifiers) { + const typeMods = []; + if (modifiers.export) { + typeMods.push(import_typescript.default.factory.createModifier(import_typescript.default.SyntaxKind.ExportKeyword)); + } + if (modifiers.readonly) { + typeMods.push(import_typescript.default.factory.createModifier(import_typescript.default.SyntaxKind.ReadonlyKeyword)); + } + return typeMods; +} +function tsNullable(types) { + return import_typescript.default.factory.createUnionTypeNode([...types, NULL]); +} +function tsOmit(type, keys) { + return import_typescript.default.factory.createTypeReferenceNode(import_typescript.default.factory.createIdentifier("Omit"), [ + type, + import_typescript.default.factory.createUnionTypeNode(keys.map((k) => tsLiteral(k))) + ]); +} +function tsRecord(key, value) { + return import_typescript.default.factory.createTypeReferenceNode(import_typescript.default.factory.createIdentifier("Record"), [key, value]); +} +function tsPropertyIndex(index) { + if (typeof index === "number" && !(index < 0) || typeof index === "string" && String(Number(index)) === index && index[0] !== "-") { + return import_typescript.default.factory.createNumericLiteral(index); + } + return typeof index === "string" && JS_PROPERTY_INDEX_RE.test(index) ? import_typescript.default.factory.createIdentifier(index) : import_typescript.default.factory.createStringLiteral(String(index)); +} +function tsUnion(types) { + if (types.length === 0) { + return NEVER; + } + if (types.length === 1) { + return types[0]; + } + return import_typescript.default.factory.createUnionTypeNode(tsDedupe(types)); +} +function tsWithRequired(type, keys, injectFooter) { + if (keys.length === 0) { + return type; + } + if (!injectFooter.some((node) => { + var _a; + return import_typescript.default.isTypeAliasDeclaration(node) && ((_a = node == null ? void 0 : node.name) == null ? void 0 : _a.escapedText) === "WithRequired"; + })) { + const helper = stringToAST("type WithRequired = T & { [P in K]-?: T[P] };")[0]; + injectFooter.push(helper); + } + return import_typescript.default.factory.createTypeReferenceNode(import_typescript.default.factory.createIdentifier("WithRequired"), [ + type, + tsUnion(keys.map((k) => tsLiteral(k))) + ]); +} +function tsReadonlyArray(type, injectFooter) { + if (injectFooter && !injectFooter.some((node) => { + var _a; + return import_typescript.default.isTypeAliasDeclaration(node) && ((_a = node == null ? void 0 : node.name) == null ? void 0 : _a.escapedText) === "ReadonlyArray"; + })) { + const helper = stringToAST( + "type ReadonlyArray = [Exclude] extends [any[]] ? Readonly> : Readonly[]>;" + )[0]; + injectFooter.push(helper); + } + return import_typescript.default.factory.createTypeReferenceNode(import_typescript.default.factory.createIdentifier("ReadonlyArray"), [type]); +} + +// src/lib/utils.ts +if (!supports_color_default.stdout || supports_color_default.stdout.hasBasic === false) { + import_ansi_colors.default.enabled = false; +} +var DEBUG_GROUPS = { + redoc: import_ansi_colors.default.cyanBright, + lint: import_ansi_colors.default.yellowBright, + bundle: import_ansi_colors.default.magentaBright, + ts: import_ansi_colors.default.blueBright +}; +function createDiscriminatorProperty(discriminator, { path, readonly = false }) { + let value = (0, import_ref_utils2.parseRef)(path).pointer.pop(); + if (discriminator.mapping) { + const matchedValue = Object.entries(discriminator.mapping).find( + ([, v]) => !v.startsWith("#") && v === value || v.startsWith("#") && (0, import_ref_utils2.parseRef)(v).pointer.pop() === value + ); + if (matchedValue) { + value = matchedValue[0]; + } + } + return import_typescript2.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ + readonly + }), + /* name */ + tsPropertyIndex(discriminator.propertyName), + /* questionToken */ + void 0, + /* type */ + tsLiteral(value) + ); +} +function createRef(parts) { + let pointer = "#"; + for (const part of parts) { + if (part === void 0 || part === null || part === "") { + continue; + } + const maybeRef = (0, import_ref_utils2.parseRef)(String(part)).pointer; + if (maybeRef.length) { + for (const refPart of maybeRef) { + pointer += `/${(0, import_ref_utils2.escapePointer)(refPart)}`; + } + } else { + pointer += `/${(0, import_ref_utils2.escapePointer)(part)}`; + } + } + return pointer; +} +function debug(msg, group, time) { + if (process.env.DEBUG && (!group || process.env.DEBUG === "*" || process.env.DEBUG === "openapi-ts:*" || process.env.DEBUG.toLocaleLowerCase() === `openapi-ts:${group.toLocaleLowerCase()}`)) { + const groupColor = group && DEBUG_GROUPS[group] || import_ansi_colors.default.whiteBright; + const groupName = groupColor(`openapi-ts:${group != null ? group : "info"}`); + let timeFormatted = ""; + if (typeof time === "number") { + timeFormatted = import_ansi_colors.default.green(` ${formatTime(time)} `); + } + console.debug(` ${import_ansi_colors.default.bold(groupName)}${timeFormatted}${msg}`); + } +} +function error(msg) { + console.error(import_ansi_colors.default.red(` \u2718 ${msg}`)); +} +function formatTime(t) { + if (typeof t === "number") { + if (t < 1e3) { + return `${Math.round(10 * t) / 10}ms`; + } + if (t < 6e4) { + return `${Math.round(t / 100) / 10}s`; + } + return `${Math.round(t / 6e3) / 10}m`; + } + return t; +} +function getEntries(obj, options) { + let entries = Object.entries(obj); + if (options == null ? void 0 : options.alphabetize) { + entries.sort(([a], [b]) => a.localeCompare(b, "en-us", { numeric: true })); + } + if (options == null ? void 0 : options.excludeDeprecated) { + entries = entries.filter(([, v]) => !(v && typeof v === "object" && "deprecated" in v && v.deprecated)); + } + return entries; +} +function resolveRef(schema, $ref, { silent = false, visited = [] }) { + const { pointer } = (0, import_ref_utils2.parseRef)($ref); + if (!pointer.length) { + return void 0; + } + let node = schema; + for (const key of pointer) { + if (node && typeof node === "object" && node[key]) { + node = node[key]; + } else { + warn(`Could not resolve $ref "${$ref}"`, silent); + return void 0; + } + } + if (node && typeof node === "object" && node.$ref) { + if (visited.includes(node.$ref)) { + warn(`Could not resolve circular $ref "${$ref}"`, silent); + return void 0; + } + return resolveRef(schema, node.$ref, { + silent, + visited: [...visited, node.$ref] + }); + } + return node; +} +function createDiscriminatorEnum(values, prevSchema) { + return { + type: "string", + enum: values, + description: (prevSchema == null ? void 0 : prevSchema.description) ? `${prevSchema.description} (enum property replaced by openapi-typescript)` : "discriminator enum property added by openapi-typescript" + }; +} +function patchDiscriminatorEnum(schema, ref, values, discriminator, discriminatorRef, options) { + var _a; + const resolvedSchema = resolveRef(schema, ref, { + silent: (_a = options.silent) != null ? _a : false + }); + if (resolvedSchema == null ? void 0 : resolvedSchema.allOf) { + resolvedSchema.allOf.push({ + type: "object", + // discriminator enum properties always need to be required + required: [discriminator.propertyName], + properties: { + [discriminator.propertyName]: createDiscriminatorEnum(values) + } + }); + return true; + } else if (typeof resolvedSchema === "object" && "type" in resolvedSchema && resolvedSchema.type === "object") { + if (!resolvedSchema.properties) { + resolvedSchema.properties = {}; + } + if (!resolvedSchema.required) { + resolvedSchema.required = [discriminator.propertyName]; + } else if (!resolvedSchema.required.includes(discriminator.propertyName)) { + resolvedSchema.required.push(discriminator.propertyName); + } + resolvedSchema.properties[discriminator.propertyName] = createDiscriminatorEnum( + values, + resolvedSchema.properties[discriminator.propertyName] + ); + return true; + } + warn( + `Discriminator mapping has an invalid schema (neither an object schema nor an allOf array): ${ref} => ${values.join( + ", " + )} (Discriminator: ${discriminatorRef})`, + options.silent + ); + return false; +} +function scanDiscriminators(schema, options) { + const objects = {}; + const refsHandled = []; + walk(schema, (obj, path) => { + var _a, _b; + const discriminator = obj == null ? void 0 : obj.discriminator; + if (!(discriminator == null ? void 0 : discriminator.propertyName)) { + return; + } + const ref = createRef(path); + objects[ref] = discriminator; + if (!(obj == null ? void 0 : obj.oneOf) || !Array.isArray(obj.oneOf)) { + return; + } + const oneOf = obj.oneOf; + const mapping = {}; + for (const item of oneOf) { + if ("$ref" in item) { + const value = item.$ref.split("/").pop(); + if (value) { + if (!mapping[item.$ref]) { + mapping[item.$ref] = { inferred: value }; + } else { + mapping[item.$ref].inferred = value; + } + } + } + } + if (discriminator.mapping) { + for (const mappedValue in discriminator.mapping) { + const mappedRef = discriminator.mapping[mappedValue]; + if (!mappedRef) { + continue; + } + if (!((_a = mapping[mappedRef]) == null ? void 0 : _a.defined)) { + mapping[mappedRef] = { defined: [] }; + } + (_b = mapping[mappedRef].defined) == null ? void 0 : _b.push(mappedValue); + } + } + for (const [mappedRef, { inferred, defined }] of Object.entries(mapping)) { + if (refsHandled.includes(mappedRef)) { + continue; + } + if (!inferred && !defined) { + continue; + } + const mappedValues = defined != null ? defined : [inferred]; + if (patchDiscriminatorEnum(schema, mappedRef, mappedValues, discriminator, ref, options)) { + refsHandled.push(mappedRef); + } + } + }); + walk(schema, (obj, path) => { + var _a; + if (!obj || !Array.isArray(obj.allOf)) { + return; + } + for (const item of obj.allOf) { + if ("$ref" in item) { + if (!objects[item.$ref]) { + return; + } + const ref = createRef(path); + const discriminator = objects[item.$ref]; + const mappedValues = []; + if (discriminator.mapping) { + for (const mappedValue in discriminator.mapping) { + if (discriminator.mapping[mappedValue] === ref) { + mappedValues.push(mappedValue); + } + } + if (mappedValues.length > 0) { + if (patchDiscriminatorEnum( + schema, + ref, + mappedValues, + discriminator, + item.$ref, + options + )) { + refsHandled.push(ref); + } + } + } + objects[ref] = { + ...objects[item.$ref] + }; + } else if ((_a = item.discriminator) == null ? void 0 : _a.propertyName) { + objects[createRef(path)] = { ...item.discriminator }; + } + } + }); + return { objects, refsHandled }; +} +function walk(obj, cb, path = []) { + if (!obj || typeof obj !== "object") { + return; + } + if (Array.isArray(obj)) { + for (let i = 0; i < obj.length; i++) { + walk(obj[i], cb, path.concat(i)); + } + return; + } + cb(obj, path); + for (const k of Object.keys(obj)) { + walk(obj[k], cb, path.concat(k)); + } +} +function warn(msg, silent = false) { + if (!silent) { + console.warn(import_ansi_colors.default.yellow(` \u26A0 ${msg}`)); + } +} + +// src/lib/redoc.ts +async function parseSchema(schema, { absoluteRef, resolver }) { + if (!schema) { + throw new Error("Can\u2019t parse empty schema"); + } + if (schema instanceof URL) { + const result = await resolver.resolveDocument(null, absoluteRef, true); + if ("parsed" in result) { + return result; + } + throw result.originalError; + } + if (schema instanceof import_node_stream.Readable) { + const contents = await new Promise((resolve) => { + schema.resume(); + schema.setEncoding("utf8"); + let content = ""; + schema.on("data", (chunk) => { + content += chunk; + }); + schema.on("end", () => { + resolve(content.trim()); + }); + }); + return parseSchema(contents, { absoluteRef, resolver }); + } + if (schema instanceof Buffer) { + return parseSchema(schema.toString("utf8"), { absoluteRef, resolver }); + } + if (typeof schema === "string") { + if (schema.startsWith("http://") || schema.startsWith("https://") || schema.startsWith("file://")) { + const url = new URL(schema); + return parseSchema(url, { + absoluteRef: url.protocol === "file:" ? (0, import_node_url.fileURLToPath)(url) : url.href, + resolver + }); + } + if (schema[0] === "{") { + return { + source: new import_openapi_core.Source(absoluteRef, schema, "application/json"), + parsed: parseJson(schema) + }; + } + return (0, import_openapi_core.makeDocumentFromString)(schema, absoluteRef); + } + if (typeof schema === "object" && !Array.isArray(schema)) { + return { + source: new import_openapi_core.Source(absoluteRef, JSON.stringify(schema), "application/json"), + parsed: schema + }; + } + throw new Error(`Expected string, object, or Buffer. Got ${Array.isArray(schema) ? "Array" : typeof schema}`); +} +function _processProblems(problems, options) { + var _a; + if (problems.length) { + let errorMessage = void 0; + for (const problem of problems) { + const problemLocation = (_a = problem.location) == null ? void 0 : _a[0].pointer; + const problemMessage = problemLocation ? `${problem.message} at ${problemLocation}` : problem.message; + if (problem.severity === "error") { + errorMessage = problemMessage; + error(problemMessage); + } else { + warn(problemMessage, options.silent); + } + } + if (errorMessage) { + throw new Error(errorMessage); + } + } +} +async function validateAndBundle(source, options) { + var _a; + const redocConfigT = import_node_perf_hooks.performance.now(); + debug("Loaded Redoc config", "redoc", import_node_perf_hooks.performance.now() - redocConfigT); + const redocParseT = import_node_perf_hooks.performance.now(); + let absoluteRef = (0, import_node_url.fileURLToPath)(new URL((_a = options == null ? void 0 : options.cwd) != null ? _a : `file://${process.cwd()}/`)); + if (source instanceof URL) { + absoluteRef = source.protocol === "file:" ? (0, import_node_url.fileURLToPath)(source) : source.href; + } + const resolver = new import_openapi_core.BaseResolver(options.redoc.resolve); + const document = await parseSchema(source, { + absoluteRef, + resolver + }); + debug("Parsed schema", "redoc", import_node_perf_hooks.performance.now() - redocParseT); + const openapiVersion = Number.parseFloat(document.parsed.openapi); + if (document.parsed.swagger || !document.parsed.openapi || Number.isNaN(openapiVersion) || openapiVersion < 3 || openapiVersion >= 4) { + if (document.parsed.swagger) { + throw new Error("Unsupported Swagger version: 2.x. Use OpenAPI 3.x instead."); + } + if (document.parsed.openapi || openapiVersion < 3 || openapiVersion >= 4) { + throw new Error(`Unsupported OpenAPI version: ${document.parsed.openapi}`); + } + throw new Error("Unsupported schema format, expected `openapi: 3.x`"); + } + const redocLintT = import_node_perf_hooks.performance.now(); + const problems = await (0, import_openapi_core.lintDocument)({ + document, + config: options.redoc.styleguide, + externalRefResolver: resolver + }); + _processProblems(problems, options); + debug("Linted schema", "lint", import_node_perf_hooks.performance.now() - redocLintT); + const redocBundleT = import_node_perf_hooks.performance.now(); + const bundled = await (0, import_openapi_core.bundle)({ + config: options.redoc, + dereference: false, + doc: document + }); + _processProblems(bundled.problems, options); + debug("Bundled schema", "bundle", import_node_perf_hooks.performance.now() - redocBundleT); + return bundled.bundle.parsed; +} + +// src/transform/index.ts +var import_typescript14 = __toESM(require("typescript"), 1); +var import_node_perf_hooks4 = require("node:perf_hooks"); + +// src/transform/components-object.ts +var import_typescript11 = __toESM(require("typescript"), 1); + +// ../../node_modules/.pnpm/change-case@5.4.4/node_modules/change-case/dist/index.js +var SPLIT_LOWER_UPPER_RE = /([\p{Ll}\d])(\p{Lu})/gu; +var SPLIT_UPPER_UPPER_RE = /(\p{Lu})([\p{Lu}][\p{Ll}])/gu; +var SPLIT_SEPARATE_NUMBER_RE = /(\d)\p{Ll}|(\p{L})\d/u; +var DEFAULT_STRIP_REGEXP = /[^\p{L}\d]+/giu; +var SPLIT_REPLACE_VALUE = "$1\0$2"; +var DEFAULT_PREFIX_SUFFIX_CHARACTERS = ""; +function split(value) { + let result = value.trim(); + result = result.replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE).replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE); + result = result.replace(DEFAULT_STRIP_REGEXP, "\0"); + let start = 0; + let end = result.length; + while (result.charAt(start) === "\0") + start++; + if (start === end) + return []; + while (result.charAt(end - 1) === "\0") + end--; + return result.slice(start, end).split(/\0/g); +} +function splitSeparateNumbers(value) { + var _a; + const words = split(value); + for (let i = 0; i < words.length; i++) { + const word = words[i]; + const match = SPLIT_SEPARATE_NUMBER_RE.exec(word); + if (match) { + const offset = match.index + ((_a = match[1]) != null ? _a : match[2]).length; + words.splice(i, 1, word.slice(0, offset), word.slice(offset)); + } + } + return words; +} +function pascalCase(input, options) { + var _a; + const [prefix, words, suffix] = splitPrefixSuffix(input, options); + const lower = lowerFactory(options == null ? void 0 : options.locale); + const upper = upperFactory(options == null ? void 0 : options.locale); + const transform = (options == null ? void 0 : options.mergeAmbiguousCharacters) ? capitalCaseTransformFactory(lower, upper) : pascalCaseTransformFactory(lower, upper); + return prefix + words.map(transform).join((_a = options == null ? void 0 : options.delimiter) != null ? _a : "") + suffix; +} +function lowerFactory(locale) { + return locale === false ? (input) => input.toLowerCase() : (input) => input.toLocaleLowerCase(locale); +} +function upperFactory(locale) { + return locale === false ? (input) => input.toUpperCase() : (input) => input.toLocaleUpperCase(locale); +} +function capitalCaseTransformFactory(lower, upper) { + return (word) => `${upper(word[0])}${lower(word.slice(1))}`; +} +function pascalCaseTransformFactory(lower, upper) { + return (word, index) => { + const char0 = word[0]; + const initial = index > 0 && char0 >= "0" && char0 <= "9" ? "_" + char0 : upper(char0); + return initial + lower(word.slice(1)); + }; +} +function splitPrefixSuffix(input, options = {}) { + var _a, _b, _c; + const splitFn = (_a = options.split) != null ? _a : options.separateNumbers ? splitSeparateNumbers : split; + const prefixCharacters = (_b = options.prefixCharacters) != null ? _b : DEFAULT_PREFIX_SUFFIX_CHARACTERS; + const suffixCharacters = (_c = options.suffixCharacters) != null ? _c : DEFAULT_PREFIX_SUFFIX_CHARACTERS; + let prefixIndex = 0; + let suffixIndex = input.length; + while (prefixIndex < input.length) { + const char = input.charAt(prefixIndex); + if (!prefixCharacters.includes(char)) + break; + prefixIndex++; + } + while (suffixIndex > prefixIndex) { + const index = suffixIndex - 1; + const char = input.charAt(index); + if (!suffixCharacters.includes(char)) + break; + suffixIndex = index; + } + return [ + input.slice(0, prefixIndex), + splitFn(input.slice(prefixIndex, suffixIndex)), + input.slice(suffixIndex) + ]; +} + +// src/transform/components-object.ts +var import_node_perf_hooks2 = require("node:perf_hooks"); + +// src/transform/header-object.ts +var import_ref_utils4 = require("@redocly/openapi-core/lib/ref-utils.js"); +var import_typescript4 = __toESM(require("typescript"), 1); + +// src/transform/schema-object.ts +var import_ref_utils3 = require("@redocly/openapi-core/lib/ref-utils.js"); +var import_typescript3 = __toESM(require("typescript"), 1); +function transformSchemaObject(schemaObject, options) { + const type = transformSchemaObjectWithComposition(schemaObject, options); + if (typeof options.ctx.postTransform === "function") { + const postTransformResult = options.ctx.postTransform(type, options); + if (postTransformResult) { + return postTransformResult; + } + } + return type; +} +function transformSchemaObjectWithComposition(schemaObject, options) { + var _a, _b, _c, _d, _e; + if (!schemaObject) { + return NEVER; + } + if (schemaObject === true) { + return UNKNOWN; + } + if (Array.isArray(schemaObject) || typeof schemaObject !== "object") { + throw new Error( + `Expected SchemaObject, received ${Array.isArray(schemaObject) ? "Array" : typeof schemaObject} at ${options.path}` + ); + } + if ("$ref" in schemaObject) { + return oapiRef(schemaObject.$ref); + } + if (schemaObject.const !== null && schemaObject.const !== void 0) { + return tsLiteral(schemaObject.const); + } + if (Array.isArray(schemaObject.enum) && (!("type" in schemaObject) || schemaObject.type !== "object") && !("properties" in schemaObject) && !("additionalProperties" in schemaObject)) { + if (options.ctx.enum && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number" || v === null)) { + let enumName = (0, import_ref_utils3.parseRef)((_a = options.path) != null ? _a : "").pointer.join("/"); + enumName = enumName.replace("components/schemas", ""); + const metadata = schemaObject.enum.map((_, i) => { + var _a2, _b2, _c2, _d2, _e2, _f; + return { + name: (_c2 = (_a2 = schemaObject["x-enum-varnames"]) == null ? void 0 : _a2[i]) != null ? _c2 : (_b2 = schemaObject["x-enumNames"]) == null ? void 0 : _b2[i], + description: (_f = (_d2 = schemaObject["x-enum-descriptions"]) == null ? void 0 : _d2[i]) != null ? _f : (_e2 = schemaObject["x-enumDescriptions"]) == null ? void 0 : _e2[i] + }; + }); + let hasNull = false; + const validSchemaEnums = schemaObject.enum.filter((enumValue) => { + if (enumValue === null) { + hasNull = true; + return false; + } + return true; + }); + const enumType2 = tsEnum(enumName, validSchemaEnums, metadata, { + shouldCache: options.ctx.dedupeEnums, + export: true + // readonly: TS enum do not support the readonly modifier + }); + if (!options.ctx.injectFooter.includes(enumType2)) { + options.ctx.injectFooter.push(enumType2); + } + const ref = import_typescript3.default.factory.createTypeReferenceNode(enumType2.name); + return hasNull ? tsUnion([ref, NULL]) : ref; + } + const enumType = schemaObject.enum.map(tsLiteral); + if ((Array.isArray(schemaObject.type) && schemaObject.type.includes("null") || schemaObject.nullable) && !schemaObject.default) { + enumType.push(NULL); + } + const unionType = tsUnion(enumType); + if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { + let enumValuesVariableName = (0, import_ref_utils3.parseRef)((_b = options.path) != null ? _b : "").pointer.join("/"); + enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); + enumValuesVariableName = `${enumValuesVariableName}Values`; + const enumValuesArray = tsArrayLiteralExpression( + enumValuesVariableName, + oapiRef((_c = options.path) != null ? _c : ""), + schemaObject.enum, + { + export: true, + readonly: true, + injectFooter: options.ctx.injectFooter + } + ); + options.ctx.injectFooter.push(enumValuesArray); + } + return unionType; + } + function collectUnionCompositions(items) { + const output = []; + for (const item of items) { + output.push(transformSchemaObject(item, options)); + } + return output; + } + function collectAllOfCompositions(items, required) { + const output = []; + for (const item of items) { + let itemType; + if ("$ref" in item) { + itemType = transformSchemaObject(item, options); + const resolved = options.ctx.resolve(item.$ref); + if (resolved && typeof resolved === "object" && "properties" in resolved && // we have already handled this item (discriminator property was already added as required) + !options.ctx.discriminators.refsHandled.includes(item.$ref)) { + const validRequired = (required != null ? required : []).filter((key) => { + var _a2; + return !!((_a2 = resolved.properties) == null ? void 0 : _a2[key]); + }); + if (validRequired.length) { + itemType = tsWithRequired(itemType, validRequired, options.ctx.injectFooter); + } + } + } else { + const itemRequired = [...required != null ? required : []]; + if (typeof item === "object" && Array.isArray(item.required)) { + itemRequired.push(...item.required); + } + itemType = transformSchemaObject({ ...item, required: itemRequired }, options); + } + output.push(itemType); + } + return output; + } + let finalType = void 0; + const coreObjectType = transformSchemaObjectCore(schemaObject, options); + const allOfType = collectAllOfCompositions((_d = schemaObject.allOf) != null ? _d : [], schemaObject.required); + if (coreObjectType || allOfType.length) { + const allOf = allOfType.length ? tsIntersection(allOfType) : void 0; + finalType = tsIntersection([...coreObjectType ? [coreObjectType] : [], ...allOf ? [allOf] : []]); + } + const anyOfType = collectUnionCompositions((_e = schemaObject.anyOf) != null ? _e : []); + if (anyOfType.length) { + finalType = tsUnion([...finalType ? [finalType] : [], ...anyOfType]); + } + const oneOfType = collectUnionCompositions( + schemaObject.oneOf || "type" in schemaObject && schemaObject.type === "object" && schemaObject.enum || [] + ); + if (oneOfType.length) { + if (oneOfType.every(tsIsPrimitive)) { + finalType = tsUnion([...finalType ? [finalType] : [], ...oneOfType]); + } else { + finalType = tsIntersection([...finalType ? [finalType] : [], tsUnion(oneOfType)]); + } + } + if (!finalType) { + if ("type" in schemaObject) { + finalType = tsRecord(STRING, options.ctx.emptyObjectsUnknown ? UNKNOWN : NEVER); + } else { + finalType = UNKNOWN; + } + } + if (finalType !== UNKNOWN && schemaObject.nullable && !schemaObject.default) { + finalType = tsNullable([finalType]); + } + return finalType; +} +function transformSchemaObjectCore(schemaObject, options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j; + if ("type" in schemaObject && schemaObject.type) { + if (typeof options.ctx.transform === "function") { + const result = options.ctx.transform(schemaObject, options); + if (result && typeof result === "object") { + if ("schema" in result) { + if (result.questionToken) { + return import_typescript3.default.factory.createUnionTypeNode([result.schema, UNDEFINED]); + } else { + return result.schema; + } + } else { + return result; + } + } + } + if (schemaObject.type === "null") { + return NULL; + } + if (schemaObject.type === "string") { + return STRING; + } + if (schemaObject.type === "number" || schemaObject.type === "integer") { + return NUMBER; + } + if (schemaObject.type === "boolean") { + return BOOLEAN; + } + if (schemaObject.type === "array") { + let itemType = UNKNOWN; + if (schemaObject.prefixItems || Array.isArray(schemaObject.items)) { + const prefixItems = (_a = schemaObject.prefixItems) != null ? _a : schemaObject.items; + itemType = import_typescript3.default.factory.createTupleTypeNode(prefixItems.map((item) => transformSchemaObject(item, options))); + } else if (schemaObject.items) { + if ("type" in schemaObject.items && schemaObject.items.type === "array") { + itemType = import_typescript3.default.factory.createArrayTypeNode(transformSchemaObject(schemaObject.items, options)); + } else { + itemType = transformSchemaObject(schemaObject.items, options); + } + } + const min = typeof schemaObject.minItems === "number" && schemaObject.minItems >= 0 ? schemaObject.minItems : 0; + const max = typeof schemaObject.maxItems === "number" && schemaObject.maxItems >= 0 && min <= schemaObject.maxItems ? schemaObject.maxItems : void 0; + const estimateCodeSize = typeof max !== "number" ? min : (max * (max + 1) - min * (min - 1)) / 2; + if (options.ctx.arrayLength && (min !== 0 || max !== void 0) && estimateCodeSize < 30) { + if (min === max) { + const elements = []; + for (let i = 0; i < min; i++) { + elements.push(itemType); + } + return tsUnion([import_typescript3.default.factory.createTupleTypeNode(elements)]); + } else if (schemaObject.maxItems > 0) { + const members = []; + for (let i = 0; i <= (max != null ? max : 0) - min; i++) { + const elements = []; + for (let j = min; j < i + min; j++) { + elements.push(itemType); + } + members.push(import_typescript3.default.factory.createTupleTypeNode(elements)); + } + return tsUnion(members); + } else { + const elements = []; + for (let i = 0; i < min; i++) { + elements.push(itemType); + } + elements.push(import_typescript3.default.factory.createRestTypeNode(import_typescript3.default.factory.createArrayTypeNode(itemType))); + return import_typescript3.default.factory.createTupleTypeNode(elements); + } + } + const finalType = import_typescript3.default.isTupleTypeNode(itemType) || import_typescript3.default.isArrayTypeNode(itemType) ? itemType : import_typescript3.default.factory.createArrayTypeNode(itemType); + return options.ctx.immutable ? import_typescript3.default.factory.createTypeOperatorNode(import_typescript3.default.SyntaxKind.ReadonlyKeyword, finalType) : finalType; + } + if (Array.isArray(schemaObject.type) && !Array.isArray(schemaObject)) { + const uniqueTypes = []; + if (Array.isArray(schemaObject.oneOf)) { + for (const t of schemaObject.type) { + if ((t === "boolean" || t === "string" || t === "number" || t === "integer" || t === "null") && schemaObject.oneOf.find((o) => typeof o === "object" && "type" in o && o.type === t)) { + continue; + } + uniqueTypes.push( + t === "null" || t === null ? NULL : transformSchemaObject( + { ...schemaObject, type: t, oneOf: void 0 }, + // don’t stack oneOf transforms + options + ) + ); + } + } else { + for (const t of schemaObject.type) { + if (t === "null" || t === null) { + if (!schemaObject.default) { + uniqueTypes.push(NULL); + } + } else { + uniqueTypes.push(transformSchemaObject({ ...schemaObject, type: t }, options)); + } + } + } + return tsUnion(uniqueTypes); + } + } + const coreObjectType = []; + for (const k of ["allOf", "anyOf"]) { + if (!schemaObject[k]) { + continue; + } + const discriminator = !schemaObject.discriminator && !options.ctx.discriminators.refsHandled.includes((_b = options.path) != null ? _b : "") && options.ctx.discriminators.objects[(_c = options.path) != null ? _c : ""]; + if (discriminator) { + coreObjectType.unshift( + createDiscriminatorProperty(discriminator, { + path: (_d = options.path) != null ? _d : "", + readonly: options.ctx.immutable + }) + ); + break; + } + } + if ("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length || "additionalProperties" in schemaObject && schemaObject.additionalProperties || "$defs" in schemaObject && schemaObject.$defs) { + if (Object.keys((_e = schemaObject.properties) != null ? _e : {}).length) { + for (const [k, v] of getEntries((_f = schemaObject.properties) != null ? _f : {}, options.ctx)) { + if (typeof v !== "object" || Array.isArray(v)) { + throw new Error( + `${options.path}: invalid property ${k}. Expected Schema Object, got ${Array.isArray(v) ? "Array" : typeof v}` + ); + } + if (options.ctx.excludeDeprecated) { + const resolved = "$ref" in v ? options.ctx.resolve(v.$ref) : v; + if (resolved == null ? void 0 : resolved.deprecated) { + continue; + } + } + let optional = ((_g = schemaObject.required) == null ? void 0 : _g.includes(k)) || schemaObject.required === void 0 && options.ctx.propertiesRequiredByDefault || "default" in v && options.ctx.defaultNonNullable && !((_h = options.path) == null ? void 0 : _h.includes("parameters")) && !((_i = options.path) == null ? void 0 : _i.includes("requestBody")) && !((_j = options.path) == null ? void 0 : _j.includes("requestBodies")) ? void 0 : QUESTION_TOKEN; + let type = "$ref" in v ? oapiRef(v.$ref) : transformSchemaObject(v, { + ...options, + path: createRef([options.path, k]) + }); + if (typeof options.ctx.transform === "function") { + const result = options.ctx.transform(v, options); + if (result && typeof result === "object") { + if ("schema" in result) { + type = result.schema; + optional = result.questionToken ? QUESTION_TOKEN : optional; + } else { + type = result; + } + } + } + const property = import_typescript3.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ + readonly: options.ctx.immutable || "readOnly" in v && !!v.readOnly + }), + /* name */ + tsPropertyIndex(k), + /* questionToken */ + optional, + /* type */ + type + ); + addJSDocComment(v, property); + coreObjectType.push(property); + } + } + if (schemaObject.$defs && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { + const defKeys = []; + for (const [k, v] of Object.entries(schemaObject.$defs)) { + const property = import_typescript3.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ + readonly: options.ctx.immutable || "readonly" in v && !!v.readOnly + }), + /* name */ + tsPropertyIndex(k), + /* questionToken */ + void 0, + /* type */ + transformSchemaObject(v, { + ...options, + path: createRef([options.path, "$defs", k]) + }) + ); + addJSDocComment(v, property); + defKeys.push(property); + } + coreObjectType.push( + import_typescript3.default.factory.createPropertySignature( + /* modifiers */ + void 0, + /* name */ + tsPropertyIndex("$defs"), + /* questionToken */ + void 0, + /* type */ + import_typescript3.default.factory.createTypeLiteralNode(defKeys) + ) + ); + } + if (schemaObject.additionalProperties || options.ctx.additionalProperties) { + const hasExplicitAdditionalProperties = typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length; + const addlType = hasExplicitAdditionalProperties ? transformSchemaObject(schemaObject.additionalProperties, options) : UNKNOWN; + return tsIntersection([ + ...coreObjectType.length ? [import_typescript3.default.factory.createTypeLiteralNode(coreObjectType)] : [], + import_typescript3.default.factory.createTypeLiteralNode([ + import_typescript3.default.factory.createIndexSignature( + /* modifiers */ + tsModifiers({ + readonly: options.ctx.immutable + }), + /* parameters */ + [ + import_typescript3.default.factory.createParameterDeclaration( + /* modifiers */ + void 0, + /* dotDotDotToken */ + void 0, + /* name */ + import_typescript3.default.factory.createIdentifier("key"), + /* questionToken */ + void 0, + /* type */ + STRING + ) + ], + /* type */ + addlType + ) + ]) + ]); + } + } + return coreObjectType.length ? import_typescript3.default.factory.createTypeLiteralNode(coreObjectType) : void 0; +} + +// src/transform/media-type-object.ts +function transformMediaTypeObject(mediaTypeObject, options) { + if (!mediaTypeObject.schema) { + return UNKNOWN; + } + return transformSchemaObject(mediaTypeObject.schema, options); +} + +// src/transform/header-object.ts +function transformHeaderObject(headerObject, options) { + var _a, _b; + if (headerObject.schema) { + return transformSchemaObject(headerObject.schema, options); + } + if (headerObject.content) { + const type = []; + for (const [contentType, mediaTypeObject] of getEntries((_a = headerObject.content) != null ? _a : {}, options.ctx)) { + const nextPath = `${(_b = options.path) != null ? _b : "#"}/${(0, import_ref_utils4.escapePointer)(contentType)}`; + const mediaType = "$ref" in mediaTypeObject ? transformSchemaObject(mediaTypeObject, { + ...options, + path: nextPath + }) : transformMediaTypeObject(mediaTypeObject, { + ...options, + path: nextPath + }); + const property = import_typescript4.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(contentType), + /* questionToken */ + void 0, + /* type */ + mediaType + ); + addJSDocComment(mediaTypeObject, property); + type.push(property); + } + return import_typescript4.default.factory.createTypeLiteralNode(type); + } + return UNKNOWN; +} + +// src/transform/parameter-object.ts +function transformParameterObject(parameterObject, options) { + return parameterObject.schema ? transformSchemaObject(parameterObject.schema, options) : STRING; +} + +// src/transform/path-item-object.ts +var import_typescript10 = __toESM(require("typescript"), 1); + +// src/transform/operation-object.ts +var import_typescript9 = __toESM(require("typescript"), 1); + +// src/transform/parameters-array.ts +var import_typescript5 = __toESM(require("typescript"), 1); +var PATH_PARAM_RE = /\{([^}]+)\}/g; +function createPathParameter(paramName) { + return { + name: paramName, + in: "path", + required: true, + schema: { type: "string" } + }; +} +function extractPathParamsFromUrl(path) { + const params = []; + const matches = path.match(PATH_PARAM_RE); + if (matches) { + for (const match of matches) { + const paramName = match.slice(1, -1); + params.push(createPathParameter(paramName)); + } + } + return params; +} +function transformParametersArray(parametersArray, options) { + const type = []; + const workingParameters = [...parametersArray]; + if (options.ctx.generatePathParams && options.path) { + const pathString = Array.isArray(options.path) ? options.path[0] : options.path; + if (typeof pathString === "string") { + const pathParams = extractPathParamsFromUrl(pathString); + for (const param of pathParams) { + const exists = workingParameters.some((p) => { + const resolved = "$ref" in p ? options.ctx.resolve(p.$ref) : p; + return (resolved == null ? void 0 : resolved.in) === "path" && (resolved == null ? void 0 : resolved.name) === param.name; + }); + if (!exists) { + workingParameters.push(param); + } + } + } + } + const paramType = []; + for (const paramIn of ["query", "header", "path", "cookie"]) { + const paramLocType = []; + let operationParameters = workingParameters.map((param) => ({ + original: param, + resolved: "$ref" in param ? options.ctx.resolve(param.$ref) : param + })); + if (options.ctx.alphabetize) { + operationParameters.sort((a, b) => { + var _a, _b, _c, _d; + return ((_b = (_a = a.resolved) == null ? void 0 : _a.name) != null ? _b : "").localeCompare((_d = (_c = b.resolved) == null ? void 0 : _c.name) != null ? _d : ""); + }); + } + if (options.ctx.excludeDeprecated) { + operationParameters = operationParameters.filter( + ({ resolved }) => { + var _a; + return !(resolved == null ? void 0 : resolved.deprecated) && !((_a = resolved == null ? void 0 : resolved.schema) == null ? void 0 : _a.deprecated); + } + ); + } + for (const { original, resolved } of operationParameters) { + if ((resolved == null ? void 0 : resolved.in) !== paramIn) { + continue; + } + let optional = void 0; + if (paramIn !== "path" && !resolved.required) { + optional = QUESTION_TOKEN; + } + const subType = "$ref" in original ? oapiRef(original.$ref) : transformParameterObject(resolved, { + ...options, + path: createRef([options.path, "parameters", resolved.in, resolved.name]) + }); + const property = import_typescript5.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(resolved == null ? void 0 : resolved.name), + /* questionToken */ + optional, + /* type */ + subType + ); + addJSDocComment(resolved, property); + paramLocType.push(property); + } + const allOptional = paramLocType.every((node) => !!node.questionToken); + paramType.push( + import_typescript5.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(paramIn), + /* questionToken */ + allOptional || !paramLocType.length ? QUESTION_TOKEN : void 0, + /* type */ + paramLocType.length ? import_typescript5.default.factory.createTypeLiteralNode(paramLocType) : NEVER + ) + ); + } + type.push( + import_typescript5.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex("parameters"), + /* questionToken */ + !paramType.length ? QUESTION_TOKEN : void 0, + /* type */ + paramType.length ? import_typescript5.default.factory.createTypeLiteralNode(paramType) : NEVER + ) + ); + return type; +} + +// src/transform/request-body-object.ts +var import_typescript6 = __toESM(require("typescript"), 1); +function transformRequestBodyObject(requestBodyObject, options) { + var _a; + const type = []; + for (const [contentType, mediaTypeObject] of getEntries((_a = requestBodyObject.content) != null ? _a : {}, options.ctx)) { + const nextPath = createRef([options.path, contentType]); + const mediaType = "$ref" in mediaTypeObject ? transformSchemaObject(mediaTypeObject, { + ...options, + path: nextPath + }) : transformMediaTypeObject(mediaTypeObject, { + ...options, + path: nextPath + }); + const property = import_typescript6.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(contentType), + /* questionToken */ + void 0, + /* type */ + mediaType + ); + addJSDocComment(mediaTypeObject, property); + type.push(property); + } + return import_typescript6.default.factory.createTypeLiteralNode([ + import_typescript6.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex("content"), + /* questionToken */ + void 0, + /* type */ + import_typescript6.default.factory.createTypeLiteralNode( + type.length ? type : ( + // add `"*/*": never` if no media types are defined + [ + import_typescript6.default.factory.createPropertySignature( + /* modifiers */ + void 0, + /* name */ + tsPropertyIndex("*/*"), + /* questionToken */ + QUESTION_TOKEN, + /* type */ + NEVER + ) + ] + ) + ) + ) + ]); +} + +// src/transform/responses-object.ts +var import_typescript8 = __toESM(require("typescript"), 1); + +// src/transform/response-object.ts +var import_typescript7 = __toESM(require("typescript"), 1); +function transformResponseObject(responseObject, options) { + var _a; + const type = []; + const headersObject = []; + if (responseObject.headers) { + for (const [name, headerObject] of getEntries(responseObject.headers, options.ctx)) { + const optional = "$ref" in headerObject || headerObject.required ? void 0 : QUESTION_TOKEN; + const subType = "$ref" in headerObject ? oapiRef(headerObject.$ref) : transformHeaderObject(headerObject, { + ...options, + path: createRef([options.path, "headers", name]) + }); + const property = import_typescript7.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(name), + /* questionToken */ + optional, + /* type */ + subType + ); + addJSDocComment(headerObject, property); + headersObject.push(property); + } + } + headersObject.push( + import_typescript7.default.factory.createIndexSignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* parameters */ + [ + import_typescript7.default.factory.createParameterDeclaration( + /* modifiers */ + void 0, + /* dotDotDotToken */ + void 0, + /* name */ + import_typescript7.default.factory.createIdentifier("name"), + /* questionToken */ + void 0, + /* type */ + STRING + ) + ], + /* type */ + UNKNOWN + ) + ); + type.push( + import_typescript7.default.factory.createPropertySignature( + /* modifiers */ + void 0, + /* name */ + tsPropertyIndex("headers"), + /* questionToken */ + void 0, + /* type */ + import_typescript7.default.factory.createTypeLiteralNode(headersObject) + ) + ); + const contentObject = []; + if (responseObject.content) { + for (const [contentType, mediaTypeObject] of getEntries((_a = responseObject.content) != null ? _a : {}, options.ctx)) { + const property = import_typescript7.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(contentType), + /* questionToken */ + void 0, + /* type */ + transformMediaTypeObject(mediaTypeObject, { + ...options, + path: createRef([options.path, "content", contentType]) + }) + ); + contentObject.push(property); + } + } + if (contentObject.length) { + type.push( + import_typescript7.default.factory.createPropertySignature( + /* modifiers */ + void 0, + /* name */ + tsPropertyIndex("content"), + /* questionToken */ + void 0, + /* type */ + import_typescript7.default.factory.createTypeLiteralNode(contentObject) + ) + ); + } else { + type.push( + import_typescript7.default.factory.createPropertySignature( + /* modifiers */ + void 0, + /* name */ + tsPropertyIndex("content"), + /* questionToken */ + QUESTION_TOKEN, + /* type */ + NEVER + ) + ); + } + return import_typescript7.default.factory.createTypeLiteralNode(type); +} + +// src/transform/responses-object.ts +function transformResponsesObject(responsesObject, options) { + const type = []; + for (const [responseCode, responseObject] of getEntries(responsesObject, options.ctx)) { + const responseType = "$ref" in responseObject ? oapiRef(responseObject.$ref) : transformResponseObject(responseObject, { + ...options, + path: createRef([options.path, "responses", responseCode]) + }); + const property = import_typescript8.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(responseCode), + /* questionToken */ + void 0, + /* type */ + responseType + ); + addJSDocComment(responseObject, property); + type.push(property); + } + return type.length ? import_typescript8.default.factory.createTypeLiteralNode(type) : NEVER; +} + +// src/transform/operation-object.ts +function transformOperationObject(operationObject, options) { + var _a, _b, _c; + const type = []; + type.push(...transformParametersArray((_a = operationObject.parameters) != null ? _a : [], options)); + if (operationObject.requestBody) { + const requestBodyType = "$ref" in operationObject.requestBody ? oapiRef(operationObject.requestBody.$ref) : transformRequestBodyObject(operationObject.requestBody, { + ...options, + path: createRef([options.path, "requestBody"]) + }); + const required = !!((_b = "$ref" in operationObject.requestBody ? options.ctx.resolve(operationObject.requestBody.$ref) : operationObject.requestBody) == null ? void 0 : _b.required); + const property = import_typescript9.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex("requestBody"), + /* questionToken */ + required ? void 0 : QUESTION_TOKEN, + /* type */ + requestBodyType + ); + addJSDocComment(operationObject.requestBody, property); + type.push(property); + } else { + type.push( + import_typescript9.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex("requestBody"), + /* questionToken */ + QUESTION_TOKEN, + /* type */ + NEVER + ) + ); + } + type.push( + import_typescript9.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex("responses"), + /* questionToken */ + void 0, + /* type */ + transformResponsesObject((_c = operationObject.responses) != null ? _c : {}, options) + ) + ); + return type; +} +function injectOperationObject(operationId, operationObject, options) { + let operations = options.ctx.injectFooter.find( + (node) => import_typescript9.default.isInterfaceDeclaration(node) && node.name.text === "operations" + ); + if (!operations) { + operations = import_typescript9.default.factory.createInterfaceDeclaration( + /* modifiers */ + tsModifiers({ + export: true + // important: do NOT make this immutable + }), + /* name */ + import_typescript9.default.factory.createIdentifier("operations"), + /* typeParameters */ + void 0, + /* heritageClauses */ + void 0, + /* members */ + [] + ); + options.ctx.injectFooter.push(operations); + } + const type = transformOperationObject(operationObject, options); + operations.members = import_typescript9.default.factory.createNodeArray([ + ...operations.members, + import_typescript9.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(operationId), + /* questionToken */ + void 0, + /* type */ + import_typescript9.default.factory.createTypeLiteralNode(type) + ) + ]); +} + +// src/transform/path-item-object.ts +function transformPathItemObject(pathItem, options) { + var _a, _b, _c, _d, _e, _f; + const type = []; + type.push( + ...transformParametersArray((_a = pathItem.parameters) != null ? _a : [], { + ...options, + path: createRef([options.path, "parameters"]) + }) + ); + for (const method of ["get", "put", "post", "delete", "options", "head", "patch", "trace"]) { + const operationObject = pathItem[method]; + if (!operationObject || options.ctx.excludeDeprecated && ((_b = "$ref" in operationObject ? options.ctx.resolve(operationObject.$ref) : operationObject) == null ? void 0 : _b.deprecated)) { + type.push( + import_typescript10.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(method), + /* questionToken */ + QUESTION_TOKEN, + /* type */ + NEVER + ) + ); + continue; + } + const keyedParameters = {}; + if (!("$ref" in operationObject)) { + for (const parameter of [...(_c = pathItem.parameters) != null ? _c : [], ...(_d = operationObject.parameters) != null ? _d : []]) { + const name = "$ref" in parameter ? `${(_e = options.ctx.resolve(parameter.$ref)) == null ? void 0 : _e.in}-${(_f = options.ctx.resolve(parameter.$ref)) == null ? void 0 : _f.name}` : `${parameter.in}-${parameter.name}`; + if (name) { + keyedParameters[name] = parameter; + } + } + } + let operationType; + if ("$ref" in operationObject) { + operationType = oapiRef(operationObject.$ref); + } else if (operationObject.operationId) { + const operationId = operationObject.operationId.replace(HASH_RE, "/"); + operationType = oapiRef(createRef(["operations", operationId])); + injectOperationObject( + operationId, + { ...operationObject, parameters: Object.values(keyedParameters) }, + { ...options, path: createRef([options.path, method]) } + ); + } else { + operationType = import_typescript10.default.factory.createTypeLiteralNode( + transformOperationObject( + { ...operationObject, parameters: Object.values(keyedParameters) }, + { ...options, path: createRef([options.path, method]) } + ) + ); + } + const property = import_typescript10.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: options.ctx.immutable }), + /* name */ + tsPropertyIndex(method), + /* questionToken */ + void 0, + /* type */ + operationType + ); + addJSDocComment(operationObject, property); + type.push(property); + } + return import_typescript10.default.factory.createTypeLiteralNode(type); +} +var HASH_RE = /#/g; + +// src/transform/components-object.ts +var transformers = { + schemas: transformSchemaObject, + responses: transformResponseObject, + parameters: transformParameterObject, + requestBodies: transformRequestBodyObject, + headers: transformHeaderObject, + pathItems: transformPathItemObject +}; +function transformComponentsObject(componentsObject, ctx) { + const type = []; + const rootTypeAliases = {}; + for (const key of Object.keys(transformers)) { + const componentT = import_node_perf_hooks2.performance.now(); + const items = []; + if (componentsObject[key]) { + for (const [name, item] of getEntries(componentsObject[key], ctx)) { + let subType = transformers[key](item, { + path: createRef(["components", key, name]), + schema: item, + ctx + }); + let hasQuestionToken = false; + if (ctx.transform) { + const result = ctx.transform(item, { + path: createRef(["components", key, name]), + schema: item, + ctx + }); + if (result) { + if ("schema" in result) { + subType = result.schema; + hasQuestionToken = result.questionToken; + } else { + subType = result; + } + } + } + const property = import_typescript11.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: ctx.immutable }), + /* name */ + tsPropertyIndex(name), + /* questionToken */ + hasQuestionToken ? QUESTION_TOKEN : void 0, + /* type */ + subType + ); + addJSDocComment(item, property); + items.push(property); + if (ctx.rootTypes) { + const componentKey = pascalCase(singularizeComponentKey(key)); + let aliasName = `${componentKey}${pascalCase(name)}`; + let conflictCounter = 1; + while (rootTypeAliases[aliasName] !== void 0) { + conflictCounter++; + aliasName = `${componentKey}${pascalCase(name)}_${conflictCounter}`; + } + const ref = import_typescript11.default.factory.createTypeReferenceNode(`components['${key}']['${name}']`); + if (ctx.rootTypesNoSchemaPrefix && key === "schemas") { + aliasName = aliasName.replace(componentKey, ""); + } + const typeAlias = import_typescript11.default.factory.createTypeAliasDeclaration( + /* modifiers */ + tsModifiers({ export: true }), + /* name */ + aliasName, + /* typeParameters */ + void 0, + /* type */ + ref + ); + rootTypeAliases[aliasName] = typeAlias; + } + } + } + type.push( + import_typescript11.default.factory.createPropertySignature( + /* modifiers */ + void 0, + /* name */ + tsPropertyIndex(key), + /* questionToken */ + void 0, + /* type */ + items.length ? import_typescript11.default.factory.createTypeLiteralNode(items) : NEVER + ) + ); + debug(`Transformed components \u2192 ${key}`, "ts", import_node_perf_hooks2.performance.now() - componentT); + } + let rootTypes = []; + if (ctx.rootTypes) { + rootTypes = Object.keys(rootTypeAliases).map((k) => rootTypeAliases[k]); + } + return [import_typescript11.default.factory.createTypeLiteralNode(type), ...rootTypes]; +} +function singularizeComponentKey(key) { + switch (key) { + // Handle special singular case + case "requestBodies": + return "requestBody"; + // Default to removing the "s" + default: + return key.slice(0, -1); + } +} + +// src/transform/paths-object.ts +var import_typescript12 = __toESM(require("typescript"), 1); +var import_node_perf_hooks3 = require("node:perf_hooks"); +var PATH_PARAM_RE2 = /\{[^}]+\}/g; +function transformPathsObject(pathsObject, ctx) { + var _a, _b; + const type = []; + for (const [url, pathItemObject] of getEntries(pathsObject, ctx)) { + if (!pathItemObject || typeof pathItemObject !== "object") { + continue; + } + const pathT = import_node_perf_hooks3.performance.now(); + if ("$ref" in pathItemObject) { + const property = import_typescript12.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: ctx.immutable }), + /* name */ + tsPropertyIndex(url), + /* questionToken */ + void 0, + /* type */ + oapiRef(pathItemObject.$ref) + ); + addJSDocComment(pathItemObject, property); + type.push(property); + } else { + const pathItemType = transformPathItemObject(pathItemObject, { + path: createRef(["paths", url]), + ctx + }); + if (ctx.pathParamsAsTypes && url.includes("{")) { + const pathParams = extractPathParams(pathItemObject, ctx); + const matches = url.match(PATH_PARAM_RE2); + let rawPath = `\`${url}\``; + if (matches) { + for (const match of matches) { + const paramName = match.slice(1, -1); + const param = pathParams[paramName]; + switch ((_a = param == null ? void 0 : param.schema) == null ? void 0 : _a.type) { + case "number": + case "integer": + rawPath = rawPath.replace(match, "${number}"); + break; + case "boolean": + rawPath = rawPath.replace(match, "${boolean}"); + break; + default: + rawPath = rawPath.replace(match, "${string}"); + break; + } + } + const pathType = (_b = stringToAST(rawPath)[0]) == null ? void 0 : _b.expression; + if (pathType) { + type.push( + import_typescript12.default.factory.createIndexSignature( + /* modifiers */ + tsModifiers({ readonly: ctx.immutable }), + /* parameters */ + [ + import_typescript12.default.factory.createParameterDeclaration( + /* modifiers */ + void 0, + /* dotDotDotToken */ + void 0, + /* name */ + "path", + /* questionToken */ + void 0, + /* type */ + pathType, + /* initializer */ + void 0 + ) + ], + /* type */ + pathItemType + ) + ); + continue; + } + } + } + type.push( + import_typescript12.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ readonly: ctx.immutable }), + /* name */ + tsPropertyIndex(url), + /* questionToken */ + void 0, + /* type */ + pathItemType + ) + ); + debug(`Transformed path "${url}"`, "ts", import_node_perf_hooks3.performance.now() - pathT); + } + } + return import_typescript12.default.factory.createTypeLiteralNode(type); +} +function extractPathParams(pathItemObject, ctx) { + var _a; + const params = {}; + for (const p of (_a = pathItemObject.parameters) != null ? _a : []) { + const resolved = "$ref" in p && p.$ref ? ctx.resolve(p.$ref) : p; + if (resolved && resolved.in === "path") { + params[resolved.name] = resolved; + } + } + for (const method of ["get", "put", "post", "delete", "options", "head", "patch", "trace"]) { + if (!(method in pathItemObject)) { + continue; + } + const resolvedMethod = pathItemObject[method].$ref ? ctx.resolve(pathItemObject[method].$ref) : pathItemObject[method]; + if (resolvedMethod == null ? void 0 : resolvedMethod.parameters) { + for (const p of resolvedMethod.parameters) { + const resolvedParam = "$ref" in p && p.$ref ? ctx.resolve(p.$ref) : p; + if (resolvedParam && resolvedParam.in === "path") { + params[resolvedParam.name] = resolvedParam; + } + } + } + } + return params; +} + +// src/transform/webhooks-object.ts +var import_typescript13 = __toESM(require("typescript"), 1); +function transformWebhooksObject(webhooksObject, options) { + const type = []; + for (const [name, pathItemObject] of getEntries(webhooksObject, options)) { + type.push( + import_typescript13.default.factory.createPropertySignature( + /* modifiers */ + tsModifiers({ + readonly: options.immutable + }), + /* name */ + tsPropertyIndex(name), + /* questionToken */ + void 0, + /* type */ + transformPathItemObject(pathItemObject, { + path: createRef(["webhooks", name]), + ctx: options + }) + ) + ); + } + return import_typescript13.default.factory.createTypeLiteralNode(type); +} + +// src/transform/paths-enum.ts +function makeApiPathsEnum(pathsObject) { + const enumKeys = []; + const enumMetaData = []; + for (const [url, pathItemObject] of getEntries(pathsObject)) { + for (const [method, operation] of Object.entries(pathItemObject)) { + if (!["get", "put", "post", "delete", "options", "head", "patch", "trace"].includes(method)) { + continue; + } + let pathName; + if (operation.operationId) { + pathName = operation.operationId; + } else { + pathName = (method + url).split("/").map((part) => { + const capitalised = part.charAt(0).toUpperCase() + part.slice(1); + return capitalised.replace(/{.*}|:.*|[^a-zA-Z\d_]+/, ""); + }).join(""); + } + const adaptedUrl = url.replace(/{(\w+)}/g, ":$1"); + enumKeys.push(adaptedUrl); + enumMetaData.push({ + name: pathName + }); + } + } + return tsEnum("ApiPaths", enumKeys, enumMetaData, { + export: true + }); +} + +// src/transform/index.ts +var transformers2 = { + paths: transformPathsObject, + webhooks: transformWebhooksObject, + components: transformComponentsObject, + $defs: (node, options) => transformSchemaObject(node, { path: createRef(["$defs"]), ctx: options, schema: node }) +}; +function transformSchema(schema, ctx) { + var _a, _b; + const type = []; + if (ctx.inject) { + const injectNodes = stringToAST(ctx.inject); + type.push(...injectNodes); + } + for (const root of Object.keys(transformers2)) { + const emptyObj = import_typescript14.default.factory.createTypeAliasDeclaration( + /* modifiers */ + tsModifiers({ export: true }), + /* name */ + root, + /* typeParameters */ + void 0, + /* type */ + tsRecord(STRING, NEVER) + ); + if (schema[root] && typeof schema[root] === "object") { + const rootT = import_node_perf_hooks4.performance.now(); + const subTypes = [].concat(transformers2[root](schema[root], ctx)); + for (const subType of subTypes) { + if (import_typescript14.default.isTypeNode(subType)) { + if ((_a = subType.members) == null ? void 0 : _a.length) { + type.push( + ctx.exportType ? import_typescript14.default.factory.createTypeAliasDeclaration( + /* modifiers */ + tsModifiers({ export: true }), + /* name */ + root, + /* typeParameters */ + void 0, + /* type */ + subType + ) : import_typescript14.default.factory.createInterfaceDeclaration( + /* modifiers */ + tsModifiers({ export: true }), + /* name */ + root, + /* typeParameters */ + void 0, + /* heritageClauses */ + void 0, + /* members */ + subType.members + ) + ); + debug(`${root} done`, "ts", import_node_perf_hooks4.performance.now() - rootT); + } else { + type.push(emptyObj); + debug(`${root} done (skipped)`, "ts", 0); + } + } else if (import_typescript14.default.isTypeAliasDeclaration(subType)) { + type.push(subType); + } else { + type.push(emptyObj); + debug(`${root} done (skipped)`, "ts", 0); + } + } + } else { + type.push(emptyObj); + debug(`${root} done (skipped)`, "ts", 0); + } + } + let hasOperations = false; + for (const injectedType of ctx.injectFooter) { + if (!hasOperations && ((_b = injectedType == null ? void 0 : injectedType.name) == null ? void 0 : _b.escapedText) === "operations") { + hasOperations = true; + } + type.push(injectedType); + } + if (!hasOperations) { + type.push( + import_typescript14.default.factory.createTypeAliasDeclaration( + /* modifiers */ + tsModifiers({ export: true }), + /* name */ + "operations", + /* typeParameters */ + void 0, + /* type */ + tsRecord(STRING, NEVER) + ) + ); + } + if (ctx.makePathsEnum && schema.paths) { + type.push(makeApiPathsEnum(schema.paths)); + } + return type; +} + +// src/index.ts +var COMMENT_HEADER = `/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +`; +async function openapiTS(source, options = {}) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v; + if (!source) { + throw new Error("Empty schema. Please specify a URL, file path, or Redocly Config"); + } + const redoc = (_a = options.redocly) != null ? _a : await (0, import_openapi_core2.createConfig)( + { + rules: { + "operation-operationId-unique": { severity: "error" } + // throw error on duplicate operationIDs + } + }, + { extends: ["minimal"] } + ); + const schema = await validateAndBundle(source, { + redoc, + cwd: options.cwd instanceof URL ? options.cwd : new URL(`file://${(_b = options.cwd) != null ? _b : process.cwd()}/`), + silent: (_c = options.silent) != null ? _c : false + }); + const ctx = { + additionalProperties: (_d = options.additionalProperties) != null ? _d : false, + alphabetize: (_e = options.alphabetize) != null ? _e : false, + arrayLength: (_f = options.arrayLength) != null ? _f : false, + defaultNonNullable: (_g = options.defaultNonNullable) != null ? _g : true, + discriminators: scanDiscriminators(schema, options), + emptyObjectsUnknown: (_h = options.emptyObjectsUnknown) != null ? _h : false, + enum: (_i = options.enum) != null ? _i : false, + enumValues: (_j = options.enumValues) != null ? _j : false, + dedupeEnums: (_k = options.dedupeEnums) != null ? _k : false, + excludeDeprecated: (_l = options.excludeDeprecated) != null ? _l : false, + exportType: (_m = options.exportType) != null ? _m : false, + immutable: (_n = options.immutable) != null ? _n : false, + rootTypes: (_o = options.rootTypes) != null ? _o : false, + rootTypesNoSchemaPrefix: (_p = options.rootTypesNoSchemaPrefix) != null ? _p : false, + injectFooter: [], + pathParamsAsTypes: (_q = options.pathParamsAsTypes) != null ? _q : false, + postTransform: typeof options.postTransform === "function" ? options.postTransform : void 0, + propertiesRequiredByDefault: (_r = options.propertiesRequiredByDefault) != null ? _r : false, + redoc, + silent: (_s = options.silent) != null ? _s : false, + inject: (_t = options.inject) != null ? _t : void 0, + transform: typeof options.transform === "function" ? options.transform : void 0, + makePathsEnum: (_u = options.makePathsEnum) != null ? _u : false, + generatePathParams: (_v = options.generatePathParams) != null ? _v : false, + resolve($ref) { + var _a2; + return resolveRef(schema, $ref, { silent: (_a2 = options.silent) != null ? _a2 : false }); + } + }; + const transformT = import_node_perf_hooks5.performance.now(); + const result = transformSchema(schema, ctx); + debug("Completed AST transformation for entire document", "ts", import_node_perf_hooks5.performance.now() - transformT); + return result; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + BOOLEAN, + COMMENT_HEADER, + FALSE, + JS_ENUM_INVALID_CHARS_RE, + JS_PROPERTY_INDEX_INVALID_CHARS_RE, + JS_PROPERTY_INDEX_RE, + NEVER, + NULL, + NUMBER, + QUESTION_TOKEN, + SPECIAL_CHARACTER_MAP, + STRING, + TRUE, + UNDEFINED, + UNKNOWN, + addJSDocComment, + astToString, + c, + createDiscriminatorProperty, + createRef, + debug, + enumCache, + error, + formatTime, + getEntries, + injectOperationObject, + oapiRef, + resolveRef, + scanDiscriminators, + stringToAST, + transformComponentsObject, + transformHeaderObject, + transformMediaTypeObject, + transformOperationObject, + transformParameterObject, + transformPathItemObject, + transformPathsObject, + transformRequestBodyObject, + transformResponseObject, + transformResponsesObject, + transformSchema, + transformSchemaObject, + transformSchemaObjectWithComposition, + tsArrayLiteralExpression, + tsDedupe, + tsEnum, + tsEnumMember, + tsIntersection, + tsIsPrimitive, + tsLiteral, + tsModifiers, + tsNullable, + tsOmit, + tsPropertyIndex, + tsReadonlyArray, + tsRecord, + tsUnion, + tsWithRequired, + walk, + warn +}); diff --git a/package/dist/index.d.ts b/package/dist/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..000a7e05edfe9b4d794e28c01c7de1a569772d2e --- /dev/null +++ b/package/dist/index.d.ts @@ -0,0 +1,23 @@ +import type { Readable } from "node:stream"; +import type ts from "typescript"; +import type { OpenAPI3, OpenAPITSOptions } from "./types.js"; +export * from "./lib/ts.js"; +export * from "./lib/utils.js"; +export { default as transformSchema } from "./transform/index.js"; +export { default as transformComponentsObject } from "./transform/components-object.js"; +export { default as transformHeaderObject } from "./transform/header-object.js"; +export { default as transformMediaTypeObject } from "./transform/media-type-object.js"; +export * from "./transform/operation-object.js"; +export { default as transformOperationObject } from "./transform/operation-object.js"; +export { default as transformParameterObject } from "./transform/parameter-object.js"; +export * from "./transform/path-item-object.js"; +export { default as transformPathItemObject } from "./transform/path-item-object.js"; +export { default as transformPathsObject } from "./transform/paths-object.js"; +export { default as transformRequestBodyObject } from "./transform/request-body-object.js"; +export { default as transformResponseObject } from "./transform/response-object.js"; +export { default as transformResponsesObject } from "./transform/responses-object.js"; +export * from "./transform/schema-object.js"; +export { default as transformSchemaObject } from "./transform/schema-object.js"; +export * from "./types.js"; +export declare const COMMENT_HEADER = "/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\n"; +export default function openapiTS(source: string | URL | OpenAPI3 | Buffer | Readable, options?: OpenAPITSOptions): Promise; diff --git a/package/dist/index.js b/package/dist/index.js new file mode 100644 index 0000000000000000000000000000000000000000..874c6af113bb443a15f3adba77367db46019f88f --- /dev/null +++ b/package/dist/index.js @@ -0,0 +1,79 @@ +import { createConfig } from "@redocly/openapi-core"; +import { performance } from "node:perf_hooks"; +import { validateAndBundle } from "./lib/redoc.js"; +import { debug, resolveRef, scanDiscriminators } from "./lib/utils.js"; +import transformSchema from "./transform/index.js"; +export * from "./lib/ts.js"; +export * from "./lib/utils.js"; +export { default as transformSchema } from "./transform/index.js"; +export { default as transformComponentsObject } from "./transform/components-object.js"; +export { default as transformHeaderObject } from "./transform/header-object.js"; +export { default as transformMediaTypeObject } from "./transform/media-type-object.js"; +export * from "./transform/operation-object.js"; +export { default as transformOperationObject } from "./transform/operation-object.js"; +export { default as transformParameterObject } from "./transform/parameter-object.js"; +export * from "./transform/path-item-object.js"; +export { default as transformPathItemObject } from "./transform/path-item-object.js"; +export { default as transformPathsObject } from "./transform/paths-object.js"; +export { default as transformRequestBodyObject } from "./transform/request-body-object.js"; +export { default as transformResponseObject } from "./transform/response-object.js"; +export { default as transformResponsesObject } from "./transform/responses-object.js"; +export * from "./transform/schema-object.js"; +export { default as transformSchemaObject } from "./transform/schema-object.js"; +export * from "./types.js"; +export const COMMENT_HEADER = `/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +`; +export default async function openapiTS(source, options = {}) { + if (!source) { + throw new Error("Empty schema. Please specify a URL, file path, or Redocly Config"); + } + const redoc = options.redocly ?? + (await createConfig({ + rules: { + "operation-operationId-unique": { severity: "error" }, + }, + }, { extends: ["minimal"] })); + const schema = await validateAndBundle(source, { + redoc, + cwd: options.cwd instanceof URL ? options.cwd : new URL(`file://${options.cwd ?? process.cwd()}/`), + silent: options.silent ?? false, + }); + const ctx = { + additionalProperties: options.additionalProperties ?? false, + alphabetize: options.alphabetize ?? false, + arrayLength: options.arrayLength ?? false, + defaultNonNullable: options.defaultNonNullable ?? true, + discriminators: scanDiscriminators(schema, options), + emptyObjectsUnknown: options.emptyObjectsUnknown ?? false, + enum: options.enum ?? false, + enumValues: options.enumValues ?? false, + dedupeEnums: options.dedupeEnums ?? false, + excludeDeprecated: options.excludeDeprecated ?? false, + exportType: options.exportType ?? false, + immutable: options.immutable ?? false, + rootTypes: options.rootTypes ?? false, + rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false, + injectFooter: [], + pathParamsAsTypes: options.pathParamsAsTypes ?? false, + postTransform: typeof options.postTransform === "function" ? options.postTransform : undefined, + propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false, + redoc, + silent: options.silent ?? false, + inject: options.inject ?? undefined, + transform: typeof options.transform === "function" ? options.transform : undefined, + makePathsEnum: options.makePathsEnum ?? false, + generatePathParams: options.generatePathParams ?? false, + resolve($ref) { + return resolveRef(schema, $ref, { silent: options.silent ?? false }); + }, + }; + const transformT = performance.now(); + const result = transformSchema(schema, ctx); + debug("Completed AST transformation for entire document", "ts", performance.now() - transformT); + return result; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/package/dist/index.js.map b/package/dist/index.js.map new file mode 100644 index 0000000000000000000000000000000000000000..9361e8525760b511525673ac2d7103d807b5d2dc --- /dev/null +++ b/package/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/lib/redoc.d.ts b/package/dist/lib/redoc.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..9be3f02330d78a14c36dd338e1ef3955c7b6bf97 --- /dev/null +++ b/package/dist/lib/redoc.d.ts @@ -0,0 +1,15 @@ +import { BaseResolver, type Config as RedoclyConfig, type Document } from "@redocly/openapi-core"; +import { Readable } from "node:stream"; +import type { OpenAPI3 } from "../types.js"; +export interface ValidateAndBundleOptions { + redoc: RedoclyConfig; + silent: boolean; + cwd?: URL; +} +interface ParseSchemaOptions { + absoluteRef: string; + resolver: BaseResolver; +} +export declare function parseSchema(schema: unknown, { absoluteRef, resolver }: ParseSchemaOptions): Promise; +export declare function validateAndBundle(source: string | URL | OpenAPI3 | Readable | Buffer, options: ValidateAndBundleOptions): Promise; +export {}; diff --git a/package/dist/lib/redoc.js b/package/dist/lib/redoc.js new file mode 100644 index 0000000000000000000000000000000000000000..65b6a32871426d5bb3461c2c98c4cc76b4cd1098 --- /dev/null +++ b/package/dist/lib/redoc.js @@ -0,0 +1,124 @@ +import { BaseResolver, bundle, makeDocumentFromString, Source, lintDocument, } from "@redocly/openapi-core"; +import { performance } from "node:perf_hooks"; +import { Readable } from "node:stream"; +import { fileURLToPath } from "node:url"; +import parseJson from "parse-json"; +import { debug, error, warn } from "./utils.js"; +export async function parseSchema(schema, { absoluteRef, resolver }) { + if (!schema) { + throw new Error("Can’t parse empty schema"); + } + if (schema instanceof URL) { + const result = await resolver.resolveDocument(null, absoluteRef, true); + if ("parsed" in result) { + return result; + } + throw result.originalError; + } + if (schema instanceof Readable) { + const contents = await new Promise((resolve) => { + schema.resume(); + schema.setEncoding("utf8"); + let content = ""; + schema.on("data", (chunk) => { + content += chunk; + }); + schema.on("end", () => { + resolve(content.trim()); + }); + }); + return parseSchema(contents, { absoluteRef, resolver }); + } + if (schema instanceof Buffer) { + return parseSchema(schema.toString("utf8"), { absoluteRef, resolver }); + } + if (typeof schema === "string") { + if (schema.startsWith("http://") || schema.startsWith("https://") || schema.startsWith("file://")) { + const url = new URL(schema); + return parseSchema(url, { + absoluteRef: url.protocol === "file:" ? fileURLToPath(url) : url.href, + resolver, + }); + } + if (schema[0] === "{") { + return { + source: new Source(absoluteRef, schema, "application/json"), + parsed: parseJson(schema), + }; + } + return makeDocumentFromString(schema, absoluteRef); + } + if (typeof schema === "object" && !Array.isArray(schema)) { + return { + source: new Source(absoluteRef, JSON.stringify(schema), "application/json"), + parsed: schema, + }; + } + throw new Error(`Expected string, object, or Buffer. Got ${Array.isArray(schema) ? "Array" : typeof schema}`); +} +function _processProblems(problems, options) { + if (problems.length) { + let errorMessage = undefined; + for (const problem of problems) { + const problemLocation = problem.location?.[0].pointer; + const problemMessage = problemLocation ? `${problem.message} at ${problemLocation}` : problem.message; + if (problem.severity === "error") { + errorMessage = problemMessage; + error(problemMessage); + } + else { + warn(problemMessage, options.silent); + } + } + if (errorMessage) { + throw new Error(errorMessage); + } + } +} +export async function validateAndBundle(source, options) { + const redocConfigT = performance.now(); + debug("Loaded Redoc config", "redoc", performance.now() - redocConfigT); + const redocParseT = performance.now(); + let absoluteRef = fileURLToPath(new URL(options?.cwd ?? `file://${process.cwd()}/`)); + if (source instanceof URL) { + absoluteRef = source.protocol === "file:" ? fileURLToPath(source) : source.href; + } + const resolver = new BaseResolver(options.redoc.resolve); + const document = await parseSchema(source, { + absoluteRef, + resolver, + }); + debug("Parsed schema", "redoc", performance.now() - redocParseT); + const openapiVersion = Number.parseFloat(document.parsed.openapi); + if (document.parsed.swagger || + !document.parsed.openapi || + Number.isNaN(openapiVersion) || + openapiVersion < 3 || + openapiVersion >= 4) { + if (document.parsed.swagger) { + throw new Error("Unsupported Swagger version: 2.x. Use OpenAPI 3.x instead."); + } + if (document.parsed.openapi || openapiVersion < 3 || openapiVersion >= 4) { + throw new Error(`Unsupported OpenAPI version: ${document.parsed.openapi}`); + } + throw new Error("Unsupported schema format, expected `openapi: 3.x`"); + } + const redocLintT = performance.now(); + const problems = await lintDocument({ + document, + config: options.redoc.styleguide, + externalRefResolver: resolver, + }); + _processProblems(problems, options); + debug("Linted schema", "lint", performance.now() - redocLintT); + const redocBundleT = performance.now(); + const bundled = await bundle({ + config: options.redoc, + dereference: false, + doc: document, + }); + _processProblems(bundled.problems, options); + debug("Bundled schema", "bundle", performance.now() - redocBundleT); + return bundled.bundle.parsed; +} +//# sourceMappingURL=redoc.js.map \ No newline at end of file diff --git a/package/dist/lib/redoc.js.map b/package/dist/lib/redoc.js.map new file mode 100644 index 0000000000000000000000000000000000000000..fe7a3c1a32ece9ba29d30496fb63ebb8747533d2 --- /dev/null +++ b/package/dist/lib/redoc.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redoc.js","sourceRoot":"","sources":["../../src/lib/redoc.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/lib/ts.d.ts b/package/dist/lib/ts.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6e31e0ec46ae870dc987766511a52ab26663cf8d --- /dev/null +++ b/package/dist/lib/ts.d.ts @@ -0,0 +1,69 @@ +import ts from "typescript"; +export declare const JS_PROPERTY_INDEX_RE: RegExp; +export declare const JS_ENUM_INVALID_CHARS_RE: RegExp; +export declare const JS_PROPERTY_INDEX_INVALID_CHARS_RE: RegExp; +export declare const SPECIAL_CHARACTER_MAP: Record; +export declare const BOOLEAN: ts.KeywordTypeNode; +export declare const FALSE: ts.LiteralTypeNode; +export declare const NEVER: ts.KeywordTypeNode; +export declare const NULL: ts.LiteralTypeNode; +export declare const NUMBER: ts.KeywordTypeNode; +export declare const QUESTION_TOKEN: ts.PunctuationToken; +export declare const STRING: ts.KeywordTypeNode; +export declare const TRUE: ts.LiteralTypeNode; +export declare const UNDEFINED: ts.KeywordTypeNode; +export declare const UNKNOWN: ts.KeywordTypeNode; +export interface AnnotatedSchemaObject { + const?: unknown; + default?: unknown; + deprecated?: boolean; + description?: string; + enum?: unknown[]; + example?: string; + format?: string; + nullable?: boolean; + summary?: string; + title?: string; + type?: string | string[]; +} +export declare function addJSDocComment(schemaObject: AnnotatedSchemaObject, node: ts.PropertySignature): void; +export declare function oapiRef(path: string): ts.TypeNode; +export interface AstToStringOptions { + fileName?: string; + sourceText?: string; + formatOptions?: ts.PrinterOptions; +} +export declare function astToString(ast: ts.Node | ts.Node[] | ts.TypeElement | ts.TypeElement[], options?: AstToStringOptions): string; +export declare function stringToAST(source: string): unknown[]; +export declare function tsDedupe(types: ts.TypeNode[]): ts.TypeNode[]; +export declare const enumCache: Map; +export declare function tsEnum(name: string, members: (string | number)[], metadata?: { + name?: string; + description?: string; +}[], options?: { + export?: boolean; + shouldCache?: boolean; +}): ts.EnumDeclaration; +export declare function tsArrayLiteralExpression(name: string, elementType: ts.TypeNode, values: (string | number)[], options?: { + export?: boolean; + readonly?: boolean; + injectFooter?: ts.Node[]; +}): ts.VariableStatement; +export declare function tsEnumMember(value: string | number, metadata?: { + name?: string; + description?: string; +}): ts.EnumMember; +export declare function tsIntersection(types: ts.TypeNode[]): ts.TypeNode; +export declare function tsIsPrimitive(type: ts.TypeNode): boolean; +export declare function tsLiteral(value: unknown): ts.TypeNode; +export declare function tsModifiers(modifiers: { + readonly?: boolean; + export?: boolean; +}): ts.Modifier[]; +export declare function tsNullable(types: ts.TypeNode[]): ts.TypeNode; +export declare function tsOmit(type: ts.TypeNode, keys: string[]): ts.TypeNode; +export declare function tsRecord(key: ts.TypeNode, value: ts.TypeNode): ts.TypeReferenceNode; +export declare function tsPropertyIndex(index: string | number): ts.Identifier | ts.NumericLiteral | ts.StringLiteral; +export declare function tsUnion(types: ts.TypeNode[]): ts.TypeNode; +export declare function tsWithRequired(type: ts.TypeNode, keys: string[], injectFooter: ts.Node[]): ts.TypeNode; +export declare function tsReadonlyArray(type: ts.TypeNode, injectFooter?: ts.Node[]): ts.TypeNode; diff --git a/package/dist/lib/ts.js b/package/dist/lib/ts.js new file mode 100644 index 0000000000000000000000000000000000000000..7f46f68fe5a4b6fab4b5cba34602cf1268903d5c --- /dev/null +++ b/package/dist/lib/ts.js @@ -0,0 +1,322 @@ +import { parseRef } from "@redocly/openapi-core/lib/ref-utils.js"; +import ts from "typescript"; +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; +export const JS_PROPERTY_INDEX_INVALID_CHARS_RE = /[^A-Za-z_$0-9]+/g; +export const SPECIAL_CHARACTER_MAP = { + "+": "Plus", +}; +export const BOOLEAN = ts.factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); +export const FALSE = ts.factory.createLiteralTypeNode(ts.factory.createFalse()); +export const NEVER = ts.factory.createKeywordTypeNode(ts.SyntaxKind.NeverKeyword); +export const NULL = ts.factory.createLiteralTypeNode(ts.factory.createNull()); +export const NUMBER = ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); +export const QUESTION_TOKEN = ts.factory.createToken(ts.SyntaxKind.QuestionToken); +export const STRING = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); +export const TRUE = ts.factory.createLiteralTypeNode(ts.factory.createTrue()); +export const UNDEFINED = ts.factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword); +export const UNKNOWN = ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword); +const LB_RE = /\r?\n/g; +const COMMENT_RE = /\*\//g; +export function addJSDocComment(schemaObject, node) { + if (!schemaObject || typeof schemaObject !== "object" || Array.isArray(schemaObject)) { + return; + } + const output = []; + if (schemaObject.title) { + output.push(schemaObject.title.replace(LB_RE, "\n * ")); + } + if (schemaObject.summary) { + output.push(schemaObject.summary.replace(LB_RE, "\n * ")); + } + if (schemaObject.format) { + output.push(`Format: ${schemaObject.format}`); + } + if (schemaObject.deprecated) { + output.push("@deprecated"); + } + const supportedJsDocTags = ["description", "default", "example"]; + for (const field of supportedJsDocTags) { + const allowEmptyString = field === "default" || field === "example"; + if (schemaObject[field] === undefined) { + continue; + } + if (schemaObject[field] === "" && !allowEmptyString) { + continue; + } + const serialized = typeof schemaObject[field] === "object" ? JSON.stringify(schemaObject[field], null, 2) : schemaObject[field]; + output.push(`@${field} ${String(serialized).replace(LB_RE, "\n * ")}`); + } + if ("const" in schemaObject) { + output.push("@constant"); + } + if (schemaObject.enum) { + let type = "unknown"; + if (Array.isArray(schemaObject.type)) { + type = schemaObject.type.join("|"); + } + else if (typeof schemaObject.type === "string") { + type = schemaObject.type; + } + output.push(`@enum {${type}${schemaObject.nullable ? "|null" : ""}}`); + } + if (output.length) { + let text = output.length === 1 + ? `* ${output.join("\n")} ` + : `* + * ${output.join("\n * ")}\n `; + text = text.replace(COMMENT_RE, "*\\/"); + ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, text, true); + } +} +export function oapiRef(path) { + const { pointer } = parseRef(path); + if (pointer.length === 0) { + throw new Error(`Error parsing $ref: ${path}. Is this a valid $ref?`); + } + let t = ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(String(pointer[0]))); + if (pointer.length > 1) { + for (let i = 1; i < pointer.length; i++) { + if (i > 2 && i < pointer.length - 1 && pointer[i] === "properties") { + continue; + } + t = ts.factory.createIndexedAccessTypeNode(t, ts.factory.createLiteralTypeNode(typeof pointer[i] === "number" + ? ts.factory.createNumericLiteral(pointer[i]) + : ts.factory.createStringLiteral(pointer[i]))); + } + } + return t; +} +export function astToString(ast, options) { + const sourceFile = ts.createSourceFile(options?.fileName ?? "openapi-ts.ts", options?.sourceText ?? "", ts.ScriptTarget.ESNext, false, ts.ScriptKind.TS); + sourceFile.statements = ts.factory.createNodeArray(Array.isArray(ast) ? ast : [ast]); + const printer = ts.createPrinter({ + newLine: ts.NewLineKind.LineFeed, + removeComments: false, + ...options?.formatOptions, + }); + return printer.printFile(sourceFile); +} +export function stringToAST(source) { + return ts.createSourceFile("stringInput", source, ts.ScriptTarget.ESNext, undefined, undefined).statements; +} +export function tsDedupe(types) { + const encounteredTypes = new Set(); + const filteredTypes = []; + for (const t of types) { + if (!("text" in (t.literal ?? t))) { + const { kind } = t.literal ?? t; + if (encounteredTypes.has(kind)) { + continue; + } + if (tsIsPrimitive(t)) { + encounteredTypes.add(kind); + } + } + filteredTypes.push(t); + } + return filteredTypes; +} +export const enumCache = new Map(); +export function tsEnum(name, members, metadata, options) { + let enumName = sanitizeMemberName(name); + enumName = `${enumName[0].toUpperCase()}${enumName.substring(1)}`; + let key = ""; + if (options?.shouldCache) { + key = `${members + .slice(0) + .sort() + .map((v, i) => { + return `${metadata?.[i]?.name ?? String(v)}:${metadata?.[i]?.description || ""}`; + }) + .join(",")}`; + if (enumCache.has(key)) { + return enumCache.get(key); + } + } + const enumDeclaration = ts.factory.createEnumDeclaration(options ? tsModifiers({ export: options.export ?? false }) : undefined, enumName, members.map((value, i) => tsEnumMember(value, metadata?.[i]))); + options?.shouldCache && enumCache.set(key, enumDeclaration); + return enumDeclaration; +} +export function tsArrayLiteralExpression(name, elementType, values, options) { + let variableName = sanitizeMemberName(name); + variableName = `${variableName[0].toLowerCase()}${variableName.substring(1)}`; + const arrayType = options?.readonly + ? tsReadonlyArray(elementType, options.injectFooter) + : ts.factory.createArrayTypeNode(elementType); + return ts.factory.createVariableStatement(options ? tsModifiers({ export: options.export ?? false }) : undefined, ts.factory.createVariableDeclarationList([ + ts.factory.createVariableDeclaration(variableName, undefined, arrayType, ts.factory.createArrayLiteralExpression(values.map((value) => { + if (typeof value === "number") { + if (value < 0) { + return ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, ts.factory.createNumericLiteral(Math.abs(value))); + } + else { + return ts.factory.createNumericLiteral(value); + } + } + else { + return ts.factory.createStringLiteral(value); + } + }))), + ], ts.NodeFlags.Const)); +} +function sanitizeMemberName(name) { + let sanitizedName = name.replace(JS_ENUM_INVALID_CHARS_RE, (c) => { + const last = c[c.length - 1]; + return JS_PROPERTY_INDEX_INVALID_CHARS_RE.test(last) ? "" : last.toUpperCase(); + }); + if (Number(name[0]) >= 0) { + sanitizedName = `Value${name}`; + } + return sanitizedName; +} +export function tsEnumMember(value, metadata = {}) { + let name = metadata.name ?? String(value); + if (!JS_PROPERTY_INDEX_RE.test(name)) { + if (Number(name[0]) >= 0) { + name = `Value${name}`.replace(".", "_"); + } + else if (name[0] === "-") { + name = `ValueMinus${name.slice(1)}`; + } + const invalidCharMatch = name.match(JS_PROPERTY_INDEX_INVALID_CHARS_RE); + if (invalidCharMatch) { + if (invalidCharMatch[0] === name) { + name = `"${name}"`; + } + else { + name = name.replace(JS_PROPERTY_INDEX_INVALID_CHARS_RE, (s) => { + return s in SPECIAL_CHARACTER_MAP ? SPECIAL_CHARACTER_MAP[s] : "_"; + }); + } + } + } + let member; + if (typeof value === "number") { + const literal = value < 0 + ? ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, ts.factory.createNumericLiteral(Math.abs(value))) + : ts.factory.createNumericLiteral(value); + member = ts.factory.createEnumMember(name, literal); + } + else { + member = ts.factory.createEnumMember(name, ts.factory.createStringLiteral(value)); + } + if (metadata.description === undefined) { + return member; + } + return ts.addSyntheticLeadingComment(member, ts.SyntaxKind.SingleLineCommentTrivia, " ".concat(metadata.description.trim()), true); +} +export function tsIntersection(types) { + if (types.length === 0) { + return NEVER; + } + if (types.length === 1) { + return types[0]; + } + return ts.factory.createIntersectionTypeNode(tsDedupe(types)); +} +export function tsIsPrimitive(type) { + if (!type) { + return true; + } + return (ts.SyntaxKind[type.kind] === "BooleanKeyword" || + ts.SyntaxKind[type.kind] === "NeverKeyword" || + ts.SyntaxKind[type.kind] === "NullKeyword" || + ts.SyntaxKind[type.kind] === "NumberKeyword" || + ts.SyntaxKind[type.kind] === "StringKeyword" || + ts.SyntaxKind[type.kind] === "UndefinedKeyword" || + ("literal" in type && tsIsPrimitive(type.literal))); +} +export function tsLiteral(value) { + if (typeof value === "string") { + return ts.factory.createIdentifier(JSON.stringify(value)); + } + if (typeof value === "number") { + const literal = value < 0 + ? ts.factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, ts.factory.createNumericLiteral(Math.abs(value))) + : ts.factory.createNumericLiteral(value); + return ts.factory.createLiteralTypeNode(literal); + } + if (typeof value === "boolean") { + return value === true ? TRUE : FALSE; + } + if (value === null) { + return NULL; + } + if (Array.isArray(value)) { + if (value.length === 0) { + return ts.factory.createArrayTypeNode(NEVER); + } + return ts.factory.createTupleTypeNode(value.map((v) => tsLiteral(v))); + } + if (typeof value === "object") { + const keys = []; + for (const [k, v] of Object.entries(value)) { + keys.push(ts.factory.createPropertySignature(undefined, tsPropertyIndex(k), undefined, tsLiteral(v))); + } + return keys.length ? ts.factory.createTypeLiteralNode(keys) : tsRecord(STRING, NEVER); + } + return UNKNOWN; +} +export function tsModifiers(modifiers) { + const typeMods = []; + if (modifiers.export) { + typeMods.push(ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)); + } + if (modifiers.readonly) { + typeMods.push(ts.factory.createModifier(ts.SyntaxKind.ReadonlyKeyword)); + } + return typeMods; +} +export function tsNullable(types) { + return ts.factory.createUnionTypeNode([...types, NULL]); +} +export function tsOmit(type, keys) { + return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("Omit"), [ + type, + ts.factory.createUnionTypeNode(keys.map((k) => tsLiteral(k))), + ]); +} +export function tsRecord(key, value) { + return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("Record"), [key, value]); +} +export function tsPropertyIndex(index) { + if ((typeof index === "number" && !(index < 0)) || + (typeof index === "string" && String(Number(index)) === index && index[0] !== "-")) { + return ts.factory.createNumericLiteral(index); + } + return typeof index === "string" && JS_PROPERTY_INDEX_RE.test(index) + ? ts.factory.createIdentifier(index) + : ts.factory.createStringLiteral(String(index)); +} +export function tsUnion(types) { + if (types.length === 0) { + return NEVER; + } + if (types.length === 1) { + return types[0]; + } + return ts.factory.createUnionTypeNode(tsDedupe(types)); +} +export function tsWithRequired(type, keys, injectFooter) { + if (keys.length === 0) { + return type; + } + if (!injectFooter.some((node) => ts.isTypeAliasDeclaration(node) && node?.name?.escapedText === "WithRequired")) { + const helper = stringToAST("type WithRequired = T & { [P in K]-?: T[P] };")[0]; + injectFooter.push(helper); + } + return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("WithRequired"), [ + type, + tsUnion(keys.map((k) => tsLiteral(k))), + ]); +} +export function tsReadonlyArray(type, injectFooter) { + if (injectFooter && + !injectFooter.some((node) => ts.isTypeAliasDeclaration(node) && node?.name?.escapedText === "ReadonlyArray")) { + const helper = stringToAST("type ReadonlyArray = [Exclude] extends [any[]] ? Readonly> : Readonly[]>;")[0]; + injectFooter.push(helper); + } + return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("ReadonlyArray"), [type]); +} +//# sourceMappingURL=ts.js.map \ No newline at end of file diff --git a/package/dist/lib/ts.js.map b/package/dist/lib/ts.js.map new file mode 100644 index 0000000000000000000000000000000000000000..c61104cffa627a398cf6a54a381e5c521d6b8772 --- /dev/null +++ b/package/dist/lib/ts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ts.js","sourceRoot":"","sources":["../../src/lib/ts.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/lib/utils.d.ts b/package/dist/lib/utils.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef06148a9586058d0779e17e74013a850bb3eb85 --- /dev/null +++ b/package/dist/lib/utils.d.ts @@ -0,0 +1,26 @@ +import c from "ansi-colors"; +import ts from "typescript"; +import type { DiscriminatorObject, OpenAPI3, OpenAPITSOptions } from "../types.js"; +export { c }; +export declare function createDiscriminatorProperty(discriminator: DiscriminatorObject, { path, readonly }: { + path: string; + readonly?: boolean; +}): ts.TypeElement; +export declare function createRef(parts: (number | string | undefined | null)[]): string; +export declare function debug(msg: string, group?: string, time?: number): void; +export declare function error(msg: string): void; +export declare function formatTime(t: number): string; +export declare function getEntries(obj: ArrayLike | Record, options?: { + alphabetize?: boolean; + excludeDeprecated?: boolean; +}): [string, T][]; +export declare function resolveRef(schema: any, $ref: string, { silent, visited }: { + silent: boolean; + visited?: string[]; +}): T | undefined; +export declare function scanDiscriminators(schema: OpenAPI3, options: OpenAPITSOptions): { + objects: Record; + refsHandled: string[]; +}; +export declare function walk(obj: unknown, cb: (value: Record, path: (string | number)[]) => void, path?: (string | number)[]): void; +export declare function warn(msg: string, silent?: boolean): void; diff --git a/package/dist/lib/utils.js b/package/dist/lib/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..bede54e75eee62b7ecadc33fd9f502ab101a8498 --- /dev/null +++ b/package/dist/lib/utils.js @@ -0,0 +1,260 @@ +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 { tsLiteral, tsModifiers, tsPropertyIndex } from "./ts.js"; +if (!supportsColor.stdout || supportsColor.stdout.hasBasic === false) { + c.enabled = false; +} +const DEBUG_GROUPS = { + redoc: c.cyanBright, + lint: c.yellowBright, + bundle: c.magentaBright, + ts: c.blueBright, +}; +export { c }; +export function createDiscriminatorProperty(discriminator, { path, readonly = false }) { + let value = parseRef(path).pointer.pop(); + if (discriminator.mapping) { + const matchedValue = Object.entries(discriminator.mapping).find(([, v]) => (!v.startsWith("#") && v === value) || (v.startsWith("#") && parseRef(v).pointer.pop() === value)); + if (matchedValue) { + value = matchedValue[0]; + } + } + return ts.factory.createPropertySignature(tsModifiers({ + readonly, + }), tsPropertyIndex(discriminator.propertyName), undefined, tsLiteral(value)); +} +export function createRef(parts) { + let pointer = "#"; + for (const part of parts) { + if (part === undefined || part === null || part === "") { + continue; + } + const maybeRef = parseRef(String(part)).pointer; + if (maybeRef.length) { + for (const refPart of maybeRef) { + pointer += `/${escapePointer(refPart)}`; + } + } + else { + pointer += `/${escapePointer(part)}`; + } + } + return pointer; +} +export function debug(msg, group, time) { + if (process.env.DEBUG && + (!group || + process.env.DEBUG === "*" || + process.env.DEBUG === "openapi-ts:*" || + process.env.DEBUG.toLocaleLowerCase() === `openapi-ts:${group.toLocaleLowerCase()}`)) { + const groupColor = (group && DEBUG_GROUPS[group]) || c.whiteBright; + const groupName = groupColor(`openapi-ts:${group ?? "info"}`); + let timeFormatted = ""; + if (typeof time === "number") { + timeFormatted = c.green(` ${formatTime(time)} `); + } + console.debug(` ${c.bold(groupName)}${timeFormatted}${msg}`); + } +} +export function error(msg) { + console.error(c.red(` ✘ ${msg}`)); +} +export function formatTime(t) { + if (typeof t === "number") { + if (t < 1000) { + return `${Math.round(10 * t) / 10}ms`; + } + if (t < 60000) { + return `${Math.round(t / 100) / 10}s`; + } + return `${Math.round(t / 6000) / 10}m`; + } + return t; +} +export function getEntries(obj, options) { + let entries = Object.entries(obj); + if (options?.alphabetize) { + entries.sort(([a], [b]) => a.localeCompare(b, "en-us", { numeric: true })); + } + if (options?.excludeDeprecated) { + entries = entries.filter(([, v]) => !(v && typeof v === "object" && "deprecated" in v && v.deprecated)); + } + return entries; +} +export function resolveRef(schema, $ref, { silent = false, visited = [] }) { + const { pointer } = parseRef($ref); + if (!pointer.length) { + return undefined; + } + let node = schema; + for (const key of pointer) { + if (node && typeof node === "object" && node[key]) { + node = node[key]; + } + else { + warn(`Could not resolve $ref "${$ref}"`, silent); + return undefined; + } + } + if (node && typeof node === "object" && node.$ref) { + if (visited.includes(node.$ref)) { + warn(`Could not resolve circular $ref "${$ref}"`, silent); + return undefined; + } + return resolveRef(schema, node.$ref, { + silent, + visited: [...visited, node.$ref], + }); + } + return node; +} +function createDiscriminatorEnum(values, prevSchema) { + return { + type: "string", + enum: values, + description: prevSchema?.description + ? `${prevSchema.description} (enum property replaced by openapi-typescript)` + : "discriminator enum property added by openapi-typescript", + }; +} +function patchDiscriminatorEnum(schema, ref, values, discriminator, discriminatorRef, options) { + const resolvedSchema = resolveRef(schema, ref, { + silent: options.silent ?? false, + }); + if (resolvedSchema?.allOf) { + resolvedSchema.allOf.push({ + type: "object", + required: [discriminator.propertyName], + properties: { + [discriminator.propertyName]: createDiscriminatorEnum(values), + }, + }); + return true; + } + else if (typeof resolvedSchema === "object" && "type" in resolvedSchema && resolvedSchema.type === "object") { + if (!resolvedSchema.properties) { + resolvedSchema.properties = {}; + } + if (!resolvedSchema.required) { + resolvedSchema.required = [discriminator.propertyName]; + } + else if (!resolvedSchema.required.includes(discriminator.propertyName)) { + resolvedSchema.required.push(discriminator.propertyName); + } + resolvedSchema.properties[discriminator.propertyName] = createDiscriminatorEnum(values, resolvedSchema.properties[discriminator.propertyName]); + return true; + } + warn(`Discriminator mapping has an invalid schema (neither an object schema nor an allOf array): ${ref} => ${values.join(", ")} (Discriminator: ${discriminatorRef})`, options.silent); + return false; +} +export function scanDiscriminators(schema, options) { + const objects = {}; + const refsHandled = []; + walk(schema, (obj, path) => { + const discriminator = obj?.discriminator; + if (!discriminator?.propertyName) { + return; + } + const ref = createRef(path); + objects[ref] = discriminator; + if (!obj?.oneOf || !Array.isArray(obj.oneOf)) { + return; + } + const oneOf = obj.oneOf; + const mapping = {}; + for (const item of oneOf) { + if ("$ref" in item) { + const value = item.$ref.split("/").pop(); + if (value) { + if (!mapping[item.$ref]) { + mapping[item.$ref] = { inferred: value }; + } + else { + mapping[item.$ref].inferred = value; + } + } + } + } + if (discriminator.mapping) { + for (const mappedValue in discriminator.mapping) { + const mappedRef = discriminator.mapping[mappedValue]; + if (!mappedRef) { + continue; + } + if (!mapping[mappedRef]?.defined) { + mapping[mappedRef] = { defined: [] }; + } + mapping[mappedRef].defined?.push(mappedValue); + } + } + for (const [mappedRef, { inferred, defined }] of Object.entries(mapping)) { + if (refsHandled.includes(mappedRef)) { + continue; + } + if (!inferred && !defined) { + continue; + } + const mappedValues = defined ?? [inferred]; + if (patchDiscriminatorEnum(schema, mappedRef, mappedValues, discriminator, ref, options)) { + refsHandled.push(mappedRef); + } + } + }); + walk(schema, (obj, path) => { + if (!obj || !Array.isArray(obj.allOf)) { + return; + } + for (const item of obj.allOf) { + if ("$ref" in item) { + if (!objects[item.$ref]) { + return; + } + const ref = createRef(path); + const discriminator = objects[item.$ref]; + const mappedValues = []; + if (discriminator.mapping) { + for (const mappedValue in discriminator.mapping) { + if (discriminator.mapping[mappedValue] === ref) { + mappedValues.push(mappedValue); + } + } + if (mappedValues.length > 0) { + if (patchDiscriminatorEnum(schema, ref, mappedValues, discriminator, item.$ref, options)) { + refsHandled.push(ref); + } + } + } + objects[ref] = { + ...objects[item.$ref], + }; + } + else if (item.discriminator?.propertyName) { + objects[createRef(path)] = { ...item.discriminator }; + } + } + }); + return { objects, refsHandled }; +} +export function walk(obj, cb, path = []) { + if (!obj || typeof obj !== "object") { + return; + } + if (Array.isArray(obj)) { + for (let i = 0; i < obj.length; i++) { + walk(obj[i], cb, path.concat(i)); + } + return; + } + cb(obj, path); + for (const k of Object.keys(obj)) { + walk(obj[k], cb, path.concat(k)); + } +} +export function warn(msg, silent = false) { + if (!silent) { + console.warn(c.yellow(` ⚠ ${msg}`)); + } +} +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/package/dist/lib/utils.js.map b/package/dist/lib/utils.js.map new file mode 100644 index 0000000000000000000000000000000000000000..96db2780c2c0d15386fb7d94e6a268cf9340d96b --- /dev/null +++ b/package/dist/lib/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/components-object.d.ts b/package/dist/transform/components-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..7eeae8a73e573f1d51ce8cd199e26d82b9dd79bf --- /dev/null +++ b/package/dist/transform/components-object.d.ts @@ -0,0 +1,4 @@ +import ts from "typescript"; +import type { ComponentsObject, GlobalContext } from "../types.js"; +export default function transformComponentsObject(componentsObject: ComponentsObject, ctx: GlobalContext): ts.Node[]; +export declare function singularizeComponentKey(key: `x-${string}` | "schemas" | "responses" | "parameters" | "requestBodies" | "headers" | "pathItems"): string; diff --git a/package/dist/transform/components-object.js b/package/dist/transform/components-object.js new file mode 100644 index 0000000000000000000000000000000000000000..04e66ecb5918e3dba848e73061cdb4f601611bed --- /dev/null +++ b/package/dist/transform/components-object.js @@ -0,0 +1,87 @@ +import ts from "typescript"; +import * as changeCase from "change-case"; +import { performance } from "node:perf_hooks"; +import { NEVER, QUESTION_TOKEN, addJSDocComment, tsModifiers, tsPropertyIndex } from "../lib/ts.js"; +import { createRef, debug, getEntries } from "../lib/utils.js"; +import transformHeaderObject from "./header-object.js"; +import transformParameterObject from "./parameter-object.js"; +import transformPathItemObject from "./path-item-object.js"; +import transformRequestBodyObject from "./request-body-object.js"; +import transformResponseObject from "./response-object.js"; +import transformSchemaObject from "./schema-object.js"; +const transformers = { + schemas: transformSchemaObject, + responses: transformResponseObject, + parameters: transformParameterObject, + requestBodies: transformRequestBodyObject, + headers: transformHeaderObject, + pathItems: transformPathItemObject, +}; +export default function transformComponentsObject(componentsObject, ctx) { + const type = []; + const rootTypeAliases = {}; + for (const key of Object.keys(transformers)) { + const componentT = performance.now(); + const items = []; + if (componentsObject[key]) { + for (const [name, item] of getEntries(componentsObject[key], ctx)) { + let subType = transformers[key](item, { + path: createRef(["components", key, name]), + schema: item, + ctx, + }); + let hasQuestionToken = false; + if (ctx.transform) { + const result = ctx.transform(item, { + path: createRef(["components", key, name]), + schema: item, + ctx, + }); + if (result) { + if ("schema" in result) { + subType = result.schema; + hasQuestionToken = result.questionToken; + } + else { + subType = result; + } + } + } + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: ctx.immutable }), tsPropertyIndex(name), hasQuestionToken ? QUESTION_TOKEN : undefined, subType); + addJSDocComment(item, property); + items.push(property); + if (ctx.rootTypes) { + const componentKey = changeCase.pascalCase(singularizeComponentKey(key)); + let aliasName = `${componentKey}${changeCase.pascalCase(name)}`; + let conflictCounter = 1; + while (rootTypeAliases[aliasName] !== undefined) { + conflictCounter++; + aliasName = `${componentKey}${changeCase.pascalCase(name)}_${conflictCounter}`; + } + const ref = ts.factory.createTypeReferenceNode(`components['${key}']['${name}']`); + if (ctx.rootTypesNoSchemaPrefix && key === "schemas") { + aliasName = aliasName.replace(componentKey, ""); + } + const typeAlias = ts.factory.createTypeAliasDeclaration(tsModifiers({ export: true }), aliasName, undefined, ref); + rootTypeAliases[aliasName] = typeAlias; + } + } + } + type.push(ts.factory.createPropertySignature(undefined, tsPropertyIndex(key), undefined, items.length ? ts.factory.createTypeLiteralNode(items) : NEVER)); + debug(`Transformed components → ${key}`, "ts", performance.now() - componentT); + } + let rootTypes = []; + if (ctx.rootTypes) { + rootTypes = Object.keys(rootTypeAliases).map((k) => rootTypeAliases[k]); + } + return [ts.factory.createTypeLiteralNode(type), ...rootTypes]; +} +export function singularizeComponentKey(key) { + switch (key) { + case "requestBodies": + return "requestBody"; + default: + return key.slice(0, -1); + } +} +//# sourceMappingURL=components-object.js.map \ No newline at end of file diff --git a/package/dist/transform/components-object.js.map b/package/dist/transform/components-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..abcb4f3dc37b3df73a738e988e6104a07f0d74c6 --- /dev/null +++ b/package/dist/transform/components-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"components-object.js","sourceRoot":"","sources":["../../src/transform/components-object.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/header-object.d.ts b/package/dist/transform/header-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a7b606cffec8e127812d30cde2640e6dc8a469f --- /dev/null +++ b/package/dist/transform/header-object.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { HeaderObject, TransformNodeOptions } from "../types.js"; +export default function transformHeaderObject(headerObject: HeaderObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/header-object.js b/package/dist/transform/header-object.js new file mode 100644 index 0000000000000000000000000000000000000000..c74c1eb5922fceb4f93936510aa8c7c681e252b1 --- /dev/null +++ b/package/dist/transform/header-object.js @@ -0,0 +1,32 @@ +import { escapePointer } from "@redocly/openapi-core/lib/ref-utils.js"; +import ts from "typescript"; +import { addJSDocComment, tsModifiers, tsPropertyIndex, UNKNOWN } from "../lib/ts.js"; +import { getEntries } from "../lib/utils.js"; +import transformMediaTypeObject from "./media-type-object.js"; +import transformSchemaObject from "./schema-object.js"; +export default function transformHeaderObject(headerObject, options) { + if (headerObject.schema) { + return transformSchemaObject(headerObject.schema, options); + } + if (headerObject.content) { + const type = []; + for (const [contentType, mediaTypeObject] of getEntries(headerObject.content ?? {}, options.ctx)) { + const nextPath = `${options.path ?? "#"}/${escapePointer(contentType)}`; + const mediaType = "$ref" in mediaTypeObject + ? transformSchemaObject(mediaTypeObject, { + ...options, + path: nextPath, + }) + : transformMediaTypeObject(mediaTypeObject, { + ...options, + path: nextPath, + }); + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(contentType), undefined, mediaType); + addJSDocComment(mediaTypeObject, property); + type.push(property); + } + return ts.factory.createTypeLiteralNode(type); + } + return UNKNOWN; +} +//# sourceMappingURL=header-object.js.map \ No newline at end of file diff --git a/package/dist/transform/header-object.js.map b/package/dist/transform/header-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..eda3d1b9001db80a6c45ef27ebb629b825b0b88c --- /dev/null +++ b/package/dist/transform/header-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"header-object.js","sourceRoot":"","sources":["../../src/transform/header-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AAMvD,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,YAA0B,EAAE,OAA6B;IACrG,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAqB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjG,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YACxE,MAAM,SAAS,GACb,MAAM,IAAI,eAAe;gBACvB,CAAC,CAAC,qBAAqB,CAAC,eAAe,EAAE;oBACrC,GAAG,OAAO;oBACV,IAAI,EAAE,QAAQ;iBACf,CAAC;gBACJ,CAAC,CAAC,wBAAwB,CAAC,eAAe,EAAE;oBACxC,GAAG,OAAO;oBACV,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;YACT,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAC7B,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAChD,eAAe,CAAC,WAAW,CAAC,EAC5B,SAAS,EACT,SAAS,CAC9B,CAAC;YACF,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"} \ No newline at end of file diff --git a/package/dist/transform/index.d.ts b/package/dist/transform/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..818da4cad15a26059d44d6b36680623ebe90abd0 --- /dev/null +++ b/package/dist/transform/index.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { GlobalContext, OpenAPI3 } from "../types.js"; +export default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): ts.Node[]; diff --git a/package/dist/transform/index.js b/package/dist/transform/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2fb6e8d80aee60b2b921f0e7d08d66a8cb27679f --- /dev/null +++ b/package/dist/transform/index.js @@ -0,0 +1,69 @@ +import ts from "typescript"; +import { performance } from "node:perf_hooks"; +import { NEVER, STRING, stringToAST, tsModifiers, tsRecord } from "../lib/ts.js"; +import { createRef, debug } from "../lib/utils.js"; +import transformComponentsObject from "./components-object.js"; +import transformPathsObject from "./paths-object.js"; +import transformSchemaObject from "./schema-object.js"; +import transformWebhooksObject from "./webhooks-object.js"; +import makeApiPathsEnum from "./paths-enum.js"; +const transformers = { + paths: transformPathsObject, + webhooks: transformWebhooksObject, + components: transformComponentsObject, + $defs: (node, options) => transformSchemaObject(node, { path: createRef(["$defs"]), ctx: options, schema: node }), +}; +export default function transformSchema(schema, ctx) { + const type = []; + if (ctx.inject) { + const injectNodes = stringToAST(ctx.inject); + type.push(...injectNodes); + } + for (const root of Object.keys(transformers)) { + const emptyObj = ts.factory.createTypeAliasDeclaration(tsModifiers({ export: true }), root, undefined, tsRecord(STRING, NEVER)); + if (schema[root] && typeof schema[root] === "object") { + const rootT = performance.now(); + const subTypes = [].concat(transformers[root](schema[root], ctx)); + for (const subType of subTypes) { + if (ts.isTypeNode(subType)) { + if (subType.members?.length) { + type.push(ctx.exportType + ? ts.factory.createTypeAliasDeclaration(tsModifiers({ export: true }), root, undefined, subType) + : ts.factory.createInterfaceDeclaration(tsModifiers({ export: true }), root, undefined, undefined, subType.members)); + debug(`${root} done`, "ts", performance.now() - rootT); + } + else { + type.push(emptyObj); + debug(`${root} done (skipped)`, "ts", 0); + } + } + else if (ts.isTypeAliasDeclaration(subType)) { + type.push(subType); + } + else { + type.push(emptyObj); + debug(`${root} done (skipped)`, "ts", 0); + } + } + } + else { + type.push(emptyObj); + debug(`${root} done (skipped)`, "ts", 0); + } + } + let hasOperations = false; + for (const injectedType of ctx.injectFooter) { + if (!hasOperations && injectedType?.name?.escapedText === "operations") { + hasOperations = true; + } + type.push(injectedType); + } + if (!hasOperations) { + type.push(ts.factory.createTypeAliasDeclaration(tsModifiers({ export: true }), "operations", undefined, tsRecord(STRING, NEVER))); + } + if (ctx.makePathsEnum && schema.paths) { + type.push(makeApiPathsEnum(schema.paths)); + } + return type; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/package/dist/transform/index.js.map b/package/dist/transform/index.js.map new file mode 100644 index 0000000000000000000000000000000000000000..997cbe79a2f99383f848bf1b41b291ddd1669d12 --- /dev/null +++ b/package/dist/transform/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/media-type-object.d.ts b/package/dist/transform/media-type-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d1cd36633da88911320975d8bf3e2655bdd4c7e --- /dev/null +++ b/package/dist/transform/media-type-object.d.ts @@ -0,0 +1,3 @@ +import type ts from "typescript"; +import type { MediaTypeObject, TransformNodeOptions } from "../types.js"; +export default function transformMediaTypeObject(mediaTypeObject: MediaTypeObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/media-type-object.js b/package/dist/transform/media-type-object.js new file mode 100644 index 0000000000000000000000000000000000000000..8e983d83f07206fdaaf69e8aa38e1f5181b15fb8 --- /dev/null +++ b/package/dist/transform/media-type-object.js @@ -0,0 +1,9 @@ +import { UNKNOWN } from "../lib/ts.js"; +import transformSchemaObject from "./schema-object.js"; +export default function transformMediaTypeObject(mediaTypeObject, options) { + if (!mediaTypeObject.schema) { + return UNKNOWN; + } + return transformSchemaObject(mediaTypeObject.schema, options); +} +//# sourceMappingURL=media-type-object.js.map \ No newline at end of file diff --git a/package/dist/transform/media-type-object.js.map b/package/dist/transform/media-type-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..f4f95f7c44f8e94b4f99afcc2908caf6ba66d407 --- /dev/null +++ b/package/dist/transform/media-type-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"media-type-object.js","sourceRoot":"","sources":["../../src/transform/media-type-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AAMvD,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAC9C,eAAgC,EAChC,OAA6B;IAE7B,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,qBAAqB,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"} \ No newline at end of file diff --git a/package/dist/transform/operation-object.d.ts b/package/dist/transform/operation-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..49953102780c120f77165776ddfaacc71716b386 --- /dev/null +++ b/package/dist/transform/operation-object.d.ts @@ -0,0 +1,4 @@ +import ts from "typescript"; +import type { OperationObject, TransformNodeOptions } from "../types.js"; +export default function transformOperationObject(operationObject: OperationObject, options: TransformNodeOptions): ts.TypeElement[]; +export declare function injectOperationObject(operationId: string, operationObject: OperationObject, options: TransformNodeOptions): void; diff --git a/package/dist/transform/operation-object.js b/package/dist/transform/operation-object.js new file mode 100644 index 0000000000000000000000000000000000000000..d4203a0792594fbea2ae9a6edd30989e9d696819 --- /dev/null +++ b/package/dist/transform/operation-object.js @@ -0,0 +1,44 @@ +import ts from "typescript"; +import { NEVER, QUESTION_TOKEN, addJSDocComment, oapiRef, tsModifiers, tsPropertyIndex } from "../lib/ts.js"; +import { createRef } from "../lib/utils.js"; +import { transformParametersArray } from "./parameters-array.js"; +import transformRequestBodyObject from "./request-body-object.js"; +import transformResponsesObject from "./responses-object.js"; +export default function transformOperationObject(operationObject, options) { + const type = []; + type.push(...transformParametersArray(operationObject.parameters ?? [], options)); + if (operationObject.requestBody) { + const requestBodyType = "$ref" in operationObject.requestBody + ? oapiRef(operationObject.requestBody.$ref) + : transformRequestBodyObject(operationObject.requestBody, { + ...options, + path: createRef([options.path, "requestBody"]), + }); + const required = !!("$ref" in operationObject.requestBody + ? options.ctx.resolve(operationObject.requestBody.$ref) + : operationObject.requestBody)?.required; + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex("requestBody"), required ? undefined : QUESTION_TOKEN, requestBodyType); + addJSDocComment(operationObject.requestBody, property); + type.push(property); + } + else { + type.push(ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex("requestBody"), QUESTION_TOKEN, NEVER)); + } + type.push(ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex("responses"), undefined, transformResponsesObject(operationObject.responses ?? {}, options))); + return type; +} +export function injectOperationObject(operationId, operationObject, options) { + let operations = options.ctx.injectFooter.find((node) => ts.isInterfaceDeclaration(node) && node.name.text === "operations"); + if (!operations) { + operations = ts.factory.createInterfaceDeclaration(tsModifiers({ + export: true, + }), ts.factory.createIdentifier("operations"), undefined, undefined, []); + options.ctx.injectFooter.push(operations); + } + const type = transformOperationObject(operationObject, options); + operations.members = ts.factory.createNodeArray([ + ...operations.members, + ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(operationId), undefined, ts.factory.createTypeLiteralNode(type)), + ]); +} +//# sourceMappingURL=operation-object.js.map \ No newline at end of file diff --git a/package/dist/transform/operation-object.js.map b/package/dist/transform/operation-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..e347d2d374dc4a308bd1d74a3f3b9b5c242bb9bf --- /dev/null +++ b/package/dist/transform/operation-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"operation-object.js","sourceRoot":"","sources":["../../src/transform/operation-object.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/parameter-object.d.ts b/package/dist/transform/parameter-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf6ee2436c3886b5decf5d321689eedb393877c2 --- /dev/null +++ b/package/dist/transform/parameter-object.d.ts @@ -0,0 +1,3 @@ +import type ts from "typescript"; +import type { ParameterObject, TransformNodeOptions } from "../types.js"; +export default function transformParameterObject(parameterObject: ParameterObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/parameter-object.js b/package/dist/transform/parameter-object.js new file mode 100644 index 0000000000000000000000000000000000000000..112fb125abd03c0d7d2b5cda42bf0db5a49f8389 --- /dev/null +++ b/package/dist/transform/parameter-object.js @@ -0,0 +1,6 @@ +import { STRING } from "../lib/ts.js"; +import transformSchemaObject from "./schema-object.js"; +export default function transformParameterObject(parameterObject, options) { + return parameterObject.schema ? transformSchemaObject(parameterObject.schema, options) : STRING; +} +//# sourceMappingURL=parameter-object.js.map \ No newline at end of file diff --git a/package/dist/transform/parameter-object.js.map b/package/dist/transform/parameter-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..21b286390ff2a6f81b4306e79278b8d874ab64ca --- /dev/null +++ b/package/dist/transform/parameter-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parameter-object.js","sourceRoot":"","sources":["../../src/transform/parameter-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AAMvD,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAC9C,eAAgC,EAChC,OAA6B;IAE7B,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAClG,CAAC"} \ No newline at end of file diff --git a/package/dist/transform/parameters-array.d.ts b/package/dist/transform/parameters-array.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a6d3d1d26639986155678becb40899e753312ba7 --- /dev/null +++ b/package/dist/transform/parameters-array.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { ParameterObject, ReferenceObject, TransformNodeOptions } from "../types.js"; +export declare function transformParametersArray(parametersArray: (ParameterObject | ReferenceObject)[], options: TransformNodeOptions): ts.TypeElement[]; diff --git a/package/dist/transform/parameters-array.js b/package/dist/transform/parameters-array.js new file mode 100644 index 0000000000000000000000000000000000000000..ed51d2f32c7fb3ae1bf48edb534beeac22526574 --- /dev/null +++ b/package/dist/transform/parameters-array.js @@ -0,0 +1,80 @@ +import ts from "typescript"; +import { NEVER, QUESTION_TOKEN, addJSDocComment, oapiRef, tsModifiers, tsPropertyIndex } from "../lib/ts.js"; +import { createRef } from "../lib/utils.js"; +import transformParameterObject from "./parameter-object.js"; +const PATH_PARAM_RE = /\{([^}]+)\}/g; +function createPathParameter(paramName) { + return { + name: paramName, + in: "path", + required: true, + schema: { type: "string" }, + }; +} +function extractPathParamsFromUrl(path) { + const params = []; + const matches = path.match(PATH_PARAM_RE); + if (matches) { + for (const match of matches) { + const paramName = match.slice(1, -1); + params.push(createPathParameter(paramName)); + } + } + return params; +} +export function transformParametersArray(parametersArray, options) { + const type = []; + const workingParameters = [...parametersArray]; + if (options.ctx.generatePathParams && options.path) { + const pathString = Array.isArray(options.path) ? options.path[0] : options.path; + if (typeof pathString === "string") { + const pathParams = extractPathParamsFromUrl(pathString); + for (const param of pathParams) { + const exists = workingParameters.some((p) => { + const resolved = "$ref" in p ? options.ctx.resolve(p.$ref) : p; + return resolved?.in === "path" && resolved?.name === param.name; + }); + if (!exists) { + workingParameters.push(param); + } + } + } + } + const paramType = []; + for (const paramIn of ["query", "header", "path", "cookie"]) { + const paramLocType = []; + let operationParameters = workingParameters.map((param) => ({ + original: param, + resolved: "$ref" in param ? options.ctx.resolve(param.$ref) : param, + })); + if (options.ctx.alphabetize) { + operationParameters.sort((a, b) => (a.resolved?.name ?? "").localeCompare(b.resolved?.name ?? "")); + } + if (options.ctx.excludeDeprecated) { + operationParameters = operationParameters.filter(({ resolved }) => !resolved?.deprecated && !resolved?.schema?.deprecated); + } + for (const { original, resolved } of operationParameters) { + if (resolved?.in !== paramIn) { + continue; + } + let optional = undefined; + if (paramIn !== "path" && !resolved.required) { + optional = QUESTION_TOKEN; + } + const subType = "$ref" in original + ? oapiRef(original.$ref) + : transformParameterObject(resolved, { + ...options, + path: createRef([options.path, "parameters", resolved.in, resolved.name]), + }); + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(resolved?.name), optional, subType); + addJSDocComment(resolved, property); + paramLocType.push(property); + } + const allOptional = paramLocType.every((node) => !!node.questionToken); + paramType.push(ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(paramIn), allOptional || !paramLocType.length ? QUESTION_TOKEN : undefined, paramLocType.length ? ts.factory.createTypeLiteralNode(paramLocType) : NEVER)); + } + type.push(ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex("parameters"), !paramType.length ? QUESTION_TOKEN : undefined, paramType.length ? ts.factory.createTypeLiteralNode(paramType) : NEVER)); + return type; +} +//# sourceMappingURL=parameters-array.js.map \ No newline at end of file diff --git a/package/dist/transform/parameters-array.js.map b/package/dist/transform/parameters-array.js.map new file mode 100644 index 0000000000000000000000000000000000000000..2defd352db5e597a9354aab71896037d1df89627 --- /dev/null +++ b/package/dist/transform/parameters-array.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parameters-array.js","sourceRoot":"","sources":["../../src/transform/parameters-array.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/path-item-object.d.ts b/package/dist/transform/path-item-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e330caebe2df3f6120883d9ce78d14eb16ccfb06 --- /dev/null +++ b/package/dist/transform/path-item-object.d.ts @@ -0,0 +1,4 @@ +import ts from "typescript"; +import type { PathItemObject, TransformNodeOptions } from "../types.js"; +export type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace"; +export default function transformPathItemObject(pathItem: PathItemObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/path-item-object.js b/package/dist/transform/path-item-object.js new file mode 100644 index 0000000000000000000000000000000000000000..b51258b816192f3c357de5dcf5e4aeb401516f98 --- /dev/null +++ b/package/dist/transform/path-item-object.js @@ -0,0 +1,51 @@ +import ts from "typescript"; +import { NEVER, QUESTION_TOKEN, addJSDocComment, oapiRef, tsModifiers, tsPropertyIndex } from "../lib/ts.js"; +import { createRef } from "../lib/utils.js"; +import transformOperationObject, { injectOperationObject } from "./operation-object.js"; +import { transformParametersArray } from "./parameters-array.js"; +export default function transformPathItemObject(pathItem, options) { + const type = []; + type.push(...transformParametersArray(pathItem.parameters ?? [], { + ...options, + path: createRef([options.path, "parameters"]), + })); + for (const method of ["get", "put", "post", "delete", "options", "head", "patch", "trace"]) { + const operationObject = pathItem[method]; + if (!operationObject || + (options.ctx.excludeDeprecated && + ("$ref" in operationObject ? options.ctx.resolve(operationObject.$ref) : operationObject) + ?.deprecated)) { + type.push(ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(method), QUESTION_TOKEN, NEVER)); + continue; + } + const keyedParameters = {}; + if (!("$ref" in operationObject)) { + for (const parameter of [...(pathItem.parameters ?? []), ...(operationObject.parameters ?? [])]) { + const name = "$ref" in parameter + ? `${options.ctx.resolve(parameter.$ref)?.in}-${options.ctx.resolve(parameter.$ref)?.name}` + : `${parameter.in}-${parameter.name}`; + if (name) { + keyedParameters[name] = parameter; + } + } + } + let operationType; + if ("$ref" in operationObject) { + operationType = oapiRef(operationObject.$ref); + } + else if (operationObject.operationId) { + const operationId = operationObject.operationId.replace(HASH_RE, "/"); + operationType = oapiRef(createRef(["operations", operationId])); + injectOperationObject(operationId, { ...operationObject, parameters: Object.values(keyedParameters) }, { ...options, path: createRef([options.path, method]) }); + } + else { + operationType = ts.factory.createTypeLiteralNode(transformOperationObject({ ...operationObject, parameters: Object.values(keyedParameters) }, { ...options, path: createRef([options.path, method]) })); + } + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(method), undefined, operationType); + addJSDocComment(operationObject, property); + type.push(property); + } + return ts.factory.createTypeLiteralNode(type); +} +const HASH_RE = /#/g; +//# sourceMappingURL=path-item-object.js.map \ No newline at end of file diff --git a/package/dist/transform/path-item-object.js.map b/package/dist/transform/path-item-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..157372e89af06f4867b30e0b4be12849b155aebc --- /dev/null +++ b/package/dist/transform/path-item-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path-item-object.js","sourceRoot":"","sources":["../../src/transform/path-item-object.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/paths-enum.d.ts b/package/dist/transform/paths-enum.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..700e7bb6076fc7a0b94980adc003fd2e25109611 --- /dev/null +++ b/package/dist/transform/paths-enum.d.ts @@ -0,0 +1,3 @@ +import type ts from "typescript"; +import type { PathsObject } from "../types.js"; +export default function makeApiPathsEnum(pathsObject: PathsObject): ts.EnumDeclaration; diff --git a/package/dist/transform/paths-enum.js b/package/dist/transform/paths-enum.js new file mode 100644 index 0000000000000000000000000000000000000000..d4a3362d33bd35430a062245bff721703b65f81f --- /dev/null +++ b/package/dist/transform/paths-enum.js @@ -0,0 +1,35 @@ +import { tsEnum } from "../lib/ts.js"; +import { getEntries } from "../lib/utils.js"; +export default function makeApiPathsEnum(pathsObject) { + const enumKeys = []; + const enumMetaData = []; + for (const [url, pathItemObject] of getEntries(pathsObject)) { + for (const [method, operation] of Object.entries(pathItemObject)) { + if (!["get", "put", "post", "delete", "options", "head", "patch", "trace"].includes(method)) { + continue; + } + let pathName; + if (operation.operationId) { + pathName = operation.operationId; + } + else { + pathName = (method + url) + .split("/") + .map((part) => { + const capitalised = part.charAt(0).toUpperCase() + part.slice(1); + return capitalised.replace(/{.*}|:.*|[^a-zA-Z\d_]+/, ""); + }) + .join(""); + } + const adaptedUrl = url.replace(/{(\w+)}/g, ":$1"); + enumKeys.push(adaptedUrl); + enumMetaData.push({ + name: pathName, + }); + } + } + return tsEnum("ApiPaths", enumKeys, enumMetaData, { + export: true, + }); +} +//# sourceMappingURL=paths-enum.js.map \ No newline at end of file diff --git a/package/dist/transform/paths-enum.js.map b/package/dist/transform/paths-enum.js.map new file mode 100644 index 0000000000000000000000000000000000000000..507e308ddc3d0e11ba544a125e938a34596ea48e --- /dev/null +++ b/package/dist/transform/paths-enum.js.map @@ -0,0 +1 @@ +{"version":3,"file":"paths-enum.js","sourceRoot":"","sources":["../../src/transform/paths-enum.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,WAAwB;IAC/D,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,YAAY,GAAG,EAAE,CAAC;IAExB,KAAK,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5F,SAAS;YACX,CAAC;YAGD,IAAI,QAAgB,CAAC;YACrB,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC1B,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC;YACnC,CAAC;iBAAM,CAAC;gBAEN,QAAQ,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;qBACtB,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACZ,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAIjE,OAAO,WAAW,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC,CAAC;qBACD,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,CAAC;YAGD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAElD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE;QAChD,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file diff --git a/package/dist/transform/paths-object.d.ts b/package/dist/transform/paths-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..b623adf4d5c7da9b46f4371e7072ba85802724ad --- /dev/null +++ b/package/dist/transform/paths-object.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { GlobalContext, PathsObject } from "../types.js"; +export default function transformPathsObject(pathsObject: PathsObject, ctx: GlobalContext): ts.TypeNode; diff --git a/package/dist/transform/paths-object.js b/package/dist/transform/paths-object.js new file mode 100644 index 0000000000000000000000000000000000000000..32afe59ed21f0794b10599979872e037f5e5c063 --- /dev/null +++ b/package/dist/transform/paths-object.js @@ -0,0 +1,86 @@ +import ts from "typescript"; +import { performance } from "node:perf_hooks"; +import { addJSDocComment, oapiRef, stringToAST, tsModifiers, tsPropertyIndex } from "../lib/ts.js"; +import { createRef, debug, getEntries } from "../lib/utils.js"; +import transformPathItemObject from "./path-item-object.js"; +const PATH_PARAM_RE = /\{[^}]+\}/g; +export default function transformPathsObject(pathsObject, ctx) { + const type = []; + for (const [url, pathItemObject] of getEntries(pathsObject, ctx)) { + if (!pathItemObject || typeof pathItemObject !== "object") { + continue; + } + const pathT = performance.now(); + if ("$ref" in pathItemObject) { + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: ctx.immutable }), tsPropertyIndex(url), undefined, oapiRef(pathItemObject.$ref)); + addJSDocComment(pathItemObject, property); + type.push(property); + } + else { + const pathItemType = transformPathItemObject(pathItemObject, { + path: createRef(["paths", url]), + ctx, + }); + if (ctx.pathParamsAsTypes && url.includes("{")) { + const pathParams = extractPathParams(pathItemObject, ctx); + const matches = url.match(PATH_PARAM_RE); + let rawPath = `\`${url}\``; + if (matches) { + for (const match of matches) { + const paramName = match.slice(1, -1); + const param = pathParams[paramName]; + switch (param?.schema?.type) { + case "number": + case "integer": + rawPath = rawPath.replace(match, "${number}"); + break; + case "boolean": + rawPath = rawPath.replace(match, "${boolean}"); + break; + default: + rawPath = rawPath.replace(match, "${string}"); + break; + } + } + const pathType = stringToAST(rawPath)[0]?.expression; + if (pathType) { + type.push(ts.factory.createIndexSignature(tsModifiers({ readonly: ctx.immutable }), [ + ts.factory.createParameterDeclaration(undefined, undefined, "path", undefined, pathType, undefined), + ], pathItemType)); + continue; + } + } + } + type.push(ts.factory.createPropertySignature(tsModifiers({ readonly: ctx.immutable }), tsPropertyIndex(url), undefined, pathItemType)); + debug(`Transformed path "${url}"`, "ts", performance.now() - pathT); + } + } + return ts.factory.createTypeLiteralNode(type); +} +function extractPathParams(pathItemObject, ctx) { + const params = {}; + for (const p of pathItemObject.parameters ?? []) { + const resolved = "$ref" in p && p.$ref ? ctx.resolve(p.$ref) : p; + if (resolved && resolved.in === "path") { + params[resolved.name] = resolved; + } + } + for (const method of ["get", "put", "post", "delete", "options", "head", "patch", "trace"]) { + if (!(method in pathItemObject)) { + continue; + } + const resolvedMethod = pathItemObject[method].$ref + ? ctx.resolve(pathItemObject[method].$ref) + : pathItemObject[method]; + if (resolvedMethod?.parameters) { + for (const p of resolvedMethod.parameters) { + const resolvedParam = "$ref" in p && p.$ref ? ctx.resolve(p.$ref) : p; + if (resolvedParam && resolvedParam.in === "path") { + params[resolvedParam.name] = resolvedParam; + } + } + } + } + return params; +} +//# sourceMappingURL=paths-object.js.map \ No newline at end of file diff --git a/package/dist/transform/paths-object.js.map b/package/dist/transform/paths-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..9cc98a29a66c074ea496518bbe22404ce1d71068 --- /dev/null +++ b/package/dist/transform/paths-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"paths-object.js","sourceRoot":"","sources":["../../src/transform/paths-object.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/request-body-object.d.ts b/package/dist/transform/request-body-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..78ba3e87926b34a1f9f32c3184cccd7924b3c257 --- /dev/null +++ b/package/dist/transform/request-body-object.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { RequestBodyObject, TransformNodeOptions } from "../types.js"; +export default function transformRequestBodyObject(requestBodyObject: RequestBodyObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/request-body-object.js b/package/dist/transform/request-body-object.js new file mode 100644 index 0000000000000000000000000000000000000000..71b18fe99525aec345cf8b47842466d498944f95 --- /dev/null +++ b/package/dist/transform/request-body-object.js @@ -0,0 +1,32 @@ +import ts from "typescript"; +import { NEVER, QUESTION_TOKEN, addJSDocComment, tsModifiers, tsPropertyIndex } from "../lib/ts.js"; +import { createRef, getEntries } from "../lib/utils.js"; +import transformMediaTypeObject from "./media-type-object.js"; +import transformSchemaObject from "./schema-object.js"; +export default function transformRequestBodyObject(requestBodyObject, options) { + const type = []; + for (const [contentType, mediaTypeObject] of getEntries(requestBodyObject.content ?? {}, options.ctx)) { + const nextPath = createRef([options.path, contentType]); + const mediaType = "$ref" in mediaTypeObject + ? transformSchemaObject(mediaTypeObject, { + ...options, + path: nextPath, + }) + : transformMediaTypeObject(mediaTypeObject, { + ...options, + path: nextPath, + }); + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(contentType), undefined, mediaType); + addJSDocComment(mediaTypeObject, property); + type.push(property); + } + return ts.factory.createTypeLiteralNode([ + ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex("content"), undefined, ts.factory.createTypeLiteralNode(type.length + ? type + : + [ + ts.factory.createPropertySignature(undefined, tsPropertyIndex("*/*"), QUESTION_TOKEN, NEVER), + ])), + ]); +} +//# sourceMappingURL=request-body-object.js.map \ No newline at end of file diff --git a/package/dist/transform/request-body-object.js.map b/package/dist/transform/request-body-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..d258b8f890fa6bfc7c04c14402069809df8b9839 --- /dev/null +++ b/package/dist/transform/request-body-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"request-body-object.js","sourceRoot":"","sources":["../../src/transform/request-body-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;AAMvD,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAChD,iBAAoC,EACpC,OAA6B;IAE7B,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACtG,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QACxD,MAAM,SAAS,GACb,MAAM,IAAI,eAAe;YACvB,CAAC,CAAC,qBAAqB,CAAC,eAAe,EAAE;gBACrC,GAAG,OAAO;gBACV,IAAI,EAAE,QAAQ;aACf,CAAC;YACJ,CAAC,CAAC,wBAAwB,CAAC,eAAe,EAAE;gBACxC,GAAG,OAAO;gBACV,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACT,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAC7B,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAChD,eAAe,CAAC,WAAW,CAAC,EAC5B,SAAS,EACT,SAAS,CAC9B,CAAC;QACF,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;QACtC,EAAE,CAAC,OAAO,CAAC,uBAAuB,CACZ,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAChD,eAAe,CAAC,SAAS,CAAC,EAC1B,SAAS,EACT,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAClD,IAAI,CAAC,MAAM;YACT,CAAC,CAAC,IAAI;YACN,CAAC;gBACC;oBACE,EAAE,CAAC,OAAO,CAAC,uBAAuB,CACZ,SAAS,EACT,eAAe,CAAC,KAAK,CAAC,EACtB,cAAc,EACd,KAAK,CAC1B;iBACF,CACN,CACF;KACF,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file diff --git a/package/dist/transform/response-object.d.ts b/package/dist/transform/response-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a285ccf966cfabe6a3a2c5e26bdc29dd004803b5 --- /dev/null +++ b/package/dist/transform/response-object.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { ResponseObject, TransformNodeOptions } from "../types.js"; +export default function transformResponseObject(responseObject: ResponseObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/response-object.js b/package/dist/transform/response-object.js new file mode 100644 index 0000000000000000000000000000000000000000..d16bb7ad730656f4d632c286aec7a830ed6eedf4 --- /dev/null +++ b/package/dist/transform/response-object.js @@ -0,0 +1,45 @@ +import ts from "typescript"; +import { NEVER, QUESTION_TOKEN, STRING, UNKNOWN, addJSDocComment, oapiRef, tsModifiers, tsPropertyIndex, } from "../lib/ts.js"; +import { createRef, getEntries } from "../lib/utils.js"; +import transformHeaderObject from "./header-object.js"; +import transformMediaTypeObject from "./media-type-object.js"; +export default function transformResponseObject(responseObject, options) { + const type = []; + const headersObject = []; + if (responseObject.headers) { + for (const [name, headerObject] of getEntries(responseObject.headers, options.ctx)) { + const optional = "$ref" in headerObject || headerObject.required ? undefined : QUESTION_TOKEN; + const subType = "$ref" in headerObject + ? oapiRef(headerObject.$ref) + : transformHeaderObject(headerObject, { + ...options, + path: createRef([options.path, "headers", name]), + }); + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(name), optional, subType); + addJSDocComment(headerObject, property); + headersObject.push(property); + } + } + headersObject.push(ts.factory.createIndexSignature(tsModifiers({ readonly: options.ctx.immutable }), [ + ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createIdentifier("name"), undefined, STRING), + ], UNKNOWN)); + type.push(ts.factory.createPropertySignature(undefined, tsPropertyIndex("headers"), undefined, ts.factory.createTypeLiteralNode(headersObject))); + const contentObject = []; + if (responseObject.content) { + for (const [contentType, mediaTypeObject] of getEntries(responseObject.content ?? {}, options.ctx)) { + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(contentType), undefined, transformMediaTypeObject(mediaTypeObject, { + ...options, + path: createRef([options.path, "content", contentType]), + })); + contentObject.push(property); + } + } + if (contentObject.length) { + type.push(ts.factory.createPropertySignature(undefined, tsPropertyIndex("content"), undefined, ts.factory.createTypeLiteralNode(contentObject))); + } + else { + type.push(ts.factory.createPropertySignature(undefined, tsPropertyIndex("content"), QUESTION_TOKEN, NEVER)); + } + return ts.factory.createTypeLiteralNode(type); +} +//# sourceMappingURL=response-object.js.map \ No newline at end of file diff --git a/package/dist/transform/response-object.js.map b/package/dist/transform/response-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..c097c23d02649a25b59a7a261670e55dbc3e0811 --- /dev/null +++ b/package/dist/transform/response-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"response-object.js","sourceRoot":"","sources":["../../src/transform/response-object.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/responses-object.d.ts b/package/dist/transform/responses-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..858eb915359176fcfacbfa143d594301e3fefe75 --- /dev/null +++ b/package/dist/transform/responses-object.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { ResponsesObject, TransformNodeOptions } from "../types.js"; +export default function transformResponsesObject(responsesObject: ResponsesObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/responses-object.js b/package/dist/transform/responses-object.js new file mode 100644 index 0000000000000000000000000000000000000000..750b9d4b7e219096fea6b19a6f9ab1a6e1384d41 --- /dev/null +++ b/package/dist/transform/responses-object.js @@ -0,0 +1,20 @@ +import ts from "typescript"; +import { NEVER, addJSDocComment, tsModifiers, oapiRef, tsPropertyIndex } from "../lib/ts.js"; +import { createRef, getEntries } from "../lib/utils.js"; +import transformResponseObject from "./response-object.js"; +export default function transformResponsesObject(responsesObject, options) { + const type = []; + for (const [responseCode, responseObject] of getEntries(responsesObject, options.ctx)) { + const responseType = "$ref" in responseObject + ? oapiRef(responseObject.$ref) + : transformResponseObject(responseObject, { + ...options, + path: createRef([options.path, "responses", responseCode]), + }); + const property = ts.factory.createPropertySignature(tsModifiers({ readonly: options.ctx.immutable }), tsPropertyIndex(responseCode), undefined, responseType); + addJSDocComment(responseObject, property); + type.push(property); + } + return type.length ? ts.factory.createTypeLiteralNode(type) : NEVER; +} +//# sourceMappingURL=responses-object.js.map \ No newline at end of file diff --git a/package/dist/transform/responses-object.js.map b/package/dist/transform/responses-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..9b7ebcec5ebbf4f420ac57c8010e9d0989f21b56 --- /dev/null +++ b/package/dist/transform/responses-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"responses-object.js","sourceRoot":"","sources":["../../src/transform/responses-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,uBAAuB,MAAM,sBAAsB,CAAC;AAM3D,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAC9C,eAAgC,EAChC,OAA6B;IAE7B,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACtF,MAAM,YAAY,GAChB,MAAM,IAAI,cAAc;YACtB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC;YAC9B,CAAC,CAAC,uBAAuB,CAAC,cAAc,EAAE;gBACtC,GAAG,OAAO;gBACV,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;aAC3D,CAAC,CAAC;QACT,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAC7B,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAChD,eAAe,CAAC,YAAY,CAAC,EAC7B,SAAS,EACT,YAAY,CACjC,CAAC;QACF,eAAe,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACtE,CAAC"} \ No newline at end of file diff --git a/package/dist/transform/schema-object.d.ts b/package/dist/transform/schema-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..3ed4d3e2191184a9c5338f8163a894b91dc4a5a6 --- /dev/null +++ b/package/dist/transform/schema-object.d.ts @@ -0,0 +1,4 @@ +import ts from "typescript"; +import type { ReferenceObject, SchemaObject, TransformNodeOptions } from "../types.js"; +export default function transformSchemaObject(schemaObject: SchemaObject | ReferenceObject, options: TransformNodeOptions): ts.TypeNode; +export declare function transformSchemaObjectWithComposition(schemaObject: SchemaObject | ReferenceObject, options: TransformNodeOptions): ts.TypeNode; diff --git a/package/dist/transform/schema-object.js b/package/dist/transform/schema-object.js new file mode 100644 index 0000000000000000000000000000000000000000..10d3271239348b81ea21763c56af076dd9077076 --- /dev/null +++ b/package/dist/transform/schema-object.js @@ -0,0 +1,363 @@ +import { parseRef } from "@redocly/openapi-core/lib/ref-utils.js"; +import ts from "typescript"; +import { BOOLEAN, NEVER, NULL, NUMBER, QUESTION_TOKEN, STRING, UNDEFINED, UNKNOWN, addJSDocComment, oapiRef, tsArrayLiteralExpression, tsEnum, tsIntersection, tsIsPrimitive, tsLiteral, tsModifiers, tsNullable, tsPropertyIndex, tsRecord, tsUnion, tsWithRequired, } from "../lib/ts.js"; +import { createDiscriminatorProperty, createRef, getEntries } from "../lib/utils.js"; +export default function transformSchemaObject(schemaObject, options) { + const type = transformSchemaObjectWithComposition(schemaObject, options); + if (typeof options.ctx.postTransform === "function") { + const postTransformResult = options.ctx.postTransform(type, options); + if (postTransformResult) { + return postTransformResult; + } + } + return type; +} +export function transformSchemaObjectWithComposition(schemaObject, options) { + if (!schemaObject) { + return NEVER; + } + if (schemaObject === true) { + return UNKNOWN; + } + if (Array.isArray(schemaObject) || typeof schemaObject !== "object") { + throw new Error(`Expected SchemaObject, received ${Array.isArray(schemaObject) ? "Array" : typeof schemaObject} at ${options.path}`); + } + if ("$ref" in schemaObject) { + return oapiRef(schemaObject.$ref); + } + if (schemaObject.const !== null && schemaObject.const !== undefined) { + return tsLiteral(schemaObject.const); + } + if (Array.isArray(schemaObject.enum) && + (!("type" in schemaObject) || schemaObject.type !== "object") && + !("properties" in schemaObject) && + !("additionalProperties" in schemaObject)) { + if (options.ctx.enum && + schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number" || v === null)) { + let enumName = parseRef(options.path ?? "").pointer.join("/"); + enumName = enumName.replace("components/schemas", ""); + const metadata = schemaObject.enum.map((_, i) => ({ + name: schemaObject["x-enum-varnames"]?.[i] ?? schemaObject["x-enumNames"]?.[i], + description: schemaObject["x-enum-descriptions"]?.[i] ?? schemaObject["x-enumDescriptions"]?.[i], + })); + let hasNull = false; + const validSchemaEnums = schemaObject.enum.filter((enumValue) => { + if (enumValue === null) { + hasNull = true; + return false; + } + return true; + }); + const enumType = tsEnum(enumName, validSchemaEnums, metadata, { + shouldCache: options.ctx.dedupeEnums, + export: true, + }); + if (!options.ctx.injectFooter.includes(enumType)) { + options.ctx.injectFooter.push(enumType); + } + const ref = ts.factory.createTypeReferenceNode(enumType.name); + return hasNull ? tsUnion([ref, NULL]) : ref; + } + const enumType = schemaObject.enum.map(tsLiteral); + if (((Array.isArray(schemaObject.type) && schemaObject.type.includes("null")) || schemaObject.nullable) && + !schemaObject.default) { + enumType.push(NULL); + } + const unionType = tsUnion(enumType); + if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { + let enumValuesVariableName = parseRef(options.path ?? "").pointer.join("/"); + enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); + enumValuesVariableName = `${enumValuesVariableName}Values`; + const enumValuesArray = tsArrayLiteralExpression(enumValuesVariableName, oapiRef(options.path ?? ""), schemaObject.enum, { + export: true, + readonly: true, + injectFooter: options.ctx.injectFooter, + }); + options.ctx.injectFooter.push(enumValuesArray); + } + return unionType; + } + function collectUnionCompositions(items) { + const output = []; + for (const item of items) { + output.push(transformSchemaObject(item, options)); + } + return output; + } + function collectAllOfCompositions(items, required) { + const output = []; + for (const item of items) { + let itemType; + if ("$ref" in item) { + itemType = transformSchemaObject(item, options); + const resolved = options.ctx.resolve(item.$ref); + if (resolved && + typeof resolved === "object" && + "properties" in resolved && + !options.ctx.discriminators.refsHandled.includes(item.$ref)) { + const validRequired = (required ?? []).filter((key) => !!resolved.properties?.[key]); + if (validRequired.length) { + itemType = tsWithRequired(itemType, validRequired, options.ctx.injectFooter); + } + } + } + else { + const itemRequired = [...(required ?? [])]; + if (typeof item === "object" && Array.isArray(item.required)) { + itemRequired.push(...item.required); + } + itemType = transformSchemaObject({ ...item, required: itemRequired }, options); + } + output.push(itemType); + } + return output; + } + let finalType = undefined; + const coreObjectType = transformSchemaObjectCore(schemaObject, options); + const allOfType = collectAllOfCompositions(schemaObject.allOf ?? [], schemaObject.required); + if (coreObjectType || allOfType.length) { + const allOf = allOfType.length ? tsIntersection(allOfType) : undefined; + finalType = tsIntersection([...(coreObjectType ? [coreObjectType] : []), ...(allOf ? [allOf] : [])]); + } + const anyOfType = collectUnionCompositions(schemaObject.anyOf ?? []); + if (anyOfType.length) { + finalType = tsUnion([...(finalType ? [finalType] : []), ...anyOfType]); + } + const oneOfType = collectUnionCompositions(schemaObject.oneOf || + ("type" in schemaObject && + schemaObject.type === "object" && + schemaObject.enum) || + []); + if (oneOfType.length) { + if (oneOfType.every(tsIsPrimitive)) { + finalType = tsUnion([...(finalType ? [finalType] : []), ...oneOfType]); + } + else { + finalType = tsIntersection([...(finalType ? [finalType] : []), tsUnion(oneOfType)]); + } + } + if (!finalType) { + if ("type" in schemaObject) { + finalType = tsRecord(STRING, options.ctx.emptyObjectsUnknown ? UNKNOWN : NEVER); + } + else { + finalType = UNKNOWN; + } + } + if (finalType !== UNKNOWN && schemaObject.nullable && !schemaObject.default) { + finalType = tsNullable([finalType]); + } + return finalType; +} +function transformSchemaObjectCore(schemaObject, options) { + if ("type" in schemaObject && schemaObject.type) { + if (typeof options.ctx.transform === "function") { + const result = options.ctx.transform(schemaObject, options); + if (result && typeof result === "object") { + if ("schema" in result) { + if (result.questionToken) { + return ts.factory.createUnionTypeNode([result.schema, UNDEFINED]); + } + else { + return result.schema; + } + } + else { + return result; + } + } + } + if (schemaObject.type === "null") { + return NULL; + } + if (schemaObject.type === "string") { + return STRING; + } + if (schemaObject.type === "number" || schemaObject.type === "integer") { + return NUMBER; + } + if (schemaObject.type === "boolean") { + return BOOLEAN; + } + if (schemaObject.type === "array") { + let itemType = UNKNOWN; + if (schemaObject.prefixItems || Array.isArray(schemaObject.items)) { + const prefixItems = schemaObject.prefixItems ?? schemaObject.items; + itemType = ts.factory.createTupleTypeNode(prefixItems.map((item) => transformSchemaObject(item, options))); + } + else if (schemaObject.items) { + if ("type" in schemaObject.items && schemaObject.items.type === "array") { + itemType = ts.factory.createArrayTypeNode(transformSchemaObject(schemaObject.items, options)); + } + else { + itemType = transformSchemaObject(schemaObject.items, options); + } + } + const min = typeof schemaObject.minItems === "number" && schemaObject.minItems >= 0 ? schemaObject.minItems : 0; + const max = typeof schemaObject.maxItems === "number" && schemaObject.maxItems >= 0 && min <= schemaObject.maxItems + ? schemaObject.maxItems + : undefined; + const estimateCodeSize = typeof max !== "number" ? min : (max * (max + 1) - min * (min - 1)) / 2; + if (options.ctx.arrayLength && + (min !== 0 || max !== undefined) && + estimateCodeSize < 30) { + if (min === max) { + const elements = []; + for (let i = 0; i < min; i++) { + elements.push(itemType); + } + return tsUnion([ts.factory.createTupleTypeNode(elements)]); + } + else if (schemaObject.maxItems > 0) { + const members = []; + for (let i = 0; i <= (max ?? 0) - min; i++) { + const elements = []; + for (let j = min; j < i + min; j++) { + elements.push(itemType); + } + members.push(ts.factory.createTupleTypeNode(elements)); + } + return tsUnion(members); + } + else { + const elements = []; + for (let i = 0; i < min; i++) { + elements.push(itemType); + } + elements.push(ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(itemType))); + return ts.factory.createTupleTypeNode(elements); + } + } + const finalType = ts.isTupleTypeNode(itemType) || ts.isArrayTypeNode(itemType) + ? itemType + : ts.factory.createArrayTypeNode(itemType); + return options.ctx.immutable + ? ts.factory.createTypeOperatorNode(ts.SyntaxKind.ReadonlyKeyword, finalType) + : finalType; + } + if (Array.isArray(schemaObject.type) && !Array.isArray(schemaObject)) { + const uniqueTypes = []; + if (Array.isArray(schemaObject.oneOf)) { + for (const t of schemaObject.type) { + if ((t === "boolean" || t === "string" || t === "number" || t === "integer" || t === "null") && + schemaObject.oneOf.find((o) => typeof o === "object" && "type" in o && o.type === t)) { + continue; + } + uniqueTypes.push(t === "null" || t === null + ? NULL + : transformSchemaObject({ ...schemaObject, type: t, oneOf: undefined }, options)); + } + } + else { + for (const t of schemaObject.type) { + if (t === "null" || t === null) { + if (!schemaObject.default) { + uniqueTypes.push(NULL); + } + } + else { + uniqueTypes.push(transformSchemaObject({ ...schemaObject, type: t }, options)); + } + } + } + return tsUnion(uniqueTypes); + } + } + const coreObjectType = []; + for (const k of ["allOf", "anyOf"]) { + if (!schemaObject[k]) { + continue; + } + const discriminator = !schemaObject.discriminator && + !options.ctx.discriminators.refsHandled.includes(options.path ?? "") && + options.ctx.discriminators.objects[options.path ?? ""]; + if (discriminator) { + coreObjectType.unshift(createDiscriminatorProperty(discriminator, { + path: options.path ?? "", + readonly: options.ctx.immutable, + })); + break; + } + } + if (("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) || + ("additionalProperties" in schemaObject && schemaObject.additionalProperties) || + ("$defs" in schemaObject && schemaObject.$defs)) { + if (Object.keys(schemaObject.properties ?? {}).length) { + for (const [k, v] of getEntries(schemaObject.properties ?? {}, options.ctx)) { + if (typeof v !== "object" || Array.isArray(v)) { + throw new Error(`${options.path}: invalid property ${k}. Expected Schema Object, got ${Array.isArray(v) ? "Array" : typeof v}`); + } + if (options.ctx.excludeDeprecated) { + const resolved = "$ref" in v ? options.ctx.resolve(v.$ref) : v; + if (resolved?.deprecated) { + continue; + } + } + let optional = schemaObject.required?.includes(k) || + (schemaObject.required === undefined && options.ctx.propertiesRequiredByDefault) || + ("default" in v && + options.ctx.defaultNonNullable && + !options.path?.includes("parameters") && + !options.path?.includes("requestBody") && + !options.path?.includes("requestBodies")) + ? undefined + : QUESTION_TOKEN; + let type = "$ref" in v + ? oapiRef(v.$ref) + : transformSchemaObject(v, { + ...options, + path: createRef([options.path, k]), + }); + if (typeof options.ctx.transform === "function") { + const result = options.ctx.transform(v, options); + if (result && typeof result === "object") { + if ("schema" in result) { + type = result.schema; + optional = result.questionToken ? QUESTION_TOKEN : optional; + } + else { + type = result; + } + } + } + const property = ts.factory.createPropertySignature(tsModifiers({ + readonly: options.ctx.immutable || ("readOnly" in v && !!v.readOnly), + }), tsPropertyIndex(k), optional, type); + addJSDocComment(v, property); + coreObjectType.push(property); + } + } + if (schemaObject.$defs && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { + const defKeys = []; + for (const [k, v] of Object.entries(schemaObject.$defs)) { + const property = ts.factory.createPropertySignature(tsModifiers({ + readonly: options.ctx.immutable || ("readonly" in v && !!v.readOnly), + }), tsPropertyIndex(k), undefined, transformSchemaObject(v, { + ...options, + path: createRef([options.path, "$defs", k]), + })); + addJSDocComment(v, property); + defKeys.push(property); + } + coreObjectType.push(ts.factory.createPropertySignature(undefined, tsPropertyIndex("$defs"), undefined, ts.factory.createTypeLiteralNode(defKeys))); + } + if (schemaObject.additionalProperties || options.ctx.additionalProperties) { + const hasExplicitAdditionalProperties = typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length; + const addlType = hasExplicitAdditionalProperties + ? transformSchemaObject(schemaObject.additionalProperties, options) + : UNKNOWN; + return tsIntersection([ + ...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []), + ts.factory.createTypeLiteralNode([ + ts.factory.createIndexSignature(tsModifiers({ + readonly: options.ctx.immutable, + }), [ + ts.factory.createParameterDeclaration(undefined, undefined, ts.factory.createIdentifier("key"), undefined, STRING), + ], addlType), + ]), + ]); + } + } + return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined; +} +//# sourceMappingURL=schema-object.js.map \ No newline at end of file diff --git a/package/dist/transform/schema-object.js.map b/package/dist/transform/schema-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..fbe11e11385076d2f4f0cf2e54fc616eec061420 --- /dev/null +++ b/package/dist/transform/schema-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"schema-object.js","sourceRoot":"","sources":["../../src/transform/schema-object.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package/dist/transform/webhooks-object.d.ts b/package/dist/transform/webhooks-object.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..12cd2a4868227e4c4ab4dae316ef193e00d52568 --- /dev/null +++ b/package/dist/transform/webhooks-object.d.ts @@ -0,0 +1,3 @@ +import ts from "typescript"; +import type { GlobalContext, WebhooksObject } from "../types.js"; +export default function transformWebhooksObject(webhooksObject: WebhooksObject, options: GlobalContext): ts.TypeNode; diff --git a/package/dist/transform/webhooks-object.js b/package/dist/transform/webhooks-object.js new file mode 100644 index 0000000000000000000000000000000000000000..3f2848200b31d4858e1cc0b391511536b070cd8d --- /dev/null +++ b/package/dist/transform/webhooks-object.js @@ -0,0 +1,17 @@ +import ts from "typescript"; +import { tsModifiers, tsPropertyIndex } from "../lib/ts.js"; +import { createRef, getEntries } from "../lib/utils.js"; +import transformPathItemObject from "./path-item-object.js"; +export default function transformWebhooksObject(webhooksObject, options) { + const type = []; + for (const [name, pathItemObject] of getEntries(webhooksObject, options)) { + type.push(ts.factory.createPropertySignature(tsModifiers({ + readonly: options.immutable, + }), tsPropertyIndex(name), undefined, transformPathItemObject(pathItemObject, { + path: createRef(["webhooks", name]), + ctx: options, + }))); + } + return ts.factory.createTypeLiteralNode(type); +} +//# sourceMappingURL=webhooks-object.js.map \ No newline at end of file diff --git a/package/dist/transform/webhooks-object.js.map b/package/dist/transform/webhooks-object.js.map new file mode 100644 index 0000000000000000000000000000000000000000..e3c7c4f9663e5b14cbdf0072c8cd928f2d3b969f --- /dev/null +++ b/package/dist/transform/webhooks-object.js.map @@ -0,0 +1 @@ +{"version":3,"file":"webhooks-object.js","sourceRoot":"","sources":["../../src/transform/webhooks-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,uBAAuB,MAAM,uBAAuB,CAAC;AAE5D,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,cAA8B,EAAE,OAAsB;IACpG,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,IAAI,CACP,EAAE,CAAC,OAAO,CAAC,uBAAuB,CACZ,WAAW,CAAC;YAC9B,QAAQ,EAAE,OAAO,CAAC,SAAS;SAC5B,CAAC,EACkB,eAAe,CAAC,IAAI,CAAC,EACrB,SAAS,EACT,uBAAuB,CAAC,cAAc,EAAE;YAC1D,IAAI,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACnC,GAAG,EAAE,OAAO;SACb,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC"} \ No newline at end of file diff --git a/package/dist/types.d.ts b/package/dist/types.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..c08afb1fda3b04cca96e9ff887a7f5336fa6b087 --- /dev/null +++ b/package/dist/types.d.ts @@ -0,0 +1,372 @@ +import type { Config as RedoclyConfig } from "@redocly/openapi-core"; +import type { PathLike } from "node:fs"; +import type ts from "typescript"; +export interface Extensable { + [key: `x-${string}`]: any; +} +export interface OpenAPI3 extends Extensable { + openapi: string; + info: InfoObject; + jsonSchemaDialect?: string; + servers?: ServerObject[]; + paths?: PathsObject; + webhooks?: { + [id: string]: PathItemObject | ReferenceObject; + }; + components?: ComponentsObject; + security?: SecurityRequirementObject[]; + tags?: TagObject[]; + externalDocs?: ExternalDocumentationObject; + $defs?: $defs; +} +export interface InfoObject extends Extensable { + title: string; + summary?: string; + description?: string; + termsOfService?: string; + contact?: ContactObject; + license?: LicenseObject; + version: string; +} +export interface ContactObject extends Extensable { + name?: string; + url?: string; + email?: string; +} +export interface LicenseObject extends Extensable { + name: string; + identifier: string; + url: string; +} +export interface ServerObject extends Extensable { + url: string; + description: string; + variables: { + [name: string]: ServerVariableObject; + }; +} +export interface ServerVariableObject extends Extensable { + enum?: string[]; + default: string; + description?: string; +} +export interface ComponentsObject extends Extensable { + schemas?: Record; + responses?: Record; + parameters?: Record; + examples?: Record; + requestBodies?: Record; + headers?: Record; + securitySchemes?: Record; + links?: Record; + callbacks?: Record; + pathItems?: Record; +} +export interface PathsObject { + [pathname: string]: PathItemObject | ReferenceObject; +} +export interface WebhooksObject { + [name: string]: PathItemObject; +} +export interface PathItemObject extends Extensable { + get?: OperationObject | ReferenceObject; + put?: OperationObject | ReferenceObject; + post?: OperationObject | ReferenceObject; + delete?: OperationObject | ReferenceObject; + options?: OperationObject | ReferenceObject; + head?: OperationObject | ReferenceObject; + patch?: OperationObject | ReferenceObject; + trace?: OperationObject | ReferenceObject; + servers?: ServerObject[]; + parameters?: (ParameterObject | ReferenceObject)[]; +} +export interface OperationObject extends Extensable { + tags?: string[]; + summary?: string; + description?: string; + externalDocs?: ExternalDocumentationObject; + operationId?: string; + parameters?: (ParameterObject | ReferenceObject)[]; + requestBody?: RequestBodyObject | ReferenceObject; + responses?: ResponsesObject; + callbacks?: Record; + deprecated?: boolean; + security?: SecurityRequirementObject[]; + servers?: ServerObject[]; +} +export interface ExternalDocumentationObject extends Extensable { + description?: string; + url: string; +} +export interface ParameterObject extends Extensable { + name: string; + in: "query" | "header" | "path" | "cookie"; + description?: string; + required?: boolean; + deprecated?: boolean; + allowEmptyValue?: boolean; + style?: string; + explode?: boolean; + allowReserved?: boolean; + schema?: SchemaObject; + example?: any; + examples?: { + [name: string]: ExampleObject | ReferenceObject; + }; + content?: { + [contentType: string]: MediaTypeObject | ReferenceObject; + }; +} +export interface RequestBodyObject extends Extensable { + description?: string; + content: { + [contentType: string]: MediaTypeObject | ReferenceObject; + }; + required?: boolean; +} +export interface MediaTypeObject extends Extensable { + schema?: SchemaObject | ReferenceObject; + example?: any; + examples?: { + [name: string]: ExampleObject | ReferenceObject; + }; + encoding?: { + [propertyName: string]: EncodingObject; + }; +} +export interface EncodingObject extends Extensable { + contentType?: string; + headers?: { + [name: string]: HeaderObject | ReferenceObject; + }; + style?: string; + explode?: string; + allowReserved?: string; +} +export type ResponsesObject = { + [responseCode: string]: ResponseObject | ReferenceObject; +} & { + default?: ResponseObject | ReferenceObject; +}; +export interface ResponseObject extends Extensable { + description: string; + headers?: { + [name: string]: HeaderObject | ReferenceObject; + }; + content?: { + [contentType: string]: MediaTypeObject; + }; + links?: { + [name: string]: LinkObject | ReferenceObject; + }; +} +export type CallbackObject = Record; +export interface ExampleObject extends Extensable { + summary?: string; + description?: string; + value?: any; + externalValue?: string; +} +export interface LinkObject extends Extensable { + operationRef?: string; + operationId?: string; + parameters?: { + [name: string]: `$${string}`; + }; + requestBody?: `$${string}`; + description?: string; + server?: ServerObject; +} +export type HeaderObject = Omit; +export interface TagObject extends Extensable { + name: string; + description?: string; + externalDocs?: ExternalDocumentationObject; +} +export interface ReferenceObject extends Extensable { + $ref: string; + summary?: string; + description?: string; +} +export type SchemaObject = { + discriminator?: DiscriminatorObject; + xml?: XMLObject; + externalDocs?: ExternalDocumentationObject; + example?: any; + title?: string; + description?: string; + $comment?: string; + deprecated?: boolean; + readOnly?: boolean; + writeOnly?: boolean; + enum?: unknown[]; + const?: unknown; + default?: unknown; + format?: string; + nullable?: boolean; + oneOf?: (SchemaObject | ReferenceObject)[]; + allOf?: (SchemaObject | ReferenceObject)[]; + anyOf?: (SchemaObject | ReferenceObject)[]; + required?: string[]; + [key: `x-${string}`]: any; +} & (StringSubtype | NumberSubtype | IntegerSubtype | ArraySubtype | BooleanSubtype | NullSubtype | ObjectSubtype | { + type: ("string" | "number" | "integer" | "array" | "boolean" | "null" | "object")[]; +}); +export interface TransformObject { + schema: ts.TypeNode; + questionToken: boolean; +} +export interface StringSubtype { + type: "string" | ["string", "null"]; + enum?: (string | ReferenceObject)[]; +} +export interface NumberSubtype { + type: "number" | ["number", "null"]; + minimum?: number; + maximum?: number; + enum?: (number | ReferenceObject)[]; +} +export interface IntegerSubtype { + type: "integer" | ["integer", "null"]; + minimum?: number; + maximum?: number; + enum?: (number | ReferenceObject)[]; +} +export interface ArraySubtype { + type: "array" | ["array", "null"]; + prefixItems?: (SchemaObject | ReferenceObject)[]; + items?: SchemaObject | ReferenceObject | (SchemaObject | ReferenceObject)[]; + minItems?: number; + maxItems?: number; + enum?: (SchemaObject | ReferenceObject)[]; +} +export interface BooleanSubtype { + type: "boolean" | ["boolean", "null"]; + enum?: (boolean | ReferenceObject)[]; +} +export interface NullSubtype { + type: "null"; +} +export interface ObjectSubtype { + type: "object" | ["object", "null"]; + properties?: { + [name: string]: SchemaObject | ReferenceObject; + }; + additionalProperties?: boolean | Record | SchemaObject | ReferenceObject; + required?: string[]; + allOf?: (SchemaObject | ReferenceObject)[]; + anyOf?: (SchemaObject | ReferenceObject)[]; + enum?: (SchemaObject | ReferenceObject)[]; + $defs?: $defs; +} +export interface DiscriminatorObject { + propertyName: string; + mapping?: Record; + oneOf?: string[]; +} +export interface XMLObject extends Extensable { + name?: string; + namespace?: string; + prefix?: string; + attribute?: boolean; + wrapped?: boolean; +} +export type SecuritySchemeObject = { + description?: string; + [key: `x-${string}`]: any; +} & ({ + type: "apiKey"; + name: string; + in: "query" | "header" | "cookie"; +} | { + type: "http"; + scheme: string; + bearer?: string; +} | { + type: "mutualTLS"; +} | { + type: "oauth2"; + flows: OAuthFlowsObject; +} | { + type: "openIdConnect"; + openIdConnectUrl: string; +}); +export interface OAuthFlowsObject extends Extensable { + implicit?: OAuthFlowObject; + password?: OAuthFlowObject; + clientCredentials?: OAuthFlowObject; + authorizationCode?: OAuthFlowObject; +} +export interface OAuthFlowObject extends Extensable { + authorizationUrl: string; + tokenUrl: string; + refreshUrl: string; + scopes: { + [name: string]: string; + }; +} +export type SecurityRequirementObject = { + [P in keyof ComponentsObject["securitySchemes"]]?: string[]; +}; +export interface OpenAPITSOptions { + additionalProperties?: boolean; + alphabetize?: boolean; + arrayLength?: boolean; + emptyObjectsUnknown?: boolean; + cwd?: PathLike; + defaultNonNullable?: boolean; + excludeDeprecated?: boolean; + transform?: (schemaObject: SchemaObject, options: TransformNodeOptions) => ts.TypeNode | TransformObject | undefined; + postTransform?: (type: ts.TypeNode, options: TransformNodeOptions) => ts.TypeNode | undefined; + immutable?: boolean; + silent?: boolean; + version?: number; + exportType?: boolean; + enum?: boolean; + enumValues?: boolean; + dedupeEnums?: boolean; + pathParamsAsTypes?: boolean; + propertiesRequiredByDefault?: boolean; + rootTypes?: boolean; + rootTypesNoSchemaPrefix?: boolean; + redocly?: RedoclyConfig; + inject?: string; + makePathsEnum?: boolean; + generatePathParams?: boolean; +} +export interface GlobalContext { + additionalProperties: boolean; + alphabetize: boolean; + arrayLength: boolean; + defaultNonNullable: boolean; + discriminators: { + objects: Record; + refsHandled: string[]; + }; + emptyObjectsUnknown: boolean; + enum: boolean; + enumValues: boolean; + dedupeEnums: boolean; + excludeDeprecated: boolean; + exportType: boolean; + immutable: boolean; + injectFooter: ts.Node[]; + pathParamsAsTypes: boolean; + postTransform: OpenAPITSOptions["postTransform"]; + propertiesRequiredByDefault: boolean; + rootTypes: boolean; + rootTypesNoSchemaPrefix: boolean; + redoc: RedoclyConfig; + silent: boolean; + transform: OpenAPITSOptions["transform"]; + resolve($ref: string): T | undefined; + inject?: string; + makePathsEnum: boolean; + generatePathParams: boolean; +} +export type $defs = Record; +export interface TransformNodeOptions { + path?: string; + schema?: SchemaObject | ReferenceObject; + ctx: GlobalContext; +} diff --git a/package/dist/types.js b/package/dist/types.js new file mode 100644 index 0000000000000000000000000000000000000000..718fd38ae40c67ea23b242517cf9919f602c5a3e --- /dev/null +++ b/package/dist/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/package/dist/types.js.map b/package/dist/types.js.map new file mode 100644 index 0000000000000000000000000000000000000000..c768b79002615c0e69cc6efdcad6a509c1abaaec --- /dev/null +++ b/package/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/package.json b/package.json index 4893afdec25f506f62d44f64fe0861c411cb7fae..8da19442a2d78a8d9d0ac19cea4d16eeb64506f7 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.3.0", + "scule": "^1.3.0", "supports-color": "^10.2.2", "yargs-parser": "^21.1.1" }, @@ -57,7 +58,7 @@ "@types/js-yaml": "4.0.9", "degit": "2.8.4", "execa": "^9.6.1", - "strip-ansi": "7.1.2", + "strip-ansi": "7.2.0", "typescript": "^5.9.3", "vite-node": "5.3.0" }, diff --git a/src/transform/schema-object.ts b/src/transform/schema-object.ts index 58745d072e4c8362a5f979c9d02fa04ecd14345a..20196ea453b93a4a9a956c24dc8f343d8a89492d 100644 --- a/src/transform/schema-object.ts +++ b/src/transform/schema-object.ts @@ -16,7 +16,6 @@ import { tsLiteral, tsModifiers, tsNullable, - tsOmit, tsPropertyIndex, tsRecord, tsUnion, @@ -94,112 +93,119 @@ export function transformSchemaObjectWithComposition( if ( Array.isArray(schemaObject.enum) && (!("type" in schemaObject) || schemaObject.type !== "object") && - !("properties" in schemaObject) && - !("additionalProperties" in schemaObject) + !("properties" in schemaObject) ) { - // hoist enum to top level if string/number enum and option is enabled - if (shouldTransformToTsEnum(options, schemaObject)) { - let enumName = parseRef(options.path ?? "").pointer.join("/"); - // allow #/components/schemas to have simpler names - enumName = enumName.replace("components/schemas", ""); - const metadata = schemaObject.enum.map((_, i) => ({ - name: schemaObject["x-enum-varnames"]?.[i] ?? schemaObject["x-enumNames"]?.[i], - description: schemaObject["x-enum-descriptions"]?.[i] ?? schemaObject["x-enumDescriptions"]?.[i], - })); - - // enums can contain null values, but dont want to output them - let hasNull = false; - const validSchemaEnums = schemaObject.enum.filter((enumValue) => { - if (enumValue === null) { - hasNull = true; - return false; + const hasAdditionalProperties = "additionalProperties" in schemaObject && !!schemaObject.additionalProperties; + + if (!hasAdditionalProperties || (schemaObject.type === "string" && hasAdditionalProperties)) { + // hoist enum to top level if string/number enum and option is enabled + if (shouldTransformToTsEnum(options, schemaObject)) { + let enumName = parseRef(options.path ?? "").pointer.join("/"); + // allow #/components/schemas to have simpler names + enumName = enumName.replace("components/schemas", ""); + const metadata = schemaObject.enum.map((_, i) => ({ + name: schemaObject["x-enum-varnames"]?.[i] ?? schemaObject["x-enumNames"]?.[i], + description: schemaObject["x-enum-descriptions"]?.[i] ?? schemaObject["x-enumDescriptions"]?.[i], + })); + + // enums can contain null values, but dont want to output them + let hasNull = false; + const validSchemaEnums = schemaObject.enum.filter((enumValue) => { + if (enumValue === null) { + hasNull = true; + return false; + } + + return true; + }); + const enumType = tsEnum(enumName, validSchemaEnums as (string | number)[], metadata, { + shouldCache: options.ctx.dedupeEnums, + export: true, + // readonly: TS enum do not support the readonly modifier + }); + if (!options.ctx.injectFooter.includes(enumType)) { + options.ctx.injectFooter.push(enumType); } + const ref = ts.factory.createTypeReferenceNode(enumType.name); - return true; - }); - const enumType = tsEnum(enumName, validSchemaEnums as (string | number)[], metadata, { - shouldCache: options.ctx.dedupeEnums, - export: true, - // readonly: TS enum do not support the readonly modifier - }); - if (!options.ctx.injectFooter.includes(enumType)) { - options.ctx.injectFooter.push(enumType); + const finalType: ts.TypeNode = hasNull ? tsUnion([ref, NULL]) : ref; + + return applyAdditionalPropertiesToEnum(hasAdditionalProperties, finalType, schemaObject); + } + + const enumType = schemaObject.enum.map(tsLiteral); + if ((Array.isArray(schemaObject.type) && schemaObject.type.includes("null")) || schemaObject.nullable) { + enumType.push(NULL); } - const ref = ts.factory.createTypeReferenceNode(enumType.name); - return hasNull ? tsUnion([ref, NULL]) : ref; - } - const enumType = schemaObject.enum.map(tsLiteral); - if ((Array.isArray(schemaObject.type) && schemaObject.type.includes("null")) || schemaObject.nullable) { - enumType.push(NULL); - } - const unionType = tsUnion(enumType); - - // hoist array with valid enum values to top level if string/number enum and option is enabled - if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { - const parsed = parseRef(options.path ?? ""); - let enumValuesVariableName = parsed.pointer.join("/"); - // allow #/components/schemas to have simpler names - enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); - enumValuesVariableName = `${enumValuesVariableName}Values`; - - // build a ref path for the type that ignores union indices (anyOf/oneOf) so - // type references remain stable even when names include union positions - const cleanedPointer: string[] = []; - // Track ALL properties after a oneOf/anyOf that need Extract<> narrowing. - // We apply Extract<> before EVERY property access after a union index because: - // - When the property exists on ALL variants, Extract<> is a no-op (returns same type) - // - When the property only exists on SOME variants, it correctly narrows the union - // - When both variants have same property name but different inner schemas, - // we still narrow at each level to handle nested unions correctly - // This robust approach handles both simple and complex union structures. - const extractProperties: string[] = []; - for (let i = 0; i < parsed.pointer.length; i++) { - // Example: #/paths/analytics/data/get/responses/400/content/application/json/anyOf/0/message - const segment = parsed.pointer[i]; - if ((segment === "anyOf" || segment === "oneOf") && i < parsed.pointer.length - 1) { - const next = parsed.pointer[i + 1]; - if (/^\d+$/.test(next)) { - // If we encounter something like "anyOf/0", we want to skip that part of the path - i++; - // Collect ALL remaining segments after the union index. - // Each one will be wrapped with Extract<> to safely narrow the type - // at each level, handling both top-level and nested union variants. - const remainingSegments = parsed.pointer.slice(i + 1); - for (const seg of remainingSegments) { - // Skip union keywords and indices, only add actual property names - if (seg !== "anyOf" && seg !== "oneOf" && !/^\d+$/.test(seg)) { - extractProperties.push(seg); + const unionType = applyAdditionalPropertiesToEnum(hasAdditionalProperties, tsUnion(enumType), schemaObject); + + // hoist array with valid enum values to top level if string/number enum and option is enabled + if (options.ctx.enumValues && schemaObject.enum.every((v) => typeof v === "string" || typeof v === "number")) { + const parsed = parseRef(options.path ?? ""); + let enumValuesVariableName = parsed.pointer.join("/"); + // allow #/components/schemas to have simpler names + enumValuesVariableName = enumValuesVariableName.replace("components/schemas", ""); + enumValuesVariableName = `${enumValuesVariableName}Values`; + + // build a ref path for the type that ignores union indices (anyOf/oneOf) so + // type references remain stable even when names include union positions + const cleanedPointer: string[] = []; + // Track ALL properties after a oneOf/anyOf that need Extract<> narrowing. + // We apply Extract<> before EVERY property access after a union index because: + // - When the property exists on ALL variants, Extract<> is a no-op (returns same type) + // - When the property only exists on SOME variants, it correctly narrows the union + // - When both variants have same property name but different inner schemas, + // we still narrow at each level to handle nested unions correctly + // This robust approach handles both simple and complex union structures. + const extractProperties: string[] = []; + for (let i = 0; i < parsed.pointer.length; i++) { + // Example: #/paths/analytics/data/get/responses/400/content/application/json/anyOf/0/message + const segment = parsed.pointer[i]; + if ((segment === "anyOf" || segment === "oneOf") && i < parsed.pointer.length - 1) { + const next = parsed.pointer[i + 1]; + if (/^\d+$/.test(next)) { + // If we encounter something like "anyOf/0", we want to skip that part of the path + i++; + // Collect ALL remaining segments after the union index. + // Each one will be wrapped with Extract<> to safely narrow the type + // at each level, handling both top-level and nested union variants. + const remainingSegments = parsed.pointer.slice(i + 1); + for (const seg of remainingSegments) { + // Skip union keywords and indices, only add actual property names + if (seg !== "anyOf" && seg !== "oneOf" && !/^\d+$/.test(seg)) { + extractProperties.push(seg); + } } + continue; } - continue; } + cleanedPointer.push(segment); } - cleanedPointer.push(segment); + const cleanedRefPath = createRef(cleanedPointer); + + const enumValuesArray = tsArrayLiteralExpression( + enumValuesVariableName, + // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type + fromAdditionalProperties + ? ts.factory.createIndexedAccessTypeNode( + oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }), + ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("string")), + ) + : oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }), + schemaObject.enum as (string | number)[], + { + export: true, + readonly: true, + injectFooter: options.ctx.injectFooter, + }, + ); + + options.ctx.injectFooter.push(enumValuesArray); } - const cleanedRefPath = createRef(cleanedPointer); - - const enumValuesArray = tsArrayLiteralExpression( - enumValuesVariableName, - // If fromAdditionalProperties is true we are dealing with a record type and we should append [string] to the generated type - fromAdditionalProperties - ? ts.factory.createIndexedAccessTypeNode( - oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }), - ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("string")), - ) - : oapiRef(cleanedRefPath, undefined, { deep: true, extractProperties }), - schemaObject.enum as (string | number)[], - { - export: true, - readonly: true, - injectFooter: options.ctx.injectFooter, - }, - ); - options.ctx.injectFooter.push(enumValuesArray); + return unionType; } - - return unionType; } /** @@ -258,13 +264,7 @@ export function transformSchemaObjectWithComposition( itemType = transformSchemaObject({ ...item, required: itemRequired }, options); } - const discriminator = - ("$ref" in item && options.ctx.discriminators.objects[item.$ref]) || (item as any).discriminator; - if (discriminator) { - output.push(tsOmit(itemType, [discriminator.propertyName])); - } else { - output.push(itemType); - } + output.push(itemType); } return output; } @@ -525,7 +525,7 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor ("$defs" in schemaObject && schemaObject.$defs) ) { // properties - if (Object.keys(schemaObject.properties ?? {}).length) { + if ("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject?.properties).length) { for (const [k, v] of getEntries(schemaObject.properties ?? {}, options.ctx)) { if ((typeof v !== "object" && typeof v !== "boolean") || Array.isArray(v)) { throw new Error( @@ -609,7 +609,7 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor } // $defs - if (schemaObject.$defs && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { + if ("$defs" in schemaObject && typeof schemaObject.$defs === "object" && Object.keys(schemaObject.$defs).length) { const defKeys: ts.TypeElement[] = []; for (const [k, v] of Object.entries(schemaObject.$defs)) { const defReadOnly = "readOnly" in v && !!v.readOnly; @@ -661,8 +661,9 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor schemaObject.additionalProperties === true || (typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length === 0); + const patternProperties = hasKey(schemaObject, "patternProperties") ? schemaObject.patternProperties : undefined; const hasExplicitPatternProperties = - typeof schemaObject.patternProperties === "object" && Object.keys(schemaObject.patternProperties).length; + typeof patternProperties === "object" && patternProperties !== null && Object.keys(patternProperties).length > 0; const stringIndexTypes = []; if (hasExplicitAdditionalProperties) { stringIndexTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options, true)); @@ -670,8 +671,11 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor if (hasImplicitAdditionalProperties || (!schemaObject.additionalProperties && options.ctx.additionalProperties)) { stringIndexTypes.push(UNKNOWN); } - if (hasExplicitPatternProperties) { - for (const [_, v] of getEntries(schemaObject.patternProperties ?? {}, options.ctx)) { + if (hasExplicitPatternProperties && patternProperties && typeof patternProperties === "object") { + for (const [_, v] of getEntries( + patternProperties as Record, + options.ctx, + )) { stringIndexTypes.push(transformSchemaObject(v, options)); } } @@ -717,6 +721,19 @@ function hasKey(possibleObject: unknown, key: K): possibleObje return typeof possibleObject === "object" && possibleObject !== null && key in possibleObject; } +function applyAdditionalPropertiesToEnum( + hasAdditionalProperties: boolean, + unionType: ts.TypeNode, + schemaObject: SchemaObject, +) { + // If additionalProperties is true, add (string & {}) to the union + if (hasAdditionalProperties && schemaObject.type === "string") { + const stringAndEmptyObject = tsIntersection([STRING, ts.factory.createTypeLiteralNode([])]); + return tsUnion([unionType, stringAndEmptyObject]); + } + return unionType; +} + /** Wrap type with $Read or $Write marker when readWriteMarkers flag is enabled */ function wrapWithReadWriteMarker( type: ts.TypeNode, diff --git a/src/types.ts b/src/types.ts index 8a511e1e876827f1fa76316afe2fb34fe44dc653..d19185cc61a6ae7603fbbab300feb645e335c02a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -436,6 +436,7 @@ export type SchemaObject = { const?: unknown; default?: unknown; format?: string; + additionalProperties?: boolean | Record | SchemaObject | ReferenceObject; /** @deprecated in 3.1 (still valid for 3.0) */ nullable?: boolean; oneOf?: (SchemaObject | ReferenceObject)[];