@kubb/kit 5.14.0 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +11 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -3
- package/dist/index.d.ts +8 -3
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -73,8 +73,15 @@ var Url = class {
|
|
|
73
73
|
//#endregion
|
|
74
74
|
//#region src/macros/macroDiscriminatorEnum.ts
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
77
|
-
|
|
76
|
+
* Picks the enum primitive from the type of the first value.
|
|
77
|
+
*/
|
|
78
|
+
function enumPrimitive(values) {
|
|
79
|
+
return typeof values[0] === "number" ? "number" : typeof values[0] === "boolean" ? "boolean" : "string";
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Builds a macro that replaces a discriminator property's schema with an enum of the given
|
|
83
|
+
* values. The enum is a string, number or boolean enum, following the first value. Object schemas
|
|
84
|
+
* that lack the property are returned unchanged.
|
|
78
85
|
*
|
|
79
86
|
* @example
|
|
80
87
|
* ```ts
|
|
@@ -97,7 +104,7 @@ function macroDiscriminatorEnum({ propertyName, values, enumName }) {
|
|
|
97
104
|
...prop,
|
|
98
105
|
schema: _kubb_ast.ast.factory.createSchema({
|
|
99
106
|
type: "enum",
|
|
100
|
-
primitive:
|
|
107
|
+
primitive: enumPrimitive(values),
|
|
101
108
|
enumValues: values,
|
|
102
109
|
name: enumName,
|
|
103
110
|
readOnly: prop.schema.readOnly,
|
|
@@ -458,6 +465,7 @@ Object.defineProperty(exports, "definePlugin", {
|
|
|
458
465
|
return _kubb_core.definePlugin;
|
|
459
466
|
}
|
|
460
467
|
});
|
|
468
|
+
exports.enumPrimitive = enumPrimitive;
|
|
461
469
|
exports.enumPropName = enumPropName;
|
|
462
470
|
exports.extractRefName = extractRefName;
|
|
463
471
|
Object.defineProperty(exports, "fsStorage", {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["ast","ast","ast","ast","ast","ast","ast"],"sources":["../src/Url.ts","../src/macros/macroDiscriminatorEnum.ts","../../../internals/utils/src/casing.ts","../src/utils/refs.ts","../src/macros/macroEnumName.ts","../src/macros/macroRenameSchema.ts","../src/macros/macroSimplifyUnion.ts","../src/utils/mergeAdjacentSchemas.ts","../src/utils/schemaGraph.ts"],"sourcesContent":["/**\n * Sanitizes a parameter name so it is safe to use as a `path-to-regexp` capture name, without\n * routing through {@link camelCase} (which keeps a leading `$` since it is a valid JS identifier\n * character). Runs of disallowed characters are treated as word boundaries; a boundary at the\n * very start of the name (e.g. the `$` in `$id`) still capitalizes the word that follows it.\n */\nfunction transformPathParam(raw: string): string {\n // `path-to-regexp` (used by MSW/Express) only accepts `[A-Za-z0-9_]` in a parameter name. It stops\n // reading at the first other character (a hyphen, a dot, a `$`, ...), which misparses the route or\n // throws \"Missing parameter name\".\n if (/^[A-Za-z0-9_]+$/.test(raw)) {\n return raw\n }\n\n const startsWithSafeChar = /^[A-Za-z_]/.test(raw)\n const words = raw.split(/[^A-Za-z0-9]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const capitalize = !startsWithSafeChar || i > 0\n return capitalize ? word.charAt(0).toUpperCase() + word.slice(1) : word.charAt(0).toLowerCase() + word.slice(1)\n })\n .join('')\n}\n\n/**\n * Renders how a grouped `path` object's member is accessed: dot access for an identifier (reserved\n * words are valid property names), bracket access with the raw name otherwise.\n */\nfunction groupedAccessor(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? `.${name}` : `[${JSON.stringify(name)}]`\n}\n\n/**\n * Helpers for OpenAPI/Swagger paths, plus a thin wrapper over the native `URL`.\n */\nexport class Url {\n /**\n * Converts an OpenAPI/Swagger path to Express-style colon syntax.\n *\n * Distinct parameter names that normalize to the same identifier (e.g. `{group-id}` and\n * `{group.id}` both becoming `groupId`) are deduplicated with an incrementing suffix so\n * `path-to-regexp` never sees two identically named captures.\n *\n * @example\n * Url.toPath('/pet/{petId}') // '/pet/:petId'\n *\n * @example\n * Url.toPath('/point/{point-id}') // '/point/:pointId'\n *\n * @example\n * Url.toPath('/groups/{group-id}/{group.id}.json') // '/groups/:groupId/:groupId2.json'\n */\n static toPath(path: string): string {\n const seen = new Map<string, number>()\n\n return path.replace(/\\{([^}]+)\\}/g, (_match, param: string) => {\n const base = transformPathParam(param)\n const count = (seen.get(base) ?? 0) + 1\n seen.set(base, count)\n\n return count === 1 ? `:${base}` : `:${base}${count}`\n })\n }\n\n /**\n * Converts an OpenAPI/Swagger path to a template literal that reads each parameter off a\n * grouped `path` request option, e.g. `/pet/{petId}` becomes `` `/pet/${path.petId}` ``.\n * Parameter names are kept exactly as they appear in the OpenAPI path; a name falls back to\n * bracket access (`` path['pet-id'] ``) only when it isn't a valid JS identifier.\n * `prefix` is prepended inside the literal. Shared by generators that pass a grouped `path` object.\n *\n * @example\n * Url.toGroupedTemplateString('/pet/{petId}') // '`/pet/${path.petId}`'\n *\n * @example\n * Url.toGroupedTemplateString('/user/{monetary-account-id}') // '`/user/${path[\"monetary-account-id\"]}`'\n */\n static toGroupedTemplateString(path: string, { prefix }: { prefix?: string | null } = {}): string {\n const parts = path.split(/\\{([^}]+)\\}/)\n const result = parts.map((part, i) => (i % 2 === 0 ? part : `\\${path${groupedAccessor(part)}}`)).join('')\n\n return `\\`${prefix ?? ''}${result}\\``\n }\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n propertyName: string\n values: Array<string>\n enumName?: string\n}\n\n/**\n * Builds a macro that replaces a discriminator property's schema with a string enum of the given\n * values. Object schemas that lack the property are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroDiscriminatorEnum({ propertyName: 'type', values: ['dog', 'cat'] })\n * const next = applyMacros(objectSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroDiscriminatorEnum({ propertyName, values, enumName }: Props) {\n return ast.defineMacro({\n name: 'discriminator-enum',\n schema(node) {\n const objectNode = ast.narrowSchema(node, 'object')\n if (!objectNode?.properties?.length) return undefined\n if (!objectNode.properties.some((prop) => prop.name === propertyName)) return undefined\n\n return ast.factory.createSchema({\n ...objectNode,\n properties: objectNode.properties.map((prop) => {\n if (prop.name !== propertyName) return prop\n\n return ast.factory.createProperty({\n ...prop,\n schema: ast.factory.createSchema({\n type: 'enum',\n primitive: 'string',\n enumValues: values,\n name: enumName,\n readOnly: prop.schema.readOnly,\n writeOnly: prop.schema.writeOnly,\n }),\n })\n }),\n })\n },\n })\n}\n","type Options = {\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction convert(text: string, pascal: boolean): string {\n return text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n .split(/[\\s\\-_./\\\\:]+/)\n .filter(Boolean)\n .map((word, i) => {\n if (word.length > 1 && word === word.toUpperCase()) return word\n const head = i === 0 && !pascal ? word.charAt(0).toLowerCase() : word.charAt(0).toUpperCase()\n return head + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n// Plugins resolve the same names over and over (about 47,000 calls for a 1,000 schema spec), so\n// results are kept. Clearing at the limit bounds the memory a long-running process spends on it.\nconst cache = new Map<string, string>()\nconst cacheLimit = 10_000\n\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const key = `${pascal ? 'P' : 'c'}${text}`\n const cached = cache.get(key)\n if (cached !== undefined) return cached\n\n const result = convert(text, pascal)\n if (cache.size >= cacheLimit) cache.clear()\n cache.set(key, result)\n return result\n}\n\n/**\n * Converts `text` to camelCase.\n *\n * @example Word boundaries\n * `camelCase('hello-world') // 'helloWorld'`\n *\n * @example With a prefix\n * `camelCase('tag', { prefix: 'create' }) // 'createTag'`\n */\nexport function camelCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n *\n * @example Word boundaries\n * `pascalCase('hello-world') // 'HelloWorld'`\n *\n * @example With a suffix\n * `pascalCase('tag', { suffix: 'schema' }) // 'TagSchema'`\n */\nexport function pascalCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode, SchemaType } from '@kubb/ast'\nimport { pascalCase } from '@internals/utils'\n\nconst plainStringTypes = new Set<SchemaType>(['string', 'uuid', 'email', 'url', 'datetime'] as const)\n\n/** Returns the last path segment of a reference string, for example `'Pet'` for `#/components/schemas/Pet`. */\nexport const extractRefName = ast.refName\n\n/**\n * Builds a PascalCase child schema name by joining a parent name and property name.\n * Returns `null` when there is no parent to nest under.\n *\n * @example Nested under a parent\n * `childName('Order', 'shipping_address') // 'OrderShippingAddress'`\n *\n * @example No parent\n * `childName(undefined, 'params') // null`\n */\nexport function childName(parentName: string | null | undefined, propName: string): string | null {\n return parentName ? pascalCase([parentName, propName].join(' ')) : null\n}\n\n/**\n * Builds a PascalCase enum name from the parent name, property name, and a suffix, skipping any\n * empty parts.\n *\n * @example\n * `enumPropName('Order', 'status', 'enum') // 'OrderStatusEnum'`\n */\nexport function enumPropName(parentName: string | null | undefined, propName: string, enumSuffix: string): string {\n return pascalCase([parentName, propName, enumSuffix].filter(Boolean).join(' '))\n}\n\n/**\n * Applies `ast.mergeRefWithSchema()` to a resolved ref and rebuilds the result through\n * `ast.factory.createSchema()`. Non-ref nodes and unresolved refs are returned unchanged.\n *\n * @example\n * ```ts\n * const ref = ast.factory.createSchema({ type: 'ref', ref: '#/components/schemas/Pet', description: 'A cute pet' })\n * const merged = syncSchemaRef(ref) // merges with resolved Pet schema\n * ```\n */\nexport function syncSchemaRef(node: SchemaNode): SchemaNode {\n const ref = ast.narrowSchema(node, 'ref')\n\n if (!ref?.schema) return node\n\n return ast.factory.createSchema(ast.mergeRefWithSchema(ref))\n}\n\n/**\n * Returns `true` when a schema emits as a plain `string` type.\n *\n * Covers `string`, `uuid`, `email`, `url`, and `datetime` types. For `date` and `time`\n * types, returns `true` only when `representation` is `'string'` rather than `'date'`.\n */\nexport function isStringType(node: SchemaNode): boolean {\n if (plainStringTypes.has(node.type)) {\n return true\n }\n\n const temporal = ast.narrowSchema(node, 'date') ?? ast.narrowSchema(node, 'time')\n if (temporal) {\n return temporal.representation !== 'date'\n }\n\n return false\n}\n","import { ast } from '@kubb/ast'\nimport { enumPropName } from '../utils/refs.ts'\n\ntype Props = {\n parentName: string | null | undefined\n propName: string\n enumSuffix: string\n}\n\n/**\n * Builds a macro that names an inline enum schema from its parent and property name. Boolean enums\n * are left anonymous. Non-enum nodes are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroEnumName({ parentName: 'Pet', propName: 'status', enumSuffix: 'enum' })\n * const named = applyMacros(propSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroEnumName({ parentName, propName, enumSuffix }: Props) {\n return ast.defineMacro({\n name: 'enum-name',\n schema(node) {\n const enumNode = ast.narrowSchema(node, 'enum')\n\n if (enumNode?.primitive === 'boolean') return { ...node, name: null }\n if (enumNode) return { ...node, name: enumPropName(parentName, propName, enumSuffix) }\n\n return undefined\n },\n })\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n from: string\n to: string\n}\n\n/**\n * Builds a macro that renames a schema consistently: the declaration (`name`) and every ref\n * pointing at it (`targetName`) change together, so imports and printed references stay in\n * sync. Renaming only one side by hand produces imports for files that are never generated.\n *\n * @example\n * `const macro = macroRenameSchema({ from: 'Order', to: 'StoreOrder' })`\n */\nexport function macroRenameSchema({ from, to }: Props) {\n return ast.defineMacro({\n name: 'rename-schema',\n schema(node) {\n const refNode = ast.narrowSchema(node, 'ref')\n\n if (!refNode) {\n return node.name === from ? { ...node, name: to } : undefined\n }\n\n const renamesDeclaration = refNode.name === from\n const renamesTarget = ast.resolveRefName(refNode) === from\n if (!renamesDeclaration && !renamesTarget) return undefined\n\n return {\n ...refNode,\n ...(renamesDeclaration ? { name: to } : {}),\n ...(renamesTarget ? { targetName: to } : {}),\n }\n },\n })\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\nconst SCALAR_PRIMITIVE_TYPES = new Set<string>(['string', 'number', 'integer', 'bigint', 'boolean'])\n\n/**\n * Filters union members, dropping enum members that a broader scalar primitive already covers.\n */\nfunction simplifyUnionMembers(members: Array<SchemaNode>): Array<SchemaNode> {\n const scalarPrimitives = new Set<string>(members.filter((member) => SCALAR_PRIMITIVE_TYPES.has(member.type)).map((m) => m.type))\n if (!scalarPrimitives.size) return members\n\n return members.filter((member) => {\n const enumNode = ast.narrowSchema(member, 'enum')\n if (!enumNode) return true\n\n const primitive = enumNode.primitive\n if (!primitive) return true\n\n const enumValueCount = enumNode.namedEnumValues?.length ?? enumNode.enumValues?.length ?? 0\n if (enumValueCount <= 1) return true\n\n if (scalarPrimitives.has(primitive)) return false\n if ((primitive === 'integer' || primitive === 'number') && (scalarPrimitives.has('integer') || scalarPrimitives.has('number'))) return false\n\n return true\n })\n}\n\n/**\n * Removes union members a broader scalar primitive already covers, such as a multi-value string enum\n * sitting next to a plain `string`. Single-value enums are kept.\n *\n * @example\n * ```ts\n * const next = applyMacros(unionSchema, [macroSimplifyUnion], { depth: 'shallow' })\n * ```\n */\nexport const macroSimplifyUnion = ast.defineMacro({\n name: 'simplify-union',\n schema(node) {\n const unionNode = ast.narrowSchema(node, 'union')\n if (!unionNode?.members?.length) return undefined\n\n const simplified = simplifyUnionMembers(unionNode.members)\n if (simplified.length === unionNode.members.length) return undefined\n\n return { ...unionNode, members: simplified }\n },\n})\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Merges a run of adjacent anonymous object members into one. Named or non-object members break the\n * run and pass through unchanged. The merge follows member order, so callers control which members\n * combine by where they place them in the sequence.\n *\n * @example\n * ```ts\n * const merged = [...mergeAdjacentObjectsLazy([objectA, objectB])]\n * ```\n */\nexport function* mergeAdjacentObjectsLazy(members: Iterable<SchemaNode>): Generator<SchemaNode, void, undefined> {\n let acc: SchemaNode | undefined\n\n for (const member of members) {\n const objectMember = ast.narrowSchema(member, 'object')\n if (objectMember && !objectMember.name && acc !== undefined) {\n const accObject = ast.narrowSchema(acc, 'object')\n if (accObject && !accObject.name) {\n acc = ast.factory.createSchema({\n ...accObject,\n properties: [...(accObject.properties ?? []), ...(objectMember.properties ?? [])],\n })\n continue\n }\n }\n if (acc !== undefined) yield acc\n acc = member\n }\n\n if (acc !== undefined) yield acc\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Returns `true` when a schema, or anything nested inside it, references a circular schema.\n *\n * Pass `excludeName` to skip refs to a specific schema, which helps when self-references are handled\n * on their own. Pair it with `ast.findCircularSchemas()` to decide where lazy wrappers go.\n *\n * @note Reads the memoized `ast.collectSchemaRefs()` set, so a schema is scanned once across plugins.\n */\nexport function containsCircularRef(\n node: SchemaNode | undefined,\n { circularSchemas, excludeName }: { circularSchemas: ReadonlySet<string>; excludeName?: string },\n): boolean {\n if (!node || circularSchemas.size === 0) return false\n\n for (const name of ast.collectSchemaRefs(node)) {\n if (name !== excludeName && circularSchemas.has(name)) return true\n }\n\n return false\n}\n"],"mappings":";;;;;;;;;;;AAMA,SAAS,mBAAmB,KAAqB;CAI/C,IAAI,kBAAkB,KAAK,GAAG,GAC5B,OAAO;CAGT,MAAM,qBAAqB,aAAa,KAAK,GAAG;CAGhD,OAFc,IAAI,MAAM,eAAe,CAAC,CAAC,OAAO,OAErC,CAAC,CACT,KAAK,MAAM,MAAM;EAEhB,OADmB,CAAC,sBAAsB,IAAI,IAC1B,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC;CAChH,CAAC,CAAC,CACD,KAAK,EAAE;AACZ;;;;;AAMA,SAAS,gBAAgB,MAAsB;CAC7C,OAAO,6BAA6B,KAAK,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,UAAU,IAAI,EAAE;AACzF;;;;AAKA,IAAa,MAAb,MAAiB;;;;;;;;;;;;;;;;;CAiBf,OAAO,OAAO,MAAsB;EAClC,MAAM,uBAAO,IAAI,IAAoB;EAErC,OAAO,KAAK,QAAQ,iBAAiB,QAAQ,UAAkB;GAC7D,MAAM,OAAO,mBAAmB,KAAK;GACrC,MAAM,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK;GACtC,KAAK,IAAI,MAAM,KAAK;GAEpB,OAAO,UAAU,IAAI,IAAI,SAAS,IAAI,OAAO;EAC/C,CAAC;CACH;;;;;;;;;;;;;;CAeA,OAAO,wBAAwB,MAAc,EAAE,WAAuC,CAAC,GAAW;EAEhG,MAAM,SADQ,KAAK,MAAM,aACN,CAAC,CAAC,KAAK,MAAM,MAAO,IAAI,MAAM,IAAI,OAAO,UAAU,gBAAgB,IAAI,EAAE,EAAG,CAAC,CAAC,KAAK,EAAE;EAExG,OAAO,KAAK,UAAU,KAAK,OAAO;CACpC;AACF;;;;;;;;;;;;;AClEA,SAAgB,uBAAuB,EAAE,cAAc,QAAQ,YAAmB;CAChF,OAAOA,UAAAA,IAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,aAAaA,UAAAA,IAAI,aAAa,MAAM,QAAQ;GAClD,IAAI,CAAC,YAAY,YAAY,QAAQ,OAAO,KAAA;GAC5C,IAAI,CAAC,WAAW,WAAW,MAAM,SAAS,KAAK,SAAS,YAAY,GAAG,OAAO,KAAA;GAE9E,OAAOA,UAAAA,IAAI,QAAQ,aAAa;IAC9B,GAAG;IACH,YAAY,WAAW,WAAW,KAAK,SAAS;KAC9C,IAAI,KAAK,SAAS,cAAc,OAAO;KAEvC,OAAOA,UAAAA,IAAI,QAAQ,eAAe;MAChC,GAAG;MACH,QAAQA,UAAAA,IAAI,QAAQ,aAAa;OAC/B,MAAM;OACN,WAAW;OACX,YAAY;OACZ,MAAM;OACN,UAAU,KAAK,OAAO;OACtB,WAAW,KAAK,OAAO;MACzB,CAAC;KACH,CAAC;IACH,CAAC;GACH,CAAC;EACH;CACF,CAAC;AACH;;;;;;;;;;AC5BA,SAAS,QAAQ,MAAc,QAAyB;CACtD,OAAO,KACJ,KAAK,CAAC,CACN,QAAQ,qBAAqB,OAAO,CAAC,CACrC,QAAQ,yBAAyB,OAAO,CAAC,CACzC,QAAQ,gBAAgB,OAAO,CAAC,CAChC,MAAM,eAAe,CAAC,CACtB,OAAO,OAAO,CAAC,CACf,KAAK,MAAM,MAAM;EAChB,IAAI,KAAK,SAAS,KAAK,SAAS,KAAK,YAAY,GAAG,OAAO;EAE3D,QADa,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,KAC9E,KAAK,MAAM,CAAC;CAC5B,CAAC,CAAC,CACD,KAAK,EAAE,CAAC,CACR,QAAQ,iBAAiB,EAAE;AAChC;AAIA,MAAM,wBAAQ,IAAI,IAAoB;AACtC,MAAM,aAAa;AAEnB,SAAS,gBAAgB,MAAc,QAAyB;CAC9D,MAAM,MAAM,GAAG,SAAS,MAAM,MAAM;CACpC,MAAM,SAAS,MAAM,IAAI,GAAG;CAC5B,IAAI,WAAW,KAAA,GAAW,OAAO;CAEjC,MAAM,SAAS,QAAQ,MAAM,MAAM;CACnC,IAAI,MAAM,QAAQ,YAAY,MAAM,MAAM;CAC1C,MAAM,IAAI,KAAK,MAAM;CACrB,OAAO;AACT;;;;;;;;;;AAwBA,SAAgB,WAAW,MAAc,EAAE,SAAS,IAAI,SAAS,OAAgB,CAAC,GAAW;CAC3F,OAAO,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,IAAI;AAC5D;;;ACvEA,MAAM,mCAAmB,IAAI,IAAgB;CAAC;CAAU;CAAQ;CAAS;CAAO;AAAU,CAAU;;AAGpG,MAAa,iBAAiBC,UAAAA,IAAI;;;;;;;;;;;AAYlC,SAAgB,UAAU,YAAuC,UAAiC;CAChG,OAAO,aAAa,WAAW,CAAC,YAAY,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI;AACrE;;;;;;;;AASA,SAAgB,aAAa,YAAuC,UAAkB,YAA4B;CAChH,OAAO,WAAW;EAAC;EAAY;EAAU;CAAU,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;AAChF;;;;;;;;;;;AAYA,SAAgB,cAAc,MAA8B;CAC1D,MAAM,MAAMA,UAAAA,IAAI,aAAa,MAAM,KAAK;CAExC,IAAI,CAAC,KAAK,QAAQ,OAAO;CAEzB,OAAOA,UAAAA,IAAI,QAAQ,aAAaA,UAAAA,IAAI,mBAAmB,GAAG,CAAC;AAC7D;;;;;;;AAQA,SAAgB,aAAa,MAA2B;CACtD,IAAI,iBAAiB,IAAI,KAAK,IAAI,GAChC,OAAO;CAGT,MAAM,WAAWA,UAAAA,IAAI,aAAa,MAAM,MAAM,KAAKA,UAAAA,IAAI,aAAa,MAAM,MAAM;CAChF,IAAI,UACF,OAAO,SAAS,mBAAmB;CAGrC,OAAO;AACT;;;;;;;;;;;;;AClDA,SAAgB,cAAc,EAAE,YAAY,UAAU,cAAqB;CACzE,OAAOC,UAAAA,IAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,WAAWA,UAAAA,IAAI,aAAa,MAAM,MAAM;GAE9C,IAAI,UAAU,cAAc,WAAW,OAAO;IAAE,GAAG;IAAM,MAAM;GAAK;GACpE,IAAI,UAAU,OAAO;IAAE,GAAG;IAAM,MAAM,aAAa,YAAY,UAAU,UAAU;GAAE;EAGvF;CACF,CAAC;AACH;;;;;;;;;;;AChBA,SAAgB,kBAAkB,EAAE,MAAM,MAAa;CACrD,OAAOC,UAAAA,IAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,UAAUA,UAAAA,IAAI,aAAa,MAAM,KAAK;GAE5C,IAAI,CAAC,SACH,OAAO,KAAK,SAAS,OAAO;IAAE,GAAG;IAAM,MAAM;GAAG,IAAI,KAAA;GAGtD,MAAM,qBAAqB,QAAQ,SAAS;GAC5C,MAAM,gBAAgBA,UAAAA,IAAI,eAAe,OAAO,MAAM;GACtD,IAAI,CAAC,sBAAsB,CAAC,eAAe,OAAO,KAAA;GAElD,OAAO;IACL,GAAG;IACH,GAAI,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,GAAI,gBAAgB,EAAE,YAAY,GAAG,IAAI,CAAC;GAC5C;EACF;CACF,CAAC;AACH;;;ACjCA,MAAM,yCAAyB,IAAI,IAAY;CAAC;CAAU;CAAU;CAAW;CAAU;AAAS,CAAC;;;;AAKnG,SAAS,qBAAqB,SAA+C;CAC3E,MAAM,mBAAmB,IAAI,IAAY,QAAQ,QAAQ,WAAW,uBAAuB,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI,CAAC;CAC/H,IAAI,CAAC,iBAAiB,MAAM,OAAO;CAEnC,OAAO,QAAQ,QAAQ,WAAW;EAChC,MAAM,WAAWC,UAAAA,IAAI,aAAa,QAAQ,MAAM;EAChD,IAAI,CAAC,UAAU,OAAO;EAEtB,MAAM,YAAY,SAAS;EAC3B,IAAI,CAAC,WAAW,OAAO;EAGvB,KADuB,SAAS,iBAAiB,UAAU,SAAS,YAAY,UAAU,MACpE,GAAG,OAAO;EAEhC,IAAI,iBAAiB,IAAI,SAAS,GAAG,OAAO;EAC5C,KAAK,cAAc,aAAa,cAAc,cAAc,iBAAiB,IAAI,SAAS,KAAK,iBAAiB,IAAI,QAAQ,IAAI,OAAO;EAEvI,OAAO;CACT,CAAC;AACH;;;;;;;;;;AAWA,MAAa,qBAAqBA,UAAAA,IAAI,YAAY;CAChD,MAAM;CACN,OAAO,MAAM;EACX,MAAM,YAAYA,UAAAA,IAAI,aAAa,MAAM,OAAO;EAChD,IAAI,CAAC,WAAW,SAAS,QAAQ,OAAO,KAAA;EAExC,MAAM,aAAa,qBAAqB,UAAU,OAAO;EACzD,IAAI,WAAW,WAAW,UAAU,QAAQ,QAAQ,OAAO,KAAA;EAE3D,OAAO;GAAE,GAAG;GAAW,SAAS;EAAW;CAC7C;AACF,CAAC;;;;;;;;;;;;;ACpCD,UAAiB,yBAAyB,SAAuE;CAC/G,IAAI;CAEJ,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,eAAeC,UAAAA,IAAI,aAAa,QAAQ,QAAQ;EACtD,IAAI,gBAAgB,CAAC,aAAa,QAAQ,QAAQ,KAAA,GAAW;GAC3D,MAAM,YAAYA,UAAAA,IAAI,aAAa,KAAK,QAAQ;GAChD,IAAI,aAAa,CAAC,UAAU,MAAM;IAChC,MAAMA,UAAAA,IAAI,QAAQ,aAAa;KAC7B,GAAG;KACH,YAAY,CAAC,GAAI,UAAU,cAAc,CAAC,GAAI,GAAI,aAAa,cAAc,CAAC,CAAE;IAClF,CAAC;IACD;GACF;EACF;EACA,IAAI,QAAQ,KAAA,GAAW,MAAM;EAC7B,MAAM;CACR;CAEA,IAAI,QAAQ,KAAA,GAAW,MAAM;AAC/B;;;;;;;;;;;ACtBA,SAAgB,oBACd,MACA,EAAE,iBAAiB,eACV;CACT,IAAI,CAAC,QAAQ,gBAAgB,SAAS,GAAG,OAAO;CAEhD,KAAK,MAAM,QAAQC,UAAAA,IAAI,kBAAkB,IAAI,GAC3C,IAAI,SAAS,eAAe,gBAAgB,IAAI,IAAI,GAAG,OAAO;CAGhE,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["ast","ast","ast","ast","ast","ast","ast"],"sources":["../src/Url.ts","../src/macros/macroDiscriminatorEnum.ts","../../../internals/utils/src/casing.ts","../src/utils/refs.ts","../src/macros/macroEnumName.ts","../src/macros/macroRenameSchema.ts","../src/macros/macroSimplifyUnion.ts","../src/utils/mergeAdjacentSchemas.ts","../src/utils/schemaGraph.ts"],"sourcesContent":["/**\n * Sanitizes a parameter name so it is safe to use as a `path-to-regexp` capture name, without\n * routing through {@link camelCase} (which keeps a leading `$` since it is a valid JS identifier\n * character). Runs of disallowed characters are treated as word boundaries; a boundary at the\n * very start of the name (e.g. the `$` in `$id`) still capitalizes the word that follows it.\n */\nfunction transformPathParam(raw: string): string {\n // `path-to-regexp` (used by MSW/Express) only accepts `[A-Za-z0-9_]` in a parameter name. It stops\n // reading at the first other character (a hyphen, a dot, a `$`, ...), which misparses the route or\n // throws \"Missing parameter name\".\n if (/^[A-Za-z0-9_]+$/.test(raw)) {\n return raw\n }\n\n const startsWithSafeChar = /^[A-Za-z_]/.test(raw)\n const words = raw.split(/[^A-Za-z0-9]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const capitalize = !startsWithSafeChar || i > 0\n return capitalize ? word.charAt(0).toUpperCase() + word.slice(1) : word.charAt(0).toLowerCase() + word.slice(1)\n })\n .join('')\n}\n\n/**\n * Renders how a grouped `path` object's member is accessed: dot access for an identifier (reserved\n * words are valid property names), bracket access with the raw name otherwise.\n */\nfunction groupedAccessor(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? `.${name}` : `[${JSON.stringify(name)}]`\n}\n\n/**\n * Helpers for OpenAPI/Swagger paths, plus a thin wrapper over the native `URL`.\n */\nexport class Url {\n /**\n * Converts an OpenAPI/Swagger path to Express-style colon syntax.\n *\n * Distinct parameter names that normalize to the same identifier (e.g. `{group-id}` and\n * `{group.id}` both becoming `groupId`) are deduplicated with an incrementing suffix so\n * `path-to-regexp` never sees two identically named captures.\n *\n * @example\n * Url.toPath('/pet/{petId}') // '/pet/:petId'\n *\n * @example\n * Url.toPath('/point/{point-id}') // '/point/:pointId'\n *\n * @example\n * Url.toPath('/groups/{group-id}/{group.id}.json') // '/groups/:groupId/:groupId2.json'\n */\n static toPath(path: string): string {\n const seen = new Map<string, number>()\n\n return path.replace(/\\{([^}]+)\\}/g, (_match, param: string) => {\n const base = transformPathParam(param)\n const count = (seen.get(base) ?? 0) + 1\n seen.set(base, count)\n\n return count === 1 ? `:${base}` : `:${base}${count}`\n })\n }\n\n /**\n * Converts an OpenAPI/Swagger path to a template literal that reads each parameter off a\n * grouped `path` request option, e.g. `/pet/{petId}` becomes `` `/pet/${path.petId}` ``.\n * Parameter names are kept exactly as they appear in the OpenAPI path; a name falls back to\n * bracket access (`` path['pet-id'] ``) only when it isn't a valid JS identifier.\n * `prefix` is prepended inside the literal. Shared by generators that pass a grouped `path` object.\n *\n * @example\n * Url.toGroupedTemplateString('/pet/{petId}') // '`/pet/${path.petId}`'\n *\n * @example\n * Url.toGroupedTemplateString('/user/{monetary-account-id}') // '`/user/${path[\"monetary-account-id\"]}`'\n */\n static toGroupedTemplateString(path: string, { prefix }: { prefix?: string | null } = {}): string {\n const parts = path.split(/\\{([^}]+)\\}/)\n const result = parts.map((part, i) => (i % 2 === 0 ? part : `\\${path${groupedAccessor(part)}}`)).join('')\n\n return `\\`${prefix ?? ''}${result}\\``\n }\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n propertyName: string\n values: Array<string | number | boolean>\n enumName?: string\n}\n\n/**\n * Picks the enum primitive from the type of the first value.\n */\nexport function enumPrimitive(values: Props['values']): 'string' | 'number' | 'boolean' {\n return typeof values[0] === 'number' ? 'number' : typeof values[0] === 'boolean' ? 'boolean' : 'string'\n}\n\n/**\n * Builds a macro that replaces a discriminator property's schema with an enum of the given\n * values. The enum is a string, number or boolean enum, following the first value. Object schemas\n * that lack the property are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroDiscriminatorEnum({ propertyName: 'type', values: ['dog', 'cat'] })\n * const next = applyMacros(objectSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroDiscriminatorEnum({ propertyName, values, enumName }: Props) {\n return ast.defineMacro({\n name: 'discriminator-enum',\n schema(node) {\n const objectNode = ast.narrowSchema(node, 'object')\n if (!objectNode?.properties?.length) return undefined\n if (!objectNode.properties.some((prop) => prop.name === propertyName)) return undefined\n\n return ast.factory.createSchema({\n ...objectNode,\n properties: objectNode.properties.map((prop) => {\n if (prop.name !== propertyName) return prop\n\n return ast.factory.createProperty({\n ...prop,\n schema: ast.factory.createSchema({\n type: 'enum',\n primitive: enumPrimitive(values),\n enumValues: values,\n name: enumName,\n readOnly: prop.schema.readOnly,\n writeOnly: prop.schema.writeOnly,\n }),\n })\n }),\n })\n },\n })\n}\n","type Options = {\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction convert(text: string, pascal: boolean): string {\n return text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n .split(/[\\s\\-_./\\\\:]+/)\n .filter(Boolean)\n .map((word, i) => {\n if (word.length > 1 && word === word.toUpperCase()) return word\n const head = i === 0 && !pascal ? word.charAt(0).toLowerCase() : word.charAt(0).toUpperCase()\n return head + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n// Plugins resolve the same names over and over (about 47,000 calls for a 1,000 schema spec), so\n// results are kept. Clearing at the limit bounds the memory a long-running process spends on it.\nconst cache = new Map<string, string>()\nconst cacheLimit = 10_000\n\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const key = `${pascal ? 'P' : 'c'}${text}`\n const cached = cache.get(key)\n if (cached !== undefined) return cached\n\n const result = convert(text, pascal)\n if (cache.size >= cacheLimit) cache.clear()\n cache.set(key, result)\n return result\n}\n\n/**\n * Converts `text` to camelCase.\n *\n * @example Word boundaries\n * `camelCase('hello-world') // 'helloWorld'`\n *\n * @example With a prefix\n * `camelCase('tag', { prefix: 'create' }) // 'createTag'`\n */\nexport function camelCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n *\n * @example Word boundaries\n * `pascalCase('hello-world') // 'HelloWorld'`\n *\n * @example With a suffix\n * `pascalCase('tag', { suffix: 'schema' }) // 'TagSchema'`\n */\nexport function pascalCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode, SchemaType } from '@kubb/ast'\nimport { pascalCase } from '@internals/utils'\n\nconst plainStringTypes = new Set<SchemaType>(['string', 'uuid', 'email', 'url', 'datetime'] as const)\n\n/** Returns the last path segment of a reference string, for example `'Pet'` for `#/components/schemas/Pet`. */\nexport const extractRefName = ast.refName\n\n/**\n * Builds a PascalCase child schema name by joining a parent name and property name.\n * Returns `null` when there is no parent to nest under.\n *\n * @example Nested under a parent\n * `childName('Order', 'shipping_address') // 'OrderShippingAddress'`\n *\n * @example No parent\n * `childName(undefined, 'params') // null`\n */\nexport function childName(parentName: string | null | undefined, propName: string): string | null {\n return parentName ? pascalCase([parentName, propName].join(' ')) : null\n}\n\n/**\n * Builds a PascalCase enum name from the parent name, property name, and a suffix, skipping any\n * empty parts.\n *\n * @example\n * `enumPropName('Order', 'status', 'enum') // 'OrderStatusEnum'`\n */\nexport function enumPropName(parentName: string | null | undefined, propName: string, enumSuffix: string): string {\n return pascalCase([parentName, propName, enumSuffix].filter(Boolean).join(' '))\n}\n\n/**\n * Applies `ast.mergeRefWithSchema()` to a resolved ref and rebuilds the result through\n * `ast.factory.createSchema()`. Non-ref nodes and unresolved refs are returned unchanged.\n *\n * @example\n * ```ts\n * const ref = ast.factory.createSchema({ type: 'ref', ref: '#/components/schemas/Pet', description: 'A cute pet' })\n * const merged = syncSchemaRef(ref) // merges with resolved Pet schema\n * ```\n */\nexport function syncSchemaRef(node: SchemaNode): SchemaNode {\n const ref = ast.narrowSchema(node, 'ref')\n\n if (!ref?.schema) return node\n\n return ast.factory.createSchema(ast.mergeRefWithSchema(ref))\n}\n\n/**\n * Returns `true` when a schema emits as a plain `string` type.\n *\n * Covers `string`, `uuid`, `email`, `url`, and `datetime` types. For `date` and `time`\n * types, returns `true` only when `representation` is `'string'` rather than `'date'`.\n */\nexport function isStringType(node: SchemaNode): boolean {\n if (plainStringTypes.has(node.type)) {\n return true\n }\n\n const temporal = ast.narrowSchema(node, 'date') ?? ast.narrowSchema(node, 'time')\n if (temporal) {\n return temporal.representation !== 'date'\n }\n\n return false\n}\n","import { ast } from '@kubb/ast'\nimport { enumPropName } from '../utils/refs.ts'\n\ntype Props = {\n parentName: string | null | undefined\n propName: string\n enumSuffix: string\n}\n\n/**\n * Builds a macro that names an inline enum schema from its parent and property name. Boolean enums\n * are left anonymous. Non-enum nodes are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroEnumName({ parentName: 'Pet', propName: 'status', enumSuffix: 'enum' })\n * const named = applyMacros(propSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroEnumName({ parentName, propName, enumSuffix }: Props) {\n return ast.defineMacro({\n name: 'enum-name',\n schema(node) {\n const enumNode = ast.narrowSchema(node, 'enum')\n\n if (enumNode?.primitive === 'boolean') return { ...node, name: null }\n if (enumNode) return { ...node, name: enumPropName(parentName, propName, enumSuffix) }\n\n return undefined\n },\n })\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n from: string\n to: string\n}\n\n/**\n * Builds a macro that renames a schema consistently: the declaration (`name`) and every ref\n * pointing at it (`targetName`) change together, so imports and printed references stay in\n * sync. Renaming only one side by hand produces imports for files that are never generated.\n *\n * @example\n * `const macro = macroRenameSchema({ from: 'Order', to: 'StoreOrder' })`\n */\nexport function macroRenameSchema({ from, to }: Props) {\n return ast.defineMacro({\n name: 'rename-schema',\n schema(node) {\n const refNode = ast.narrowSchema(node, 'ref')\n\n if (!refNode) {\n return node.name === from ? { ...node, name: to } : undefined\n }\n\n const renamesDeclaration = refNode.name === from\n const renamesTarget = ast.resolveRefName(refNode) === from\n if (!renamesDeclaration && !renamesTarget) return undefined\n\n return {\n ...refNode,\n ...(renamesDeclaration ? { name: to } : {}),\n ...(renamesTarget ? { targetName: to } : {}),\n }\n },\n })\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\nconst SCALAR_PRIMITIVE_TYPES = new Set<string>(['string', 'number', 'integer', 'bigint', 'boolean'])\n\n/**\n * Filters union members, dropping enum members that a broader scalar primitive already covers.\n */\nfunction simplifyUnionMembers(members: Array<SchemaNode>): Array<SchemaNode> {\n const scalarPrimitives = new Set<string>(members.filter((member) => SCALAR_PRIMITIVE_TYPES.has(member.type)).map((m) => m.type))\n if (!scalarPrimitives.size) return members\n\n return members.filter((member) => {\n const enumNode = ast.narrowSchema(member, 'enum')\n if (!enumNode) return true\n\n const primitive = enumNode.primitive\n if (!primitive) return true\n\n const enumValueCount = enumNode.namedEnumValues?.length ?? enumNode.enumValues?.length ?? 0\n if (enumValueCount <= 1) return true\n\n if (scalarPrimitives.has(primitive)) return false\n if ((primitive === 'integer' || primitive === 'number') && (scalarPrimitives.has('integer') || scalarPrimitives.has('number'))) return false\n\n return true\n })\n}\n\n/**\n * Removes union members a broader scalar primitive already covers, such as a multi-value string enum\n * sitting next to a plain `string`. Single-value enums are kept.\n *\n * @example\n * ```ts\n * const next = applyMacros(unionSchema, [macroSimplifyUnion], { depth: 'shallow' })\n * ```\n */\nexport const macroSimplifyUnion = ast.defineMacro({\n name: 'simplify-union',\n schema(node) {\n const unionNode = ast.narrowSchema(node, 'union')\n if (!unionNode?.members?.length) return undefined\n\n const simplified = simplifyUnionMembers(unionNode.members)\n if (simplified.length === unionNode.members.length) return undefined\n\n return { ...unionNode, members: simplified }\n },\n})\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Merges a run of adjacent anonymous object members into one. Named or non-object members break the\n * run and pass through unchanged. The merge follows member order, so callers control which members\n * combine by where they place them in the sequence.\n *\n * @example\n * ```ts\n * const merged = [...mergeAdjacentObjectsLazy([objectA, objectB])]\n * ```\n */\nexport function* mergeAdjacentObjectsLazy(members: Iterable<SchemaNode>): Generator<SchemaNode, void, undefined> {\n let acc: SchemaNode | undefined\n\n for (const member of members) {\n const objectMember = ast.narrowSchema(member, 'object')\n if (objectMember && !objectMember.name && acc !== undefined) {\n const accObject = ast.narrowSchema(acc, 'object')\n if (accObject && !accObject.name) {\n acc = ast.factory.createSchema({\n ...accObject,\n properties: [...(accObject.properties ?? []), ...(objectMember.properties ?? [])],\n })\n continue\n }\n }\n if (acc !== undefined) yield acc\n acc = member\n }\n\n if (acc !== undefined) yield acc\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Returns `true` when a schema, or anything nested inside it, references a circular schema.\n *\n * Pass `excludeName` to skip refs to a specific schema, which helps when self-references are handled\n * on their own. Pair it with `ast.findCircularSchemas()` to decide where lazy wrappers go.\n *\n * @note Reads the memoized `ast.collectSchemaRefs()` set, so a schema is scanned once across plugins.\n */\nexport function containsCircularRef(\n node: SchemaNode | undefined,\n { circularSchemas, excludeName }: { circularSchemas: ReadonlySet<string>; excludeName?: string },\n): boolean {\n if (!node || circularSchemas.size === 0) return false\n\n for (const name of ast.collectSchemaRefs(node)) {\n if (name !== excludeName && circularSchemas.has(name)) return true\n }\n\n return false\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -43,12 +43,17 @@ export declare class Url {
|
|
|
43
43
|
//#region src/macros/macroDiscriminatorEnum.d.ts
|
|
44
44
|
type Props$2 = {
|
|
45
45
|
propertyName: string;
|
|
46
|
-
values: Array<string>;
|
|
46
|
+
values: Array<string | number | boolean>;
|
|
47
47
|
enumName?: string;
|
|
48
48
|
};
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
51
|
-
|
|
50
|
+
* Picks the enum primitive from the type of the first value.
|
|
51
|
+
*/
|
|
52
|
+
export declare function enumPrimitive(values: Props$2['values']): 'string' | 'number' | 'boolean';
|
|
53
|
+
/**
|
|
54
|
+
* Builds a macro that replaces a discriminator property's schema with an enum of the given
|
|
55
|
+
* values. The enum is a string, number or boolean enum, following the first value. Object schemas
|
|
56
|
+
* that lack the property are returned unchanged.
|
|
52
57
|
*
|
|
53
58
|
* @example
|
|
54
59
|
* ```ts
|
package/dist/index.d.ts
CHANGED
|
@@ -43,12 +43,17 @@ export declare class Url {
|
|
|
43
43
|
//#region src/macros/macroDiscriminatorEnum.d.ts
|
|
44
44
|
type Props$2 = {
|
|
45
45
|
propertyName: string;
|
|
46
|
-
values: Array<string>;
|
|
46
|
+
values: Array<string | number | boolean>;
|
|
47
47
|
enumName?: string;
|
|
48
48
|
};
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
51
|
-
|
|
50
|
+
* Picks the enum primitive from the type of the first value.
|
|
51
|
+
*/
|
|
52
|
+
export declare function enumPrimitive(values: Props$2['values']): 'string' | 'number' | 'boolean';
|
|
53
|
+
/**
|
|
54
|
+
* Builds a macro that replaces a discriminator property's schema with an enum of the given
|
|
55
|
+
* values. The enum is a string, number or boolean enum, following the first value. Object schemas
|
|
56
|
+
* that lack the property are returned unchanged.
|
|
52
57
|
*
|
|
53
58
|
* @example
|
|
54
59
|
* ```ts
|
package/dist/index.js
CHANGED
|
@@ -72,8 +72,15 @@ var Url = class {
|
|
|
72
72
|
//#endregion
|
|
73
73
|
//#region src/macros/macroDiscriminatorEnum.ts
|
|
74
74
|
/**
|
|
75
|
-
*
|
|
76
|
-
|
|
75
|
+
* Picks the enum primitive from the type of the first value.
|
|
76
|
+
*/
|
|
77
|
+
function enumPrimitive(values) {
|
|
78
|
+
return typeof values[0] === "number" ? "number" : typeof values[0] === "boolean" ? "boolean" : "string";
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Builds a macro that replaces a discriminator property's schema with an enum of the given
|
|
82
|
+
* values. The enum is a string, number or boolean enum, following the first value. Object schemas
|
|
83
|
+
* that lack the property are returned unchanged.
|
|
77
84
|
*
|
|
78
85
|
* @example
|
|
79
86
|
* ```ts
|
|
@@ -96,7 +103,7 @@ function macroDiscriminatorEnum({ propertyName, values, enumName }) {
|
|
|
96
103
|
...prop,
|
|
97
104
|
schema: ast$1.factory.createSchema({
|
|
98
105
|
type: "enum",
|
|
99
|
-
primitive:
|
|
106
|
+
primitive: enumPrimitive(values),
|
|
100
107
|
enumValues: values,
|
|
101
108
|
name: enumName,
|
|
102
109
|
readOnly: prop.schema.readOnly,
|
|
@@ -364,6 +371,6 @@ function containsCircularRef(node, { circularSchemas, excludeName }) {
|
|
|
364
371
|
return false;
|
|
365
372
|
}
|
|
366
373
|
//#endregion
|
|
367
|
-
export { Diagnostics, Hookable, Resolver, Url, addGenerator, addMacro, assertPluginOption, ast, childName, containsCircularRef, createAdapter, createRenderer, createResolver, createStorage, defineExtension, defineGenerator, defineParser, definePlugin, enumPropName, extractRefName, fsStorage, injectFile, isExtensionManifest, isStringType, kubbContext, macroDiscriminatorEnum, macroEnumName, macroRenameSchema, macroSimplifyUnion, manifestProblems, memoryStorage, mergeAdjacentObjectsLazy, requirePlugin, setMacros, setOptions, setResolver, syncSchemaRef, tryUseKubb, useConfig, useKubb, useOptions };
|
|
374
|
+
export { Diagnostics, Hookable, Resolver, Url, addGenerator, addMacro, assertPluginOption, ast, childName, containsCircularRef, createAdapter, createRenderer, createResolver, createStorage, defineExtension, defineGenerator, defineParser, definePlugin, enumPrimitive, enumPropName, extractRefName, fsStorage, injectFile, isExtensionManifest, isStringType, kubbContext, macroDiscriminatorEnum, macroEnumName, macroRenameSchema, macroSimplifyUnion, manifestProblems, memoryStorage, mergeAdjacentObjectsLazy, requirePlugin, setMacros, setOptions, setResolver, syncSchemaRef, tryUseKubb, useConfig, useKubb, useOptions };
|
|
368
375
|
|
|
369
376
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["ast","ast","ast","ast","ast","ast","ast"],"sources":["../src/Url.ts","../src/macros/macroDiscriminatorEnum.ts","../../../internals/utils/src/casing.ts","../src/utils/refs.ts","../src/macros/macroEnumName.ts","../src/macros/macroRenameSchema.ts","../src/macros/macroSimplifyUnion.ts","../src/utils/mergeAdjacentSchemas.ts","../src/utils/schemaGraph.ts"],"sourcesContent":["/**\n * Sanitizes a parameter name so it is safe to use as a `path-to-regexp` capture name, without\n * routing through {@link camelCase} (which keeps a leading `$` since it is a valid JS identifier\n * character). Runs of disallowed characters are treated as word boundaries; a boundary at the\n * very start of the name (e.g. the `$` in `$id`) still capitalizes the word that follows it.\n */\nfunction transformPathParam(raw: string): string {\n // `path-to-regexp` (used by MSW/Express) only accepts `[A-Za-z0-9_]` in a parameter name. It stops\n // reading at the first other character (a hyphen, a dot, a `$`, ...), which misparses the route or\n // throws \"Missing parameter name\".\n if (/^[A-Za-z0-9_]+$/.test(raw)) {\n return raw\n }\n\n const startsWithSafeChar = /^[A-Za-z_]/.test(raw)\n const words = raw.split(/[^A-Za-z0-9]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const capitalize = !startsWithSafeChar || i > 0\n return capitalize ? word.charAt(0).toUpperCase() + word.slice(1) : word.charAt(0).toLowerCase() + word.slice(1)\n })\n .join('')\n}\n\n/**\n * Renders how a grouped `path` object's member is accessed: dot access for an identifier (reserved\n * words are valid property names), bracket access with the raw name otherwise.\n */\nfunction groupedAccessor(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? `.${name}` : `[${JSON.stringify(name)}]`\n}\n\n/**\n * Helpers for OpenAPI/Swagger paths, plus a thin wrapper over the native `URL`.\n */\nexport class Url {\n /**\n * Converts an OpenAPI/Swagger path to Express-style colon syntax.\n *\n * Distinct parameter names that normalize to the same identifier (e.g. `{group-id}` and\n * `{group.id}` both becoming `groupId`) are deduplicated with an incrementing suffix so\n * `path-to-regexp` never sees two identically named captures.\n *\n * @example\n * Url.toPath('/pet/{petId}') // '/pet/:petId'\n *\n * @example\n * Url.toPath('/point/{point-id}') // '/point/:pointId'\n *\n * @example\n * Url.toPath('/groups/{group-id}/{group.id}.json') // '/groups/:groupId/:groupId2.json'\n */\n static toPath(path: string): string {\n const seen = new Map<string, number>()\n\n return path.replace(/\\{([^}]+)\\}/g, (_match, param: string) => {\n const base = transformPathParam(param)\n const count = (seen.get(base) ?? 0) + 1\n seen.set(base, count)\n\n return count === 1 ? `:${base}` : `:${base}${count}`\n })\n }\n\n /**\n * Converts an OpenAPI/Swagger path to a template literal that reads each parameter off a\n * grouped `path` request option, e.g. `/pet/{petId}` becomes `` `/pet/${path.petId}` ``.\n * Parameter names are kept exactly as they appear in the OpenAPI path; a name falls back to\n * bracket access (`` path['pet-id'] ``) only when it isn't a valid JS identifier.\n * `prefix` is prepended inside the literal. Shared by generators that pass a grouped `path` object.\n *\n * @example\n * Url.toGroupedTemplateString('/pet/{petId}') // '`/pet/${path.petId}`'\n *\n * @example\n * Url.toGroupedTemplateString('/user/{monetary-account-id}') // '`/user/${path[\"monetary-account-id\"]}`'\n */\n static toGroupedTemplateString(path: string, { prefix }: { prefix?: string | null } = {}): string {\n const parts = path.split(/\\{([^}]+)\\}/)\n const result = parts.map((part, i) => (i % 2 === 0 ? part : `\\${path${groupedAccessor(part)}}`)).join('')\n\n return `\\`${prefix ?? ''}${result}\\``\n }\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n propertyName: string\n values: Array<string>\n enumName?: string\n}\n\n/**\n * Builds a macro that replaces a discriminator property's schema with a string enum of the given\n * values. Object schemas that lack the property are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroDiscriminatorEnum({ propertyName: 'type', values: ['dog', 'cat'] })\n * const next = applyMacros(objectSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroDiscriminatorEnum({ propertyName, values, enumName }: Props) {\n return ast.defineMacro({\n name: 'discriminator-enum',\n schema(node) {\n const objectNode = ast.narrowSchema(node, 'object')\n if (!objectNode?.properties?.length) return undefined\n if (!objectNode.properties.some((prop) => prop.name === propertyName)) return undefined\n\n return ast.factory.createSchema({\n ...objectNode,\n properties: objectNode.properties.map((prop) => {\n if (prop.name !== propertyName) return prop\n\n return ast.factory.createProperty({\n ...prop,\n schema: ast.factory.createSchema({\n type: 'enum',\n primitive: 'string',\n enumValues: values,\n name: enumName,\n readOnly: prop.schema.readOnly,\n writeOnly: prop.schema.writeOnly,\n }),\n })\n }),\n })\n },\n })\n}\n","type Options = {\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction convert(text: string, pascal: boolean): string {\n return text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n .split(/[\\s\\-_./\\\\:]+/)\n .filter(Boolean)\n .map((word, i) => {\n if (word.length > 1 && word === word.toUpperCase()) return word\n const head = i === 0 && !pascal ? word.charAt(0).toLowerCase() : word.charAt(0).toUpperCase()\n return head + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n// Plugins resolve the same names over and over (about 47,000 calls for a 1,000 schema spec), so\n// results are kept. Clearing at the limit bounds the memory a long-running process spends on it.\nconst cache = new Map<string, string>()\nconst cacheLimit = 10_000\n\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const key = `${pascal ? 'P' : 'c'}${text}`\n const cached = cache.get(key)\n if (cached !== undefined) return cached\n\n const result = convert(text, pascal)\n if (cache.size >= cacheLimit) cache.clear()\n cache.set(key, result)\n return result\n}\n\n/**\n * Converts `text` to camelCase.\n *\n * @example Word boundaries\n * `camelCase('hello-world') // 'helloWorld'`\n *\n * @example With a prefix\n * `camelCase('tag', { prefix: 'create' }) // 'createTag'`\n */\nexport function camelCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n *\n * @example Word boundaries\n * `pascalCase('hello-world') // 'HelloWorld'`\n *\n * @example With a suffix\n * `pascalCase('tag', { suffix: 'schema' }) // 'TagSchema'`\n */\nexport function pascalCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode, SchemaType } from '@kubb/ast'\nimport { pascalCase } from '@internals/utils'\n\nconst plainStringTypes = new Set<SchemaType>(['string', 'uuid', 'email', 'url', 'datetime'] as const)\n\n/** Returns the last path segment of a reference string, for example `'Pet'` for `#/components/schemas/Pet`. */\nexport const extractRefName = ast.refName\n\n/**\n * Builds a PascalCase child schema name by joining a parent name and property name.\n * Returns `null` when there is no parent to nest under.\n *\n * @example Nested under a parent\n * `childName('Order', 'shipping_address') // 'OrderShippingAddress'`\n *\n * @example No parent\n * `childName(undefined, 'params') // null`\n */\nexport function childName(parentName: string | null | undefined, propName: string): string | null {\n return parentName ? pascalCase([parentName, propName].join(' ')) : null\n}\n\n/**\n * Builds a PascalCase enum name from the parent name, property name, and a suffix, skipping any\n * empty parts.\n *\n * @example\n * `enumPropName('Order', 'status', 'enum') // 'OrderStatusEnum'`\n */\nexport function enumPropName(parentName: string | null | undefined, propName: string, enumSuffix: string): string {\n return pascalCase([parentName, propName, enumSuffix].filter(Boolean).join(' '))\n}\n\n/**\n * Applies `ast.mergeRefWithSchema()` to a resolved ref and rebuilds the result through\n * `ast.factory.createSchema()`. Non-ref nodes and unresolved refs are returned unchanged.\n *\n * @example\n * ```ts\n * const ref = ast.factory.createSchema({ type: 'ref', ref: '#/components/schemas/Pet', description: 'A cute pet' })\n * const merged = syncSchemaRef(ref) // merges with resolved Pet schema\n * ```\n */\nexport function syncSchemaRef(node: SchemaNode): SchemaNode {\n const ref = ast.narrowSchema(node, 'ref')\n\n if (!ref?.schema) return node\n\n return ast.factory.createSchema(ast.mergeRefWithSchema(ref))\n}\n\n/**\n * Returns `true` when a schema emits as a plain `string` type.\n *\n * Covers `string`, `uuid`, `email`, `url`, and `datetime` types. For `date` and `time`\n * types, returns `true` only when `representation` is `'string'` rather than `'date'`.\n */\nexport function isStringType(node: SchemaNode): boolean {\n if (plainStringTypes.has(node.type)) {\n return true\n }\n\n const temporal = ast.narrowSchema(node, 'date') ?? ast.narrowSchema(node, 'time')\n if (temporal) {\n return temporal.representation !== 'date'\n }\n\n return false\n}\n","import { ast } from '@kubb/ast'\nimport { enumPropName } from '../utils/refs.ts'\n\ntype Props = {\n parentName: string | null | undefined\n propName: string\n enumSuffix: string\n}\n\n/**\n * Builds a macro that names an inline enum schema from its parent and property name. Boolean enums\n * are left anonymous. Non-enum nodes are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroEnumName({ parentName: 'Pet', propName: 'status', enumSuffix: 'enum' })\n * const named = applyMacros(propSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroEnumName({ parentName, propName, enumSuffix }: Props) {\n return ast.defineMacro({\n name: 'enum-name',\n schema(node) {\n const enumNode = ast.narrowSchema(node, 'enum')\n\n if (enumNode?.primitive === 'boolean') return { ...node, name: null }\n if (enumNode) return { ...node, name: enumPropName(parentName, propName, enumSuffix) }\n\n return undefined\n },\n })\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n from: string\n to: string\n}\n\n/**\n * Builds a macro that renames a schema consistently: the declaration (`name`) and every ref\n * pointing at it (`targetName`) change together, so imports and printed references stay in\n * sync. Renaming only one side by hand produces imports for files that are never generated.\n *\n * @example\n * `const macro = macroRenameSchema({ from: 'Order', to: 'StoreOrder' })`\n */\nexport function macroRenameSchema({ from, to }: Props) {\n return ast.defineMacro({\n name: 'rename-schema',\n schema(node) {\n const refNode = ast.narrowSchema(node, 'ref')\n\n if (!refNode) {\n return node.name === from ? { ...node, name: to } : undefined\n }\n\n const renamesDeclaration = refNode.name === from\n const renamesTarget = ast.resolveRefName(refNode) === from\n if (!renamesDeclaration && !renamesTarget) return undefined\n\n return {\n ...refNode,\n ...(renamesDeclaration ? { name: to } : {}),\n ...(renamesTarget ? { targetName: to } : {}),\n }\n },\n })\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\nconst SCALAR_PRIMITIVE_TYPES = new Set<string>(['string', 'number', 'integer', 'bigint', 'boolean'])\n\n/**\n * Filters union members, dropping enum members that a broader scalar primitive already covers.\n */\nfunction simplifyUnionMembers(members: Array<SchemaNode>): Array<SchemaNode> {\n const scalarPrimitives = new Set<string>(members.filter((member) => SCALAR_PRIMITIVE_TYPES.has(member.type)).map((m) => m.type))\n if (!scalarPrimitives.size) return members\n\n return members.filter((member) => {\n const enumNode = ast.narrowSchema(member, 'enum')\n if (!enumNode) return true\n\n const primitive = enumNode.primitive\n if (!primitive) return true\n\n const enumValueCount = enumNode.namedEnumValues?.length ?? enumNode.enumValues?.length ?? 0\n if (enumValueCount <= 1) return true\n\n if (scalarPrimitives.has(primitive)) return false\n if ((primitive === 'integer' || primitive === 'number') && (scalarPrimitives.has('integer') || scalarPrimitives.has('number'))) return false\n\n return true\n })\n}\n\n/**\n * Removes union members a broader scalar primitive already covers, such as a multi-value string enum\n * sitting next to a plain `string`. Single-value enums are kept.\n *\n * @example\n * ```ts\n * const next = applyMacros(unionSchema, [macroSimplifyUnion], { depth: 'shallow' })\n * ```\n */\nexport const macroSimplifyUnion = ast.defineMacro({\n name: 'simplify-union',\n schema(node) {\n const unionNode = ast.narrowSchema(node, 'union')\n if (!unionNode?.members?.length) return undefined\n\n const simplified = simplifyUnionMembers(unionNode.members)\n if (simplified.length === unionNode.members.length) return undefined\n\n return { ...unionNode, members: simplified }\n },\n})\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Merges a run of adjacent anonymous object members into one. Named or non-object members break the\n * run and pass through unchanged. The merge follows member order, so callers control which members\n * combine by where they place them in the sequence.\n *\n * @example\n * ```ts\n * const merged = [...mergeAdjacentObjectsLazy([objectA, objectB])]\n * ```\n */\nexport function* mergeAdjacentObjectsLazy(members: Iterable<SchemaNode>): Generator<SchemaNode, void, undefined> {\n let acc: SchemaNode | undefined\n\n for (const member of members) {\n const objectMember = ast.narrowSchema(member, 'object')\n if (objectMember && !objectMember.name && acc !== undefined) {\n const accObject = ast.narrowSchema(acc, 'object')\n if (accObject && !accObject.name) {\n acc = ast.factory.createSchema({\n ...accObject,\n properties: [...(accObject.properties ?? []), ...(objectMember.properties ?? [])],\n })\n continue\n }\n }\n if (acc !== undefined) yield acc\n acc = member\n }\n\n if (acc !== undefined) yield acc\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Returns `true` when a schema, or anything nested inside it, references a circular schema.\n *\n * Pass `excludeName` to skip refs to a specific schema, which helps when self-references are handled\n * on their own. Pair it with `ast.findCircularSchemas()` to decide where lazy wrappers go.\n *\n * @note Reads the memoized `ast.collectSchemaRefs()` set, so a schema is scanned once across plugins.\n */\nexport function containsCircularRef(\n node: SchemaNode | undefined,\n { circularSchemas, excludeName }: { circularSchemas: ReadonlySet<string>; excludeName?: string },\n): boolean {\n if (!node || circularSchemas.size === 0) return false\n\n for (const name of ast.collectSchemaRefs(node)) {\n if (name !== excludeName && circularSchemas.has(name)) return true\n }\n\n return false\n}\n"],"mappings":";;;;;;;;;;AAMA,SAAS,mBAAmB,KAAqB;CAI/C,IAAI,kBAAkB,KAAK,GAAG,GAC5B,OAAO;CAGT,MAAM,qBAAqB,aAAa,KAAK,GAAG;CAGhD,OAFc,IAAI,MAAM,eAAe,CAAC,CAAC,OAAO,OAErC,CAAC,CACT,KAAK,MAAM,MAAM;EAEhB,OADmB,CAAC,sBAAsB,IAAI,IAC1B,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC;CAChH,CAAC,CAAC,CACD,KAAK,EAAE;AACZ;;;;;AAMA,SAAS,gBAAgB,MAAsB;CAC7C,OAAO,6BAA6B,KAAK,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,UAAU,IAAI,EAAE;AACzF;;;;AAKA,IAAa,MAAb,MAAiB;;;;;;;;;;;;;;;;;CAiBf,OAAO,OAAO,MAAsB;EAClC,MAAM,uBAAO,IAAI,IAAoB;EAErC,OAAO,KAAK,QAAQ,iBAAiB,QAAQ,UAAkB;GAC7D,MAAM,OAAO,mBAAmB,KAAK;GACrC,MAAM,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK;GACtC,KAAK,IAAI,MAAM,KAAK;GAEpB,OAAO,UAAU,IAAI,IAAI,SAAS,IAAI,OAAO;EAC/C,CAAC;CACH;;;;;;;;;;;;;;CAeA,OAAO,wBAAwB,MAAc,EAAE,WAAuC,CAAC,GAAW;EAEhG,MAAM,SADQ,KAAK,MAAM,aACN,CAAC,CAAC,KAAK,MAAM,MAAO,IAAI,MAAM,IAAI,OAAO,UAAU,gBAAgB,IAAI,EAAE,EAAG,CAAC,CAAC,KAAK,EAAE;EAExG,OAAO,KAAK,UAAU,KAAK,OAAO;CACpC;AACF;;;;;;;;;;;;;AClEA,SAAgB,uBAAuB,EAAE,cAAc,QAAQ,YAAmB;CAChF,OAAOA,MAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,aAAaA,MAAI,aAAa,MAAM,QAAQ;GAClD,IAAI,CAAC,YAAY,YAAY,QAAQ,OAAO,KAAA;GAC5C,IAAI,CAAC,WAAW,WAAW,MAAM,SAAS,KAAK,SAAS,YAAY,GAAG,OAAO,KAAA;GAE9E,OAAOA,MAAI,QAAQ,aAAa;IAC9B,GAAG;IACH,YAAY,WAAW,WAAW,KAAK,SAAS;KAC9C,IAAI,KAAK,SAAS,cAAc,OAAO;KAEvC,OAAOA,MAAI,QAAQ,eAAe;MAChC,GAAG;MACH,QAAQA,MAAI,QAAQ,aAAa;OAC/B,MAAM;OACN,WAAW;OACX,YAAY;OACZ,MAAM;OACN,UAAU,KAAK,OAAO;OACtB,WAAW,KAAK,OAAO;MACzB,CAAC;KACH,CAAC;IACH,CAAC;GACH,CAAC;EACH;CACF,CAAC;AACH;;;;;;;;;;AC5BA,SAAS,QAAQ,MAAc,QAAyB;CACtD,OAAO,KACJ,KAAK,CAAC,CACN,QAAQ,qBAAqB,OAAO,CAAC,CACrC,QAAQ,yBAAyB,OAAO,CAAC,CACzC,QAAQ,gBAAgB,OAAO,CAAC,CAChC,MAAM,eAAe,CAAC,CACtB,OAAO,OAAO,CAAC,CACf,KAAK,MAAM,MAAM;EAChB,IAAI,KAAK,SAAS,KAAK,SAAS,KAAK,YAAY,GAAG,OAAO;EAE3D,QADa,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,KAC9E,KAAK,MAAM,CAAC;CAC5B,CAAC,CAAC,CACD,KAAK,EAAE,CAAC,CACR,QAAQ,iBAAiB,EAAE;AAChC;AAIA,MAAM,wBAAQ,IAAI,IAAoB;AACtC,MAAM,aAAa;AAEnB,SAAS,gBAAgB,MAAc,QAAyB;CAC9D,MAAM,MAAM,GAAG,SAAS,MAAM,MAAM;CACpC,MAAM,SAAS,MAAM,IAAI,GAAG;CAC5B,IAAI,WAAW,KAAA,GAAW,OAAO;CAEjC,MAAM,SAAS,QAAQ,MAAM,MAAM;CACnC,IAAI,MAAM,QAAQ,YAAY,MAAM,MAAM;CAC1C,MAAM,IAAI,KAAK,MAAM;CACrB,OAAO;AACT;;;;;;;;;;AAwBA,SAAgB,WAAW,MAAc,EAAE,SAAS,IAAI,SAAS,OAAgB,CAAC,GAAW;CAC3F,OAAO,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,IAAI;AAC5D;;;ACvEA,MAAM,mCAAmB,IAAI,IAAgB;CAAC;CAAU;CAAQ;CAAS;CAAO;AAAU,CAAU;;AAGpG,MAAa,iBAAiBC,MAAI;;;;;;;;;;;AAYlC,SAAgB,UAAU,YAAuC,UAAiC;CAChG,OAAO,aAAa,WAAW,CAAC,YAAY,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI;AACrE;;;;;;;;AASA,SAAgB,aAAa,YAAuC,UAAkB,YAA4B;CAChH,OAAO,WAAW;EAAC;EAAY;EAAU;CAAU,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;AAChF;;;;;;;;;;;AAYA,SAAgB,cAAc,MAA8B;CAC1D,MAAM,MAAMA,MAAI,aAAa,MAAM,KAAK;CAExC,IAAI,CAAC,KAAK,QAAQ,OAAO;CAEzB,OAAOA,MAAI,QAAQ,aAAaA,MAAI,mBAAmB,GAAG,CAAC;AAC7D;;;;;;;AAQA,SAAgB,aAAa,MAA2B;CACtD,IAAI,iBAAiB,IAAI,KAAK,IAAI,GAChC,OAAO;CAGT,MAAM,WAAWA,MAAI,aAAa,MAAM,MAAM,KAAKA,MAAI,aAAa,MAAM,MAAM;CAChF,IAAI,UACF,OAAO,SAAS,mBAAmB;CAGrC,OAAO;AACT;;;;;;;;;;;;;AClDA,SAAgB,cAAc,EAAE,YAAY,UAAU,cAAqB;CACzE,OAAOC,MAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,WAAWA,MAAI,aAAa,MAAM,MAAM;GAE9C,IAAI,UAAU,cAAc,WAAW,OAAO;IAAE,GAAG;IAAM,MAAM;GAAK;GACpE,IAAI,UAAU,OAAO;IAAE,GAAG;IAAM,MAAM,aAAa,YAAY,UAAU,UAAU;GAAE;EAGvF;CACF,CAAC;AACH;;;;;;;;;;;AChBA,SAAgB,kBAAkB,EAAE,MAAM,MAAa;CACrD,OAAOC,MAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,UAAUA,MAAI,aAAa,MAAM,KAAK;GAE5C,IAAI,CAAC,SACH,OAAO,KAAK,SAAS,OAAO;IAAE,GAAG;IAAM,MAAM;GAAG,IAAI,KAAA;GAGtD,MAAM,qBAAqB,QAAQ,SAAS;GAC5C,MAAM,gBAAgBA,MAAI,eAAe,OAAO,MAAM;GACtD,IAAI,CAAC,sBAAsB,CAAC,eAAe,OAAO,KAAA;GAElD,OAAO;IACL,GAAG;IACH,GAAI,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,GAAI,gBAAgB,EAAE,YAAY,GAAG,IAAI,CAAC;GAC5C;EACF;CACF,CAAC;AACH;;;ACjCA,MAAM,yCAAyB,IAAI,IAAY;CAAC;CAAU;CAAU;CAAW;CAAU;AAAS,CAAC;;;;AAKnG,SAAS,qBAAqB,SAA+C;CAC3E,MAAM,mBAAmB,IAAI,IAAY,QAAQ,QAAQ,WAAW,uBAAuB,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI,CAAC;CAC/H,IAAI,CAAC,iBAAiB,MAAM,OAAO;CAEnC,OAAO,QAAQ,QAAQ,WAAW;EAChC,MAAM,WAAWC,MAAI,aAAa,QAAQ,MAAM;EAChD,IAAI,CAAC,UAAU,OAAO;EAEtB,MAAM,YAAY,SAAS;EAC3B,IAAI,CAAC,WAAW,OAAO;EAGvB,KADuB,SAAS,iBAAiB,UAAU,SAAS,YAAY,UAAU,MACpE,GAAG,OAAO;EAEhC,IAAI,iBAAiB,IAAI,SAAS,GAAG,OAAO;EAC5C,KAAK,cAAc,aAAa,cAAc,cAAc,iBAAiB,IAAI,SAAS,KAAK,iBAAiB,IAAI,QAAQ,IAAI,OAAO;EAEvI,OAAO;CACT,CAAC;AACH;;;;;;;;;;AAWA,MAAa,qBAAqBA,MAAI,YAAY;CAChD,MAAM;CACN,OAAO,MAAM;EACX,MAAM,YAAYA,MAAI,aAAa,MAAM,OAAO;EAChD,IAAI,CAAC,WAAW,SAAS,QAAQ,OAAO,KAAA;EAExC,MAAM,aAAa,qBAAqB,UAAU,OAAO;EACzD,IAAI,WAAW,WAAW,UAAU,QAAQ,QAAQ,OAAO,KAAA;EAE3D,OAAO;GAAE,GAAG;GAAW,SAAS;EAAW;CAC7C;AACF,CAAC;;;;;;;;;;;;;ACpCD,UAAiB,yBAAyB,SAAuE;CAC/G,IAAI;CAEJ,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,eAAeC,MAAI,aAAa,QAAQ,QAAQ;EACtD,IAAI,gBAAgB,CAAC,aAAa,QAAQ,QAAQ,KAAA,GAAW;GAC3D,MAAM,YAAYA,MAAI,aAAa,KAAK,QAAQ;GAChD,IAAI,aAAa,CAAC,UAAU,MAAM;IAChC,MAAMA,MAAI,QAAQ,aAAa;KAC7B,GAAG;KACH,YAAY,CAAC,GAAI,UAAU,cAAc,CAAC,GAAI,GAAI,aAAa,cAAc,CAAC,CAAE;IAClF,CAAC;IACD;GACF;EACF;EACA,IAAI,QAAQ,KAAA,GAAW,MAAM;EAC7B,MAAM;CACR;CAEA,IAAI,QAAQ,KAAA,GAAW,MAAM;AAC/B;;;;;;;;;;;ACtBA,SAAgB,oBACd,MACA,EAAE,iBAAiB,eACV;CACT,IAAI,CAAC,QAAQ,gBAAgB,SAAS,GAAG,OAAO;CAEhD,KAAK,MAAM,QAAQC,MAAI,kBAAkB,IAAI,GAC3C,IAAI,SAAS,eAAe,gBAAgB,IAAI,IAAI,GAAG,OAAO;CAGhE,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["ast","ast","ast","ast","ast","ast","ast"],"sources":["../src/Url.ts","../src/macros/macroDiscriminatorEnum.ts","../../../internals/utils/src/casing.ts","../src/utils/refs.ts","../src/macros/macroEnumName.ts","../src/macros/macroRenameSchema.ts","../src/macros/macroSimplifyUnion.ts","../src/utils/mergeAdjacentSchemas.ts","../src/utils/schemaGraph.ts"],"sourcesContent":["/**\n * Sanitizes a parameter name so it is safe to use as a `path-to-regexp` capture name, without\n * routing through {@link camelCase} (which keeps a leading `$` since it is a valid JS identifier\n * character). Runs of disallowed characters are treated as word boundaries; a boundary at the\n * very start of the name (e.g. the `$` in `$id`) still capitalizes the word that follows it.\n */\nfunction transformPathParam(raw: string): string {\n // `path-to-regexp` (used by MSW/Express) only accepts `[A-Za-z0-9_]` in a parameter name. It stops\n // reading at the first other character (a hyphen, a dot, a `$`, ...), which misparses the route or\n // throws \"Missing parameter name\".\n if (/^[A-Za-z0-9_]+$/.test(raw)) {\n return raw\n }\n\n const startsWithSafeChar = /^[A-Za-z_]/.test(raw)\n const words = raw.split(/[^A-Za-z0-9]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const capitalize = !startsWithSafeChar || i > 0\n return capitalize ? word.charAt(0).toUpperCase() + word.slice(1) : word.charAt(0).toLowerCase() + word.slice(1)\n })\n .join('')\n}\n\n/**\n * Renders how a grouped `path` object's member is accessed: dot access for an identifier (reserved\n * words are valid property names), bracket access with the raw name otherwise.\n */\nfunction groupedAccessor(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? `.${name}` : `[${JSON.stringify(name)}]`\n}\n\n/**\n * Helpers for OpenAPI/Swagger paths, plus a thin wrapper over the native `URL`.\n */\nexport class Url {\n /**\n * Converts an OpenAPI/Swagger path to Express-style colon syntax.\n *\n * Distinct parameter names that normalize to the same identifier (e.g. `{group-id}` and\n * `{group.id}` both becoming `groupId`) are deduplicated with an incrementing suffix so\n * `path-to-regexp` never sees two identically named captures.\n *\n * @example\n * Url.toPath('/pet/{petId}') // '/pet/:petId'\n *\n * @example\n * Url.toPath('/point/{point-id}') // '/point/:pointId'\n *\n * @example\n * Url.toPath('/groups/{group-id}/{group.id}.json') // '/groups/:groupId/:groupId2.json'\n */\n static toPath(path: string): string {\n const seen = new Map<string, number>()\n\n return path.replace(/\\{([^}]+)\\}/g, (_match, param: string) => {\n const base = transformPathParam(param)\n const count = (seen.get(base) ?? 0) + 1\n seen.set(base, count)\n\n return count === 1 ? `:${base}` : `:${base}${count}`\n })\n }\n\n /**\n * Converts an OpenAPI/Swagger path to a template literal that reads each parameter off a\n * grouped `path` request option, e.g. `/pet/{petId}` becomes `` `/pet/${path.petId}` ``.\n * Parameter names are kept exactly as they appear in the OpenAPI path; a name falls back to\n * bracket access (`` path['pet-id'] ``) only when it isn't a valid JS identifier.\n * `prefix` is prepended inside the literal. Shared by generators that pass a grouped `path` object.\n *\n * @example\n * Url.toGroupedTemplateString('/pet/{petId}') // '`/pet/${path.petId}`'\n *\n * @example\n * Url.toGroupedTemplateString('/user/{monetary-account-id}') // '`/user/${path[\"monetary-account-id\"]}`'\n */\n static toGroupedTemplateString(path: string, { prefix }: { prefix?: string | null } = {}): string {\n const parts = path.split(/\\{([^}]+)\\}/)\n const result = parts.map((part, i) => (i % 2 === 0 ? part : `\\${path${groupedAccessor(part)}}`)).join('')\n\n return `\\`${prefix ?? ''}${result}\\``\n }\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n propertyName: string\n values: Array<string | number | boolean>\n enumName?: string\n}\n\n/**\n * Picks the enum primitive from the type of the first value.\n */\nexport function enumPrimitive(values: Props['values']): 'string' | 'number' | 'boolean' {\n return typeof values[0] === 'number' ? 'number' : typeof values[0] === 'boolean' ? 'boolean' : 'string'\n}\n\n/**\n * Builds a macro that replaces a discriminator property's schema with an enum of the given\n * values. The enum is a string, number or boolean enum, following the first value. Object schemas\n * that lack the property are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroDiscriminatorEnum({ propertyName: 'type', values: ['dog', 'cat'] })\n * const next = applyMacros(objectSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroDiscriminatorEnum({ propertyName, values, enumName }: Props) {\n return ast.defineMacro({\n name: 'discriminator-enum',\n schema(node) {\n const objectNode = ast.narrowSchema(node, 'object')\n if (!objectNode?.properties?.length) return undefined\n if (!objectNode.properties.some((prop) => prop.name === propertyName)) return undefined\n\n return ast.factory.createSchema({\n ...objectNode,\n properties: objectNode.properties.map((prop) => {\n if (prop.name !== propertyName) return prop\n\n return ast.factory.createProperty({\n ...prop,\n schema: ast.factory.createSchema({\n type: 'enum',\n primitive: enumPrimitive(values),\n enumValues: values,\n name: enumName,\n readOnly: prop.schema.readOnly,\n writeOnly: prop.schema.writeOnly,\n }),\n })\n }),\n })\n },\n })\n}\n","type Options = {\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction convert(text: string, pascal: boolean): string {\n return text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n .split(/[\\s\\-_./\\\\:]+/)\n .filter(Boolean)\n .map((word, i) => {\n if (word.length > 1 && word === word.toUpperCase()) return word\n const head = i === 0 && !pascal ? word.charAt(0).toLowerCase() : word.charAt(0).toUpperCase()\n return head + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n// Plugins resolve the same names over and over (about 47,000 calls for a 1,000 schema spec), so\n// results are kept. Clearing at the limit bounds the memory a long-running process spends on it.\nconst cache = new Map<string, string>()\nconst cacheLimit = 10_000\n\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const key = `${pascal ? 'P' : 'c'}${text}`\n const cached = cache.get(key)\n if (cached !== undefined) return cached\n\n const result = convert(text, pascal)\n if (cache.size >= cacheLimit) cache.clear()\n cache.set(key, result)\n return result\n}\n\n/**\n * Converts `text` to camelCase.\n *\n * @example Word boundaries\n * `camelCase('hello-world') // 'helloWorld'`\n *\n * @example With a prefix\n * `camelCase('tag', { prefix: 'create' }) // 'createTag'`\n */\nexport function camelCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n *\n * @example Word boundaries\n * `pascalCase('hello-world') // 'HelloWorld'`\n *\n * @example With a suffix\n * `pascalCase('tag', { suffix: 'schema' }) // 'TagSchema'`\n */\nexport function pascalCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode, SchemaType } from '@kubb/ast'\nimport { pascalCase } from '@internals/utils'\n\nconst plainStringTypes = new Set<SchemaType>(['string', 'uuid', 'email', 'url', 'datetime'] as const)\n\n/** Returns the last path segment of a reference string, for example `'Pet'` for `#/components/schemas/Pet`. */\nexport const extractRefName = ast.refName\n\n/**\n * Builds a PascalCase child schema name by joining a parent name and property name.\n * Returns `null` when there is no parent to nest under.\n *\n * @example Nested under a parent\n * `childName('Order', 'shipping_address') // 'OrderShippingAddress'`\n *\n * @example No parent\n * `childName(undefined, 'params') // null`\n */\nexport function childName(parentName: string | null | undefined, propName: string): string | null {\n return parentName ? pascalCase([parentName, propName].join(' ')) : null\n}\n\n/**\n * Builds a PascalCase enum name from the parent name, property name, and a suffix, skipping any\n * empty parts.\n *\n * @example\n * `enumPropName('Order', 'status', 'enum') // 'OrderStatusEnum'`\n */\nexport function enumPropName(parentName: string | null | undefined, propName: string, enumSuffix: string): string {\n return pascalCase([parentName, propName, enumSuffix].filter(Boolean).join(' '))\n}\n\n/**\n * Applies `ast.mergeRefWithSchema()` to a resolved ref and rebuilds the result through\n * `ast.factory.createSchema()`. Non-ref nodes and unresolved refs are returned unchanged.\n *\n * @example\n * ```ts\n * const ref = ast.factory.createSchema({ type: 'ref', ref: '#/components/schemas/Pet', description: 'A cute pet' })\n * const merged = syncSchemaRef(ref) // merges with resolved Pet schema\n * ```\n */\nexport function syncSchemaRef(node: SchemaNode): SchemaNode {\n const ref = ast.narrowSchema(node, 'ref')\n\n if (!ref?.schema) return node\n\n return ast.factory.createSchema(ast.mergeRefWithSchema(ref))\n}\n\n/**\n * Returns `true` when a schema emits as a plain `string` type.\n *\n * Covers `string`, `uuid`, `email`, `url`, and `datetime` types. For `date` and `time`\n * types, returns `true` only when `representation` is `'string'` rather than `'date'`.\n */\nexport function isStringType(node: SchemaNode): boolean {\n if (plainStringTypes.has(node.type)) {\n return true\n }\n\n const temporal = ast.narrowSchema(node, 'date') ?? ast.narrowSchema(node, 'time')\n if (temporal) {\n return temporal.representation !== 'date'\n }\n\n return false\n}\n","import { ast } from '@kubb/ast'\nimport { enumPropName } from '../utils/refs.ts'\n\ntype Props = {\n parentName: string | null | undefined\n propName: string\n enumSuffix: string\n}\n\n/**\n * Builds a macro that names an inline enum schema from its parent and property name. Boolean enums\n * are left anonymous. Non-enum nodes are returned unchanged.\n *\n * @example\n * ```ts\n * const macro = macroEnumName({ parentName: 'Pet', propName: 'status', enumSuffix: 'enum' })\n * const named = applyMacros(propSchema, [macro], { depth: 'shallow' })\n * ```\n */\nexport function macroEnumName({ parentName, propName, enumSuffix }: Props) {\n return ast.defineMacro({\n name: 'enum-name',\n schema(node) {\n const enumNode = ast.narrowSchema(node, 'enum')\n\n if (enumNode?.primitive === 'boolean') return { ...node, name: null }\n if (enumNode) return { ...node, name: enumPropName(parentName, propName, enumSuffix) }\n\n return undefined\n },\n })\n}\n","import { ast } from '@kubb/ast'\n\ntype Props = {\n from: string\n to: string\n}\n\n/**\n * Builds a macro that renames a schema consistently: the declaration (`name`) and every ref\n * pointing at it (`targetName`) change together, so imports and printed references stay in\n * sync. Renaming only one side by hand produces imports for files that are never generated.\n *\n * @example\n * `const macro = macroRenameSchema({ from: 'Order', to: 'StoreOrder' })`\n */\nexport function macroRenameSchema({ from, to }: Props) {\n return ast.defineMacro({\n name: 'rename-schema',\n schema(node) {\n const refNode = ast.narrowSchema(node, 'ref')\n\n if (!refNode) {\n return node.name === from ? { ...node, name: to } : undefined\n }\n\n const renamesDeclaration = refNode.name === from\n const renamesTarget = ast.resolveRefName(refNode) === from\n if (!renamesDeclaration && !renamesTarget) return undefined\n\n return {\n ...refNode,\n ...(renamesDeclaration ? { name: to } : {}),\n ...(renamesTarget ? { targetName: to } : {}),\n }\n },\n })\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\nconst SCALAR_PRIMITIVE_TYPES = new Set<string>(['string', 'number', 'integer', 'bigint', 'boolean'])\n\n/**\n * Filters union members, dropping enum members that a broader scalar primitive already covers.\n */\nfunction simplifyUnionMembers(members: Array<SchemaNode>): Array<SchemaNode> {\n const scalarPrimitives = new Set<string>(members.filter((member) => SCALAR_PRIMITIVE_TYPES.has(member.type)).map((m) => m.type))\n if (!scalarPrimitives.size) return members\n\n return members.filter((member) => {\n const enumNode = ast.narrowSchema(member, 'enum')\n if (!enumNode) return true\n\n const primitive = enumNode.primitive\n if (!primitive) return true\n\n const enumValueCount = enumNode.namedEnumValues?.length ?? enumNode.enumValues?.length ?? 0\n if (enumValueCount <= 1) return true\n\n if (scalarPrimitives.has(primitive)) return false\n if ((primitive === 'integer' || primitive === 'number') && (scalarPrimitives.has('integer') || scalarPrimitives.has('number'))) return false\n\n return true\n })\n}\n\n/**\n * Removes union members a broader scalar primitive already covers, such as a multi-value string enum\n * sitting next to a plain `string`. Single-value enums are kept.\n *\n * @example\n * ```ts\n * const next = applyMacros(unionSchema, [macroSimplifyUnion], { depth: 'shallow' })\n * ```\n */\nexport const macroSimplifyUnion = ast.defineMacro({\n name: 'simplify-union',\n schema(node) {\n const unionNode = ast.narrowSchema(node, 'union')\n if (!unionNode?.members?.length) return undefined\n\n const simplified = simplifyUnionMembers(unionNode.members)\n if (simplified.length === unionNode.members.length) return undefined\n\n return { ...unionNode, members: simplified }\n },\n})\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Merges a run of adjacent anonymous object members into one. Named or non-object members break the\n * run and pass through unchanged. The merge follows member order, so callers control which members\n * combine by where they place them in the sequence.\n *\n * @example\n * ```ts\n * const merged = [...mergeAdjacentObjectsLazy([objectA, objectB])]\n * ```\n */\nexport function* mergeAdjacentObjectsLazy(members: Iterable<SchemaNode>): Generator<SchemaNode, void, undefined> {\n let acc: SchemaNode | undefined\n\n for (const member of members) {\n const objectMember = ast.narrowSchema(member, 'object')\n if (objectMember && !objectMember.name && acc !== undefined) {\n const accObject = ast.narrowSchema(acc, 'object')\n if (accObject && !accObject.name) {\n acc = ast.factory.createSchema({\n ...accObject,\n properties: [...(accObject.properties ?? []), ...(objectMember.properties ?? [])],\n })\n continue\n }\n }\n if (acc !== undefined) yield acc\n acc = member\n }\n\n if (acc !== undefined) yield acc\n}\n","import { ast } from '@kubb/ast'\nimport type { SchemaNode } from '@kubb/ast'\n\n/**\n * Returns `true` when a schema, or anything nested inside it, references a circular schema.\n *\n * Pass `excludeName` to skip refs to a specific schema, which helps when self-references are handled\n * on their own. Pair it with `ast.findCircularSchemas()` to decide where lazy wrappers go.\n *\n * @note Reads the memoized `ast.collectSchemaRefs()` set, so a schema is scanned once across plugins.\n */\nexport function containsCircularRef(\n node: SchemaNode | undefined,\n { circularSchemas, excludeName }: { circularSchemas: ReadonlySet<string>; excludeName?: string },\n): boolean {\n if (!node || circularSchemas.size === 0) return false\n\n for (const name of ast.collectSchemaRefs(node)) {\n if (name !== excludeName && circularSchemas.has(name)) return true\n }\n\n return false\n}\n"],"mappings":";;;;;;;;;;AAMA,SAAS,mBAAmB,KAAqB;CAI/C,IAAI,kBAAkB,KAAK,GAAG,GAC5B,OAAO;CAGT,MAAM,qBAAqB,aAAa,KAAK,GAAG;CAGhD,OAFc,IAAI,MAAM,eAAe,CAAC,CAAC,OAAO,OAErC,CAAC,CACT,KAAK,MAAM,MAAM;EAEhB,OADmB,CAAC,sBAAsB,IAAI,IAC1B,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC;CAChH,CAAC,CAAC,CACD,KAAK,EAAE;AACZ;;;;;AAMA,SAAS,gBAAgB,MAAsB;CAC7C,OAAO,6BAA6B,KAAK,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,UAAU,IAAI,EAAE;AACzF;;;;AAKA,IAAa,MAAb,MAAiB;;;;;;;;;;;;;;;;;CAiBf,OAAO,OAAO,MAAsB;EAClC,MAAM,uBAAO,IAAI,IAAoB;EAErC,OAAO,KAAK,QAAQ,iBAAiB,QAAQ,UAAkB;GAC7D,MAAM,OAAO,mBAAmB,KAAK;GACrC,MAAM,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK;GACtC,KAAK,IAAI,MAAM,KAAK;GAEpB,OAAO,UAAU,IAAI,IAAI,SAAS,IAAI,OAAO;EAC/C,CAAC;CACH;;;;;;;;;;;;;;CAeA,OAAO,wBAAwB,MAAc,EAAE,WAAuC,CAAC,GAAW;EAEhG,MAAM,SADQ,KAAK,MAAM,aACN,CAAC,CAAC,KAAK,MAAM,MAAO,IAAI,MAAM,IAAI,OAAO,UAAU,gBAAgB,IAAI,EAAE,EAAG,CAAC,CAAC,KAAK,EAAE;EAExG,OAAO,KAAK,UAAU,KAAK,OAAO;CACpC;AACF;;;;;;ACzEA,SAAgB,cAAc,QAA0D;CACtF,OAAO,OAAO,OAAO,OAAO,WAAW,WAAW,OAAO,OAAO,OAAO,YAAY,YAAY;AACjG;;;;;;;;;;;;AAaA,SAAgB,uBAAuB,EAAE,cAAc,QAAQ,YAAmB;CAChF,OAAOA,MAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,aAAaA,MAAI,aAAa,MAAM,QAAQ;GAClD,IAAI,CAAC,YAAY,YAAY,QAAQ,OAAO,KAAA;GAC5C,IAAI,CAAC,WAAW,WAAW,MAAM,SAAS,KAAK,SAAS,YAAY,GAAG,OAAO,KAAA;GAE9E,OAAOA,MAAI,QAAQ,aAAa;IAC9B,GAAG;IACH,YAAY,WAAW,WAAW,KAAK,SAAS;KAC9C,IAAI,KAAK,SAAS,cAAc,OAAO;KAEvC,OAAOA,MAAI,QAAQ,eAAe;MAChC,GAAG;MACH,QAAQA,MAAI,QAAQ,aAAa;OAC/B,MAAM;OACN,WAAW,cAAc,MAAM;OAC/B,YAAY;OACZ,MAAM;OACN,UAAU,KAAK,OAAO;OACtB,WAAW,KAAK,OAAO;MACzB,CAAC;KACH,CAAC;IACH,CAAC;GACH,CAAC;EACH;CACF,CAAC;AACH;;;;;;;;;;ACpCA,SAAS,QAAQ,MAAc,QAAyB;CACtD,OAAO,KACJ,KAAK,CAAC,CACN,QAAQ,qBAAqB,OAAO,CAAC,CACrC,QAAQ,yBAAyB,OAAO,CAAC,CACzC,QAAQ,gBAAgB,OAAO,CAAC,CAChC,MAAM,eAAe,CAAC,CACtB,OAAO,OAAO,CAAC,CACf,KAAK,MAAM,MAAM;EAChB,IAAI,KAAK,SAAS,KAAK,SAAS,KAAK,YAAY,GAAG,OAAO;EAE3D,QADa,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,KAC9E,KAAK,MAAM,CAAC;CAC5B,CAAC,CAAC,CACD,KAAK,EAAE,CAAC,CACR,QAAQ,iBAAiB,EAAE;AAChC;AAIA,MAAM,wBAAQ,IAAI,IAAoB;AACtC,MAAM,aAAa;AAEnB,SAAS,gBAAgB,MAAc,QAAyB;CAC9D,MAAM,MAAM,GAAG,SAAS,MAAM,MAAM;CACpC,MAAM,SAAS,MAAM,IAAI,GAAG;CAC5B,IAAI,WAAW,KAAA,GAAW,OAAO;CAEjC,MAAM,SAAS,QAAQ,MAAM,MAAM;CACnC,IAAI,MAAM,QAAQ,YAAY,MAAM,MAAM;CAC1C,MAAM,IAAI,KAAK,MAAM;CACrB,OAAO;AACT;;;;;;;;;;AAwBA,SAAgB,WAAW,MAAc,EAAE,SAAS,IAAI,SAAS,OAAgB,CAAC,GAAW;CAC3F,OAAO,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,IAAI;AAC5D;;;ACvEA,MAAM,mCAAmB,IAAI,IAAgB;CAAC;CAAU;CAAQ;CAAS;CAAO;AAAU,CAAU;;AAGpG,MAAa,iBAAiBC,MAAI;;;;;;;;;;;AAYlC,SAAgB,UAAU,YAAuC,UAAiC;CAChG,OAAO,aAAa,WAAW,CAAC,YAAY,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI;AACrE;;;;;;;;AASA,SAAgB,aAAa,YAAuC,UAAkB,YAA4B;CAChH,OAAO,WAAW;EAAC;EAAY;EAAU;CAAU,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;AAChF;;;;;;;;;;;AAYA,SAAgB,cAAc,MAA8B;CAC1D,MAAM,MAAMA,MAAI,aAAa,MAAM,KAAK;CAExC,IAAI,CAAC,KAAK,QAAQ,OAAO;CAEzB,OAAOA,MAAI,QAAQ,aAAaA,MAAI,mBAAmB,GAAG,CAAC;AAC7D;;;;;;;AAQA,SAAgB,aAAa,MAA2B;CACtD,IAAI,iBAAiB,IAAI,KAAK,IAAI,GAChC,OAAO;CAGT,MAAM,WAAWA,MAAI,aAAa,MAAM,MAAM,KAAKA,MAAI,aAAa,MAAM,MAAM;CAChF,IAAI,UACF,OAAO,SAAS,mBAAmB;CAGrC,OAAO;AACT;;;;;;;;;;;;;AClDA,SAAgB,cAAc,EAAE,YAAY,UAAU,cAAqB;CACzE,OAAOC,MAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,WAAWA,MAAI,aAAa,MAAM,MAAM;GAE9C,IAAI,UAAU,cAAc,WAAW,OAAO;IAAE,GAAG;IAAM,MAAM;GAAK;GACpE,IAAI,UAAU,OAAO;IAAE,GAAG;IAAM,MAAM,aAAa,YAAY,UAAU,UAAU;GAAE;EAGvF;CACF,CAAC;AACH;;;;;;;;;;;AChBA,SAAgB,kBAAkB,EAAE,MAAM,MAAa;CACrD,OAAOC,MAAI,YAAY;EACrB,MAAM;EACN,OAAO,MAAM;GACX,MAAM,UAAUA,MAAI,aAAa,MAAM,KAAK;GAE5C,IAAI,CAAC,SACH,OAAO,KAAK,SAAS,OAAO;IAAE,GAAG;IAAM,MAAM;GAAG,IAAI,KAAA;GAGtD,MAAM,qBAAqB,QAAQ,SAAS;GAC5C,MAAM,gBAAgBA,MAAI,eAAe,OAAO,MAAM;GACtD,IAAI,CAAC,sBAAsB,CAAC,eAAe,OAAO,KAAA;GAElD,OAAO;IACL,GAAG;IACH,GAAI,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,GAAI,gBAAgB,EAAE,YAAY,GAAG,IAAI,CAAC;GAC5C;EACF;CACF,CAAC;AACH;;;ACjCA,MAAM,yCAAyB,IAAI,IAAY;CAAC;CAAU;CAAU;CAAW;CAAU;AAAS,CAAC;;;;AAKnG,SAAS,qBAAqB,SAA+C;CAC3E,MAAM,mBAAmB,IAAI,IAAY,QAAQ,QAAQ,WAAW,uBAAuB,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI,CAAC;CAC/H,IAAI,CAAC,iBAAiB,MAAM,OAAO;CAEnC,OAAO,QAAQ,QAAQ,WAAW;EAChC,MAAM,WAAWC,MAAI,aAAa,QAAQ,MAAM;EAChD,IAAI,CAAC,UAAU,OAAO;EAEtB,MAAM,YAAY,SAAS;EAC3B,IAAI,CAAC,WAAW,OAAO;EAGvB,KADuB,SAAS,iBAAiB,UAAU,SAAS,YAAY,UAAU,MACpE,GAAG,OAAO;EAEhC,IAAI,iBAAiB,IAAI,SAAS,GAAG,OAAO;EAC5C,KAAK,cAAc,aAAa,cAAc,cAAc,iBAAiB,IAAI,SAAS,KAAK,iBAAiB,IAAI,QAAQ,IAAI,OAAO;EAEvI,OAAO;CACT,CAAC;AACH;;;;;;;;;;AAWA,MAAa,qBAAqBA,MAAI,YAAY;CAChD,MAAM;CACN,OAAO,MAAM;EACX,MAAM,YAAYA,MAAI,aAAa,MAAM,OAAO;EAChD,IAAI,CAAC,WAAW,SAAS,QAAQ,OAAO,KAAA;EAExC,MAAM,aAAa,qBAAqB,UAAU,OAAO;EACzD,IAAI,WAAW,WAAW,UAAU,QAAQ,QAAQ,OAAO,KAAA;EAE3D,OAAO;GAAE,GAAG;GAAW,SAAS;EAAW;CAC7C;AACF,CAAC;;;;;;;;;;;;;ACpCD,UAAiB,yBAAyB,SAAuE;CAC/G,IAAI;CAEJ,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,eAAeC,MAAI,aAAa,QAAQ,QAAQ;EACtD,IAAI,gBAAgB,CAAC,aAAa,QAAQ,QAAQ,KAAA,GAAW;GAC3D,MAAM,YAAYA,MAAI,aAAa,KAAK,QAAQ;GAChD,IAAI,aAAa,CAAC,UAAU,MAAM;IAChC,MAAMA,MAAI,QAAQ,aAAa;KAC7B,GAAG;KACH,YAAY,CAAC,GAAI,UAAU,cAAc,CAAC,GAAI,GAAI,aAAa,cAAc,CAAC,CAAE;IAClF,CAAC;IACD;GACF;EACF;EACA,IAAI,QAAQ,KAAA,GAAW,MAAM;EAC7B,MAAM;CACR;CAEA,IAAI,QAAQ,KAAA,GAAW,MAAM;AAC/B;;;;;;;;;;;ACtBA,SAAgB,oBACd,MACA,EAAE,iBAAiB,eACV;CACT,IAAI,CAAC,QAAQ,gBAAgB,SAAS,GAAG,OAAO;CAEhD,KAAK,MAAM,QAAQC,MAAI,kBAAkB,IAAI,GAC3C,IAAI,SAAS,eAAe,gBAAgB,IAAI,IAAI,GAAG,OAAO;CAGhE,OAAO;AACT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/kit",
|
|
3
|
-
"version": "5.14.
|
|
3
|
+
"version": "5.14.2",
|
|
4
4
|
"description": "Authoring toolkit for Kubb plugins, generators, adapters, resolvers, and renderers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"codegen",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"registry": "https://registry.npmjs.org/"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@kubb/ast": "5.14.
|
|
78
|
-
"@kubb/core": "5.14.
|
|
77
|
+
"@kubb/ast": "5.14.2",
|
|
78
|
+
"@kubb/core": "5.14.2"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@internals/utils": "0.0.1"
|