@kubb/plugin-faker 5.0.0-beta.42 → 5.0.0-beta.64
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/{Faker-SBhWTdC7.d.ts → Faker-BA4l8DTe.d.ts} +2 -2
- package/dist/{Faker-DBPx_MVh.js → Faker-DUx7jvCo.js} +10 -55
- package/dist/Faker-DUx7jvCo.js.map +1 -0
- package/dist/{Faker-DRL0W5Lt.cjs → Faker-Ds2xP2-k.cjs} +11 -62
- package/dist/Faker-Ds2xP2-k.cjs.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/components.js +1 -1
- package/dist/{fakerGenerator-Duc28_FK.d.ts → fakerGenerator-BNysC6rh.d.ts} +2 -2
- package/dist/{fakerGenerator-CVOr0Pwm.cjs → fakerGenerator-BeKRKYuy.cjs} +26 -60
- package/dist/fakerGenerator-BeKRKYuy.cjs.map +1 -0
- package/dist/{fakerGenerator-DNJ61yLj.js → fakerGenerator-D5Bcy5WY.js} +25 -59
- package/dist/fakerGenerator-D5Bcy5WY.js.map +1 -0
- package/dist/generators.cjs +1 -1
- package/dist/generators.d.ts +1 -1
- package/dist/generators.js +1 -1
- package/dist/index.cjs +47 -44
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +47 -44
- package/dist/index.js.map +1 -1
- package/dist/{printerFaker-DXS861Q0.d.ts → printerFaker-BzEB43Jz.d.ts} +11 -15
- package/package.json +8 -16
- package/dist/Faker-DBPx_MVh.js.map +0 -1
- package/dist/Faker-DRL0W5Lt.cjs.map +0 -1
- package/dist/fakerGenerator-CVOr0Pwm.cjs.map +0 -1
- package/dist/fakerGenerator-DNJ61yLj.js.map +0 -1
- package/extension.yaml +0 -819
- package/src/components/Faker.tsx +0 -139
- package/src/components/index.ts +0 -1
- package/src/generators/fakerGenerator.tsx +0 -311
- package/src/generators/index.ts +0 -1
- package/src/index.ts +0 -7
- package/src/plugin.ts +0 -92
- package/src/printers/printerFaker.ts +0 -405
- package/src/resolvers/resolverFaker.ts +0 -84
- package/src/types.ts +0 -185
- package/src/utils.ts +0 -257
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fakerGenerator-BeKRKYuy.cjs","names":["ast","jsxRenderer","pluginTsName","ast","canOverrideSchema","resolveTypeReference","File","localeToFakerImport","Faker","resolveParamNameByLocation","buildResponseUnionSchema"],"sources":["../../../internals/utils/src/imports.ts","../../../internals/shared/src/operation.ts","../src/printers/printerFaker.ts","../src/generators/fakerGenerator.tsx"],"sourcesContent":["export type ImportName = string | { propertyName: string; name?: string }\n\nexport type ImportEntry = {\n name: string | Array<ImportName>\n path: string\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction getImportNames(entry: ImportEntry): Array<string> {\n return (Array.isArray(entry.name) ? entry.name : [entry.name])\n .map((name) => {\n if (typeof name === 'string') {\n return name\n }\n\n return name.name ?? name.propertyName\n })\n .filter((name): name is string => Boolean(name))\n}\n\nexport function filterUsedImports(imports: Array<ImportEntry>, text: string, skipImportNames: Array<string> = []): Array<ImportEntry> {\n const skip = new Set(skipImportNames)\n\n return imports.filter((entry) => {\n const names = getImportNames(entry)\n\n return names.some((name) => {\n if (skip.has(name)) {\n return false\n }\n\n return new RegExp(`\\\\b${escapeRegExp(name)}\\\\b(?=\\\\s*\\\\()`).test(text)\n })\n })\n}\n\nexport function aliasConflictingImports(\n imports: Array<ImportEntry>,\n reservedNames: Iterable<string>,\n): { imports: Array<ImportEntry>; aliases: Map<string, string> } {\n const reservedNameSet = new Set(reservedNames)\n const aliases = new Map<string, string>()\n\n const aliasedImports = imports.map((entry) => {\n const names = Array.isArray(entry.name) ? entry.name : [entry.name]\n const aliasedNames = names.map((item): ImportName => {\n if (typeof item !== 'string' || !reservedNameSet.has(item)) {\n return item\n }\n\n const alias = `${item}Schema`\n aliases.set(item, alias)\n\n return { propertyName: item, name: alias }\n })\n\n return aliasedNames.some((item) => typeof item === 'object' && item.name)\n ? {\n ...entry,\n name: aliasedNames,\n }\n : entry\n })\n\n return {\n imports: aliasedImports,\n aliases,\n }\n}\n\nexport function rewriteAliasedImports(text: string, aliases: ReadonlyMap<string, string>): string {\n return Array.from(aliases).reduce((acc, [name, alias]) => acc.replace(new RegExp(`\\\\b${escapeRegExp(name)}\\\\b`, 'g'), alias), text)\n}\n","import { Url } from '@internals/utils'\nimport { ast, type ResolverFileParams } from '@kubb/core'\nimport { caseParams } from '@kubb/ast/utils'\n\n/**\n * Builds the `ResolverFileParams` every operation generator passes to\n * `resolver.resolveFile`: a file named `name`, tagged by the operation's first\n * tag (or `'default'`), at the operation's path. Centralizes the entry object\n * that was repeated at dozens of call sites across the client and query plugins.\n *\n * @example\n * ```ts\n * resolver.resolveFile(operationFileEntry(node, node.operationId), { root, output, group })\n * ```\n */\nexport function operationFileEntry(node: ast.OperationNode, name: string, extname: ResolverFileParams['extname'] = '.ts'): ResolverFileParams {\n return {\n name,\n extname,\n tag: node.tags[0] ?? 'default',\n path: node.path,\n }\n}\n\nexport type ContentTypeInfo = {\n contentTypes: string[]\n isMultipleContentTypes: boolean\n contentTypeUnion: string\n defaultContentType: string\n hasFormData: boolean\n}\n\nexport type RequestConfigResolver = {\n resolveDataName(node: ast.OperationNode): string\n}\n\nexport type ResponseStatusNameResolver = {\n resolveResponseStatusName(node: ast.OperationNode, statusCode: ast.StatusCode): string\n}\n\nexport type ResponseNameResolver = ResponseStatusNameResolver & {\n resolveResponseName(node: ast.OperationNode): string\n}\n\nexport type OperationTypeNameResolver = RequestConfigResolver &\n ResponseNameResolver & {\n resolvePathParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveQueryParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveHeaderParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n }\n\nexport type OperationCommentLink = 'pathTemplate' | 'urlPath' | false | ((node: ast.OperationNode) => string | undefined)\n\nexport type BuildOperationCommentsOptions = {\n link?: OperationCommentLink\n linkPosition?: 'beforeDeprecated' | 'afterDeprecated'\n splitLines?: boolean\n}\n\ntype ResponseLike = {\n statusCode: ast.StatusCode | number | string\n}\n\nexport type OperationParameterGroups = Record<ast.ParameterNode['in'], Array<ast.ParameterNode>>\n\nexport type ResolveOperationTypeNameOptions = {\n paramsCasing?: 'camelcase'\n responseStatusNames?: boolean | 'error'\n exclude?: ReadonlyArray<string | undefined>\n order?: 'params-first' | 'body-response-first'\n}\n\nfunction getOperationLink(node: ast.OperationNode, link: OperationCommentLink): string | null {\n if (!link) {\n return null\n }\n\n if (typeof link === 'function') {\n return link(node) ?? null\n }\n\n if (link === 'urlPath') {\n return node.path ? `{@link ${Url.toPath(node.path)}}` : null\n }\n\n return node.path ? `{@link ${node.path.replaceAll('{', ':').replaceAll('}', '')}}` : null\n}\n\nexport function getContentTypeInfo(node: ast.OperationNode): ContentTypeInfo {\n const contentTypes = node.requestBody?.content?.map((e) => e.contentType) ?? []\n const isMultipleContentTypes = contentTypes.length > 1\n\n return {\n contentTypes,\n isMultipleContentTypes,\n contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(' | ') : '',\n defaultContentType: contentTypes[0] ?? 'application/json',\n hasFormData: contentTypes.some((ct) => ct === 'multipart/form-data'),\n }\n}\n\nexport type ResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n\n/**\n * Derives the default `responseType` for an operation from its primary success response.\n *\n * Returns a value only when that response declares a single non-JSON content type — a binary type\n * (`application/octet-stream`, `application/pdf`, `image/*`, `audio/*`, `video/*`) maps to `'blob'`\n * and other `text/*` maps to `'text'`. Otherwise `undefined`, leaving the runtime client's\n * `Content-Type` auto-detection in charge.\n */\nexport function getResponseType(node: ast.OperationNode): ResponseType | undefined {\n const contentTypes = getPrimarySuccessResponse(node)?.content?.map((entry) => entry.contentType) ?? []\n if (contentTypes.length !== 1) return undefined\n\n const baseType = contentTypes[0]!.split(';')[0]!.trim().toLowerCase()\n if (baseType === 'application/json' || baseType.endsWith('+json') || baseType === 'text/json') return undefined\n if (baseType.startsWith('text/')) return 'text'\n if (baseType === 'application/octet-stream' || baseType === 'application/pdf' || /^(image|audio|video)\\//.test(baseType)) return 'blob'\n return undefined\n}\n\n/**\n * Maps a content type to the PascalCase suffix used to name per-content-type variants\n * (e.g. `application/json` → `Json`, `application/xml` → `Xml`, `multipart/form-data` → `FormData`).\n */\nexport function getContentTypeSuffix(contentType: string): string {\n const baseType = contentType.split(';')[0]!.trim()\n if (baseType === 'application/json') return 'Json'\n if (baseType === 'multipart/form-data') return 'FormData'\n if (baseType === 'application/x-www-form-urlencoded') return 'FormUrlEncoded'\n const subtype = baseType.split('/').pop() ?? baseType\n const parts = subtype.split(/[^a-zA-Z0-9]+/).filter(Boolean)\n if (parts.length === 0) return 'Unknown'\n return parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join('')\n}\n\n/**\n * Appends a content-type suffix to a base name, keeping a trailing `Data` segment last\n * (e.g. `AddPetData` + `Json` → `AddPetJsonData`, `AddPetStatus200` + `Xml` → `AddPetStatus200Xml`).\n */\nexport function getPerContentTypeName(baseName: string, suffix: string): string {\n if (baseName.endsWith('Data')) {\n return suffix.endsWith('Data') ? baseName.slice(0, -4) + suffix : `${baseName.slice(0, -4)}${suffix}Data`\n }\n return baseName + suffix\n}\n\nexport type ContentVariantInput = { contentType: string; schema?: ast.SchemaNode | null; keysToOmit?: Array<string> | null }\nexport type ContentVariant = { name: string; suffix: string; schema: ast.SchemaNode; keysToOmit?: Array<string> | null; contentType: string }\n\n/**\n * Resolves per-content-type variant names for a set of content entries, deduplicating suffix\n * collisions with a numeric counter. Entries without a schema are skipped. The returned `suffix` is\n * the final (possibly counter-augmented) value, so callers can derive parallel names in another\n * namespace (e.g. plugin-faker deriving the matching plugin-ts type name).\n */\nexport function resolveContentTypeVariants(entries: Array<ContentVariantInput>, baseName: string): Array<ContentVariant> {\n const usedNames = new Set<string>()\n return entries\n .filter((entry) => entry.schema)\n .map((entry) => {\n const baseSuffix = getContentTypeSuffix(entry.contentType)\n let suffix = baseSuffix\n let name = getPerContentTypeName(baseName, suffix)\n let counter = 2\n while (usedNames.has(name)) {\n suffix = `${baseSuffix}${counter++}`\n name = getPerContentTypeName(baseName, suffix)\n }\n usedNames.add(name)\n return { name, suffix, schema: entry.schema!, keysToOmit: entry.keysToOmit, contentType: entry.contentType }\n })\n}\n\nexport function buildRequestConfigType(node: ast.OperationNode, resolver: RequestConfigResolver): string {\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : null\n const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node)\n const configType = requestName ? `Partial<RequestConfig<${requestName}>>` : 'Partial<RequestConfig>'\n const configProps = ['client?: Client', isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : null].filter(Boolean).join('; ')\n\n return `${configType} & { ${configProps} }`\n}\n\nexport function buildOperationComments(node: ast.OperationNode, options: BuildOperationCommentsOptions = {}): Array<string> {\n const { link = 'pathTemplate', linkPosition = 'afterDeprecated', splitLines = false } = options\n const linkComment = getOperationLink(node, link)\n const comments =\n linkPosition === 'beforeDeprecated'\n ? [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, linkComment, node.deprecated && '@deprecated']\n : [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, node.deprecated && '@deprecated', linkComment]\n\n const filteredComments = comments.filter((comment): comment is string => Boolean(comment))\n\n if (!splitLines) {\n return filteredComments\n }\n\n return filteredComments.flatMap((text) => text.split(/\\r?\\n/).map((line) => line.trim())).filter((comment): comment is string => Boolean(comment))\n}\n\nexport function getOperationParameters(node: ast.OperationNode, options: { paramsCasing?: 'camelcase' } = {}): OperationParameterGroups {\n const params = caseParams(node.parameters, options.paramsCasing)\n\n return {\n path: params.filter((param) => param.in === 'path'),\n query: params.filter((param) => param.in === 'query'),\n header: params.filter((param) => param.in === 'header'),\n cookie: params.filter((param) => param.in === 'cookie'),\n }\n}\n\nexport function getStatusCodeNumber(statusCode: ast.StatusCode | number | string): number | null {\n const code = Number(statusCode)\n\n return Number.isNaN(code) ? null : code\n}\n\nexport function isSuccessStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== null && code >= 200 && code < 300\n}\n\nexport function isErrorStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== null && code >= 400\n}\n\nexport function getSuccessResponses<TResponse extends ResponseLike>(responses: ReadonlyArray<TResponse>): Array<TResponse> {\n return responses.filter((response) => isSuccessStatusCode(response.statusCode))\n}\n\nexport function getOperationSuccessResponses(node: ast.OperationNode): Array<ast.ResponseNode> {\n return getSuccessResponses(node.responses)\n}\n\nexport function getPrimarySuccessResponse(node: ast.OperationNode): ast.ResponseNode | null {\n return getOperationSuccessResponses(node)[0] ?? null\n}\n\nexport function resolveErrorNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isErrorStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveSuccessNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isSuccessStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveStatusCodeNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses.map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\n/**\n * Builds the discriminated union type string for `dataReturnType: 'full'` return shapes.\n * Each member is `{ status: N; data: StatusNType; statusText: string }`.\n */\nexport function buildStatusUnionType(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string {\n const members = node.responses.map((r) => {\n const typeName = resolver.resolveResponseStatusName(node, r.statusCode)\n const statusCode = Number.parseInt(r.statusCode, 10)\n const statusLiteral = Number.isNaN(statusCode) ? 'number' : String(statusCode)\n return `{ status: ${statusLiteral}; data: ${typeName}; statusText: string }`\n })\n if (members.length === 1) return members[0]!\n return `(${members.join(' | ')})`\n}\n\nconst typeNamesByResolver = new WeakMap<OperationTypeNameResolver, Map<string, string[]>>()\n\nexport function resolveOperationTypeNames(\n node: ast.OperationNode,\n resolver: OperationTypeNameResolver,\n options: ResolveOperationTypeNameOptions = {},\n): string[] {\n const cacheKey = `${node.operationId}\\0${options.paramsCasing ?? ''}\\0${options.order ?? ''}\\0${options.responseStatusNames ?? ''}\\0${(options.exclude ?? []).join(',')}`\n let byResolver = typeNamesByResolver.get(resolver)\n if (byResolver) {\n const cached = byResolver.get(cacheKey)\n if (cached) return cached\n } else {\n byResolver = new Map()\n typeNamesByResolver.set(resolver, byResolver)\n }\n\n const { path, query, header } = getOperationParameters(node, { paramsCasing: options.paramsCasing })\n const responseStatusNames =\n options.responseStatusNames === 'error'\n ? resolveErrorNames(node, resolver)\n : options.responseStatusNames === false\n ? []\n : resolveStatusCodeNames(node, resolver)\n const exclude = new Set(options.exclude ?? [])\n const paramNames = [\n ...path.map((param) => resolver.resolvePathParamsName(node, param)),\n ...query.map((param) => resolver.resolveQueryParamsName(node, param)),\n ...header.map((param) => resolver.resolveHeaderParamsName(node, param)),\n ]\n const bodyAndResponseNames = [node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : null, resolver.resolveResponseName(node)]\n const names =\n options.order === 'body-response-first'\n ? [...bodyAndResponseNames, ...paramNames, ...responseStatusNames]\n : [...paramNames, ...bodyAndResponseNames, ...responseStatusNames]\n\n const result = names.filter((name): name is string => Boolean(name) && !exclude.has(name as string))\n byResolver.set(cacheKey, result)\n return result\n}\n\nexport function resolveResponseTypes(node: ast.OperationNode, resolver: ResponseNameResolver): Array<[statusCode: number | 'default', typeName: string]> {\n const types: Array<[number | 'default', string]> = []\n\n for (const response of node.responses) {\n if (response.statusCode === 'default') {\n types.push(['default', resolver.resolveResponseName(node)])\n continue\n }\n\n const code = getStatusCodeNumber(response.statusCode)\n if (code === null) {\n continue\n }\n\n types.push([code, isSuccessStatusCode(code) ? resolver.resolveResponseName(node) : resolver.resolveResponseStatusName(node, response.statusCode)])\n }\n\n return types\n}\n\nexport function findSuccessStatusCode(responses: Array<{ statusCode: ast.StatusCode | number | string }>): ast.StatusCode | null {\n for (const response of responses) {\n if (isSuccessStatusCode(response.statusCode)) {\n return response.statusCode as ast.StatusCode\n }\n }\n\n return null\n}\n","import { buildObject, extractRefName, mapSchemaItems, mapSchemaMembers, objectKey, stringify, toRegExpString } from '@kubb/ast/utils'\nimport { ast } from '@kubb/core'\nimport { containsCircularRef } from '@kubb/ast/utils'\nimport type { PluginFaker, ResolverFaker } from '../types.ts'\n\n/**\n * Partial map of node-type overrides for the Faker printer. Each key is a\n * `SchemaType` (`'string'`, `'date'`, ...) and each handler returns the\n * Faker expression for that schema as a string. Use `this.transform` to\n * recurse into nested schema nodes and `this.options` to read printer options.\n *\n * @example Override the integer handler\n * ```ts\n * pluginFaker({\n * printer: {\n * nodes: {\n * integer() {\n * return 'faker.number.float()'\n * },\n * },\n * },\n * })\n * ```\n */\nexport type PrinterFakerNodes = ast.PrinterPartial<string, PrinterFakerOptions>\n\n/**\n * Options passed to the Faker printer at instantiation: the parser library\n * for date strings, the regex generator, the user-supplied schema-name\n * mapper, and the resolver used to compute identifiers.\n */\nexport type PrinterFakerOptions = {\n dateParser?: PluginFaker['resolvedOptions']['dateParser']\n regexGenerator?: PluginFaker['resolvedOptions']['regexGenerator']\n mapper?: PluginFaker['resolvedOptions']['mapper']\n resolver: ResolverFaker\n typeName?: string\n schemaName?: string\n nestedInObject?: boolean\n /**\n * Set while printing the members of a union (`oneOf`). Object properties then index their\n * type as `(NonNullable<T> & Record<K, unknown>)[K]` instead of `NonNullable<T>[K]`, so a key\n * carried by only some branches stays valid (a plain index would be a TS2339).\n */\n nestedInUnion?: boolean\n nodes?: PrinterFakerNodes\n /**\n * Names of schemas that participate in a circular dependency chain.\n * Properties whose schema transitively references one of these are emitted\n * as lazy getters so that user overrides via the `data` parameter prevent\n * the recursive faker call from ever executing (avoiding stack overflow).\n */\n cyclicSchemas?: ReadonlySet<string>\n}\n\n/**\n * Factory options for the Faker printer, defining input/output types and configuration.\n */\nexport type PrinterFakerFactory = ast.PrinterFactoryOptions<'faker', PrinterFakerOptions, string, string>\n\nconst fakerKeywordMapper = {\n any: () => 'undefined',\n unknown: () => 'undefined',\n void: () => 'undefined',\n number: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.number.float({ min: ${min}, max: ${max} })`\n }\n\n if (max !== undefined) {\n return `faker.number.float({ max: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.number.float({ min: ${min} })`\n }\n\n return 'faker.number.float()'\n },\n integer: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.number.int({ min: ${min}, max: ${max} })`\n }\n\n if (max !== undefined) {\n return `faker.number.int({ max: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.number.int({ min: ${min} })`\n }\n\n return 'faker.number.int()'\n },\n bigint: () => 'faker.number.bigInt()',\n string: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.string.alpha({ length: { min: ${min}, max: ${max} } })`\n }\n\n if (max !== undefined) {\n return `faker.string.alpha({ length: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.string.alpha({ length: ${min} })`\n }\n\n return 'faker.string.alpha()'\n },\n boolean: () => 'faker.datatype.boolean()',\n null: () => 'null',\n array: (items: Array<string> = [], min?: number, max?: number) => {\n if (items.length > 1) {\n return `faker.helpers.arrayElements([${items.join(', ')}])`\n }\n\n const item = items.at(0)\n\n if (min !== undefined && max !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: { min: ${min}, max: ${max} }})`\n }\n\n if (min !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: ${min} })`\n }\n\n if (max !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: { min: 0, max: ${max} }})`\n }\n\n return `faker.helpers.multiple(() => (${item}))`\n },\n tuple: (items: Array<string> = []) => `[${items.join(', ')}]`,\n enum: (items: Array<string | number | boolean | undefined> = [], type = 'any') => `faker.helpers.arrayElement<${type}>([${items.join(', ')}])`,\n union: (items: Array<string> = []) => `faker.helpers.arrayElement<any>([${items.join(', ')}])`,\n datetime: () => 'faker.date.anytime().toISOString()',\n date: (representation: 'date' | 'string' = 'string', parser: PluginFaker['resolvedOptions']['dateParser'] = 'faker') => {\n if (representation === 'string') {\n if (parser !== 'faker') {\n return `${parser}(faker.date.anytime()).format(\"YYYY-MM-DD\")`\n }\n\n return 'faker.date.anytime().toISOString().substring(0, 10)'\n }\n\n if (parser !== 'faker') {\n throw new Error(`type '${representation}' and parser '${parser}' can not work together`)\n }\n\n return 'faker.date.anytime()'\n },\n time: (representation: 'date' | 'string' = 'string', parser: PluginFaker['resolvedOptions']['dateParser'] = 'faker') => {\n if (representation === 'string') {\n if (parser !== 'faker') {\n return `${parser}(faker.date.anytime()).format(\"HH:mm:ss\")`\n }\n\n return 'faker.date.anytime().toISOString().substring(11, 19)'\n }\n\n if (parser !== 'faker') {\n throw new Error(`type '${representation}' and parser '${parser}' can not work together`)\n }\n\n return 'faker.date.anytime()'\n },\n uuid: () => 'faker.string.uuid()',\n url: () => 'faker.internet.url()',\n and: (items: Array<string> = []) => {\n if (items.length === 0) {\n return '{}'\n }\n\n if (items.length === 1) {\n return items[0] ?? '{}'\n }\n\n return `{...${items.join(', ...')}}`\n },\n matches: (value = '', regexGenerator: 'faker' | 'randexp' = 'faker') => {\n if (regexGenerator === 'randexp') {\n return `${toRegExpString(value, 'RandExp')}.gen()`\n }\n\n return `faker.helpers.fromRegExp(\"${value}\")`\n },\n email: () => 'faker.internet.email()',\n blob: () => 'faker.image.url() as unknown as Blob',\n} as const\n\nfunction getEnumValues(node: ast.EnumSchemaNode): Array<string | number | boolean | undefined> {\n if (node.namedEnumValues?.length) {\n return node.namedEnumValues.map((item) => item.value as string | number | boolean | undefined)\n }\n\n return (node.enumValues ?? []) as Array<string | number | boolean | undefined>\n}\n\nfunction parseEnumValue(value: string | number | boolean | undefined) {\n if (typeof value === 'string') {\n return stringify(value)\n }\n\n return value\n}\n\n/** Reads the discriminator literal off a variant, or `undefined` when it can't be determined. */\nfunction getDiscriminatorValue(member: ast.SchemaNode, discriminatorPropertyName: string) {\n const prop = ast.narrowSchema(member, 'object')?.properties?.find((p) => p.name === discriminatorPropertyName)\n const enumNode = prop ? ast.narrowSchema(prop.schema, 'enum') : null\n\n return enumNode ? getEnumValues(enumNode)[0] : undefined\n}\n\n/**\n * Type expression for an object property's value, indexed off the parent `typeName`.\n *\n * In a union (`oneOf`), a key that only some branches declare turns a plain `NonNullable<T>[K]`\n * into a TS2339 error, so union members guard the access. The breakdown is below.\n */\nfunction indexedTypeName(typeName: string, propertyName: string, nestedInUnion?: boolean): string {\n const key = JSON.stringify(propertyName)\n\n // `(NonNullable<T> & Record<K, unknown>)[K]`, read inside-out:\n // NonNullable<T> strips null and undefined from the parent type T.\n // & Record<K, unknown> forces every branch to have key K. A branch that already declares K\n // keeps it (`T[K] & unknown` is `T[K]`); a branch missing K gains it as `unknown`.\n // [K] reads the key, which is now always present, so it never hits TS2339.\n // For a single object T the intersection does nothing, leaving `T[K]`.\n return nestedInUnion ? `(NonNullable<${typeName}> & Record<${key}, unknown>)[${key}]` : `NonNullable<${typeName}>[${key}]`\n}\n\n/**\n * Creates a Faker printer that generates mock data generation code from schema nodes.\n * Handles circular references gracefully by emitting memoizing getters for cyclic properties.\n */\nexport const printerFaker: (options: PrinterFakerOptions) => ast.Printer<PrinterFakerFactory> = ast.definePrinter<PrinterFakerFactory>((options) => {\n const printNested = (node: ast.SchemaNode, overrideOptions: Partial<PrinterFakerOptions> = {}): string => {\n return (\n printerFaker({\n ...options,\n ...overrideOptions,\n nodes: options.nodes,\n }).print(node) ?? 'undefined'\n )\n }\n\n return {\n name: 'faker',\n options,\n nodes: {\n any: () => fakerKeywordMapper.any(),\n unknown: () => fakerKeywordMapper.unknown(),\n void: () => fakerKeywordMapper.void(),\n boolean: () => fakerKeywordMapper.boolean(),\n null: () => fakerKeywordMapper.null(),\n string(node) {\n if (node.pattern) {\n return fakerKeywordMapper.matches(node.pattern, this.options.regexGenerator)\n }\n\n return fakerKeywordMapper.string(node.min, node.max)\n },\n email: () => fakerKeywordMapper.email(),\n url: () => fakerKeywordMapper.url(),\n uuid: () => fakerKeywordMapper.uuid(),\n number(node) {\n return fakerKeywordMapper.number(node.min, node.max)\n },\n integer(node) {\n return fakerKeywordMapper.integer(node.min, node.max)\n },\n bigint: () => fakerKeywordMapper.bigint(),\n blob: () => fakerKeywordMapper.blob(),\n datetime: () => fakerKeywordMapper.datetime(),\n date(node) {\n return fakerKeywordMapper.date(node.representation ?? 'string', this.options.dateParser)\n },\n time(node) {\n return fakerKeywordMapper.time(node.representation ?? 'string', this.options.dateParser)\n },\n ref(node) {\n // Parser-generated refs (with $ref) carry raw schema names that need resolving.\n // Use the canonical name from the $ref path — node.name may have been overridden\n // (e.g. by single-member allOf flatten using the property-derived child name).\n // Inline refs (without $ref) from faker utils already carry resolved helper names.\n const refName = node.ref ? (extractRefName(node.ref) ?? node.name ?? node.schema?.name) : (node.name ?? node.schema?.name)\n\n if (!refName) {\n throw new Error('Name not defined for ref node')\n }\n\n if (this.options.schemaName && refName === this.options.schemaName) {\n return 'undefined as any'\n }\n\n // Internal helper refs (for generated response/data helpers) are already\n // emitted with resolver output and should not be transformed twice.\n const resolvedName = node.ref ? this.options.resolver.resolveName(refName) : refName\n\n if (!this.options.nestedInObject) {\n return `${resolvedName}(data)`\n }\n\n return `${resolvedName}()`\n },\n enum(node) {\n return fakerKeywordMapper.enum(getEnumValues(node).map(parseEnumValue), this.options.typeName)\n },\n union(node): string {\n const { discriminatorPropertyName } = node\n const baseTypeName = this.options.typeName\n\n const items: Array<string> = mapSchemaMembers(node, (member) => {\n // For a discriminated union, narrow each variant to its own branch so nested\n // `NonNullable<T>[K]` indexes resolve against that branch instead of the whole union.\n const value = discriminatorPropertyName ? getDiscriminatorValue(member, discriminatorPropertyName) : undefined\n\n if (baseTypeName && value !== undefined) {\n const typeName = `Extract<NonNullable<${baseTypeName}>, { ${JSON.stringify(discriminatorPropertyName)}: ${parseEnumValue(value)} }>`\n\n return printNested(member, { typeName, nestedInObject: true })\n }\n\n // Without a discriminator, keep the union type but guard each indexed access (see\n // `indexedTypeName`) so a key carried by only some branches resolves to `unknown`\n // rather than erroring with TS2339.\n return printNested(member, { typeName: baseTypeName, nestedInObject: true, nestedInUnion: true })\n })\n .map(({ output }) => output)\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.union(items)\n },\n intersection(node): string {\n const items: Array<string> = mapSchemaMembers(node, (member) =>\n printNested(member, {\n nestedInObject: true,\n }),\n )\n .map(({ output }) => output)\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.and(items)\n },\n array(node): string {\n const items: Array<string> = mapSchemaItems(node, (member) =>\n printNested(member, {\n typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[number]` : undefined,\n nestedInObject: true,\n }),\n )\n .map(({ output }) => output)\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.array(items, node.min, node.max)\n },\n tuple(node): string {\n const items: Array<string> = (node.items ?? [])\n .map((member, index) =>\n printNested(member, {\n typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[${index}]` : undefined,\n nestedInObject: true,\n }),\n )\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.tuple(items)\n },\n object(node): string {\n const cyclicSchemas = this.options.cyclicSchemas\n const entries = (node.properties ?? []).map((property): string => {\n if (this.options.mapper && Object.hasOwn(this.options.mapper, property.name)) {\n return `${objectKey(property.name)}: ${this.options.mapper[property.name]}`\n }\n\n const value: string =\n printNested(property.schema, {\n typeName: this.options.typeName ? indexedTypeName(this.options.typeName, property.name, this.options.nestedInUnion) : undefined,\n nestedInObject: true,\n }) ?? 'undefined'\n\n // When the property's schema transitively references a schema that is\n // part of a circular dependency (other than the current schema itself),\n // emit a memoizing lazy getter. On first access it computes the value,\n // replaces itself with a plain data property via Object.defineProperty,\n // and returns the cached value – so every subsequent read is stable.\n if (cyclicSchemas && containsCircularRef(property.schema, { circularSchemas: cyclicSchemas, excludeName: this.options.schemaName })) {\n return `get ${objectKey(property.name)}() { const _value = ${value}; Object.defineProperty(this, ${JSON.stringify(property.name)}, { value: _value, configurable: true, writable: true, enumerable: true }); return _value }`\n }\n\n return `${objectKey(property.name)}: ${value}`\n })\n\n return buildObject(entries)\n },\n ...options.nodes,\n },\n print(node) {\n return this.transform(node) ?? null\n },\n }\n})\n","import { getPerContentTypeName, resolveContentTypeVariants } from '@internals/shared'\nimport { aliasConflictingImports, filterUsedImports, rewriteAliasedImports } from '@internals/utils'\nimport { ast, defineGenerator } from '@kubb/core'\nimport { caseParams } from '@kubb/ast/utils'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { File, jsxRenderer } from '@kubb/renderer-jsx'\nimport { Faker } from '../components/Faker.tsx'\nimport { printerFaker } from '../printers/printerFaker.ts'\nimport type { PluginFaker } from '../types.ts'\nimport { buildResponseUnionSchema, canOverrideSchema, localeToFakerImport, resolveParamNameByLocation, resolveTypeReference } from '../utils.ts'\n\n/**\n * Built-in generator for `@kubb/plugin-faker`. Emits one `createX` factory\n * per schema in the spec plus per-operation request/response factories. Each\n * factory returns a value matching the corresponding TypeScript type from\n * `@kubb/plugin-ts`.\n */\nexport const fakerGenerator = defineGenerator<PluginFaker>({\n name: 'faker',\n renderer: jsxRenderer,\n schema(node, ctx) {\n const { adapter, config, resolver, root } = ctx\n const { output, group, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options\n const pluginTs = ctx.driver.getPlugin(pluginTsName)\n\n if (!node.name || !pluginTs) {\n return\n }\n\n const tsResolver = ctx.driver.getResolver(pluginTsName)\n\n const schemaName = node.name\n const isEnumSchema = !!ast.narrowSchema(node, ast.schemaTypes.enum)\n const tsEnumType = pluginTs.options?.enum?.type\n const tsEnumTypeSuffix = pluginTs.options?.enum?.typeSuffix ?? 'Key'\n const schemaTypeName =\n isEnumSchema && tsEnumType === 'asConst' ? tsResolver.resolveEnumKeyName({ name: schemaName }, tsEnumTypeSuffix) : tsResolver.resolveTypeName(schemaName)\n const meta = {\n name: resolver.resolveName(schemaName),\n file: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }),\n typeName: schemaTypeName,\n typeFile: tsResolver.resolveFile(\n { name: schemaName, extname: '.ts' },\n { root, output: pluginTs.options?.output ?? output, group: pluginTs.options?.group ?? undefined },\n ),\n } as const\n const canOverride = canOverrideSchema(node)\n const cyclicSchemas = new Set<string>(ctx.meta.circularNames)\n const printerInstance = printerFaker({\n resolver,\n schemaName,\n typeName: meta.typeName,\n dateParser,\n regexGenerator,\n mapper,\n nodes: printer?.nodes,\n cyclicSchemas,\n })\n const fakerText = printerInstance.print(node) ?? 'undefined'\n const typeReference = resolveTypeReference({\n node,\n canOverride,\n name: meta.name,\n typeName: meta.typeName,\n filePath: meta.file.path,\n typeFilePath: meta.typeFile.path,\n })\n\n const imports = adapter.getImports(node, (schemaName) => ({\n name: resolver.resolveName(schemaName),\n path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,\n }))\n const usedImports = filterUsedImports(imports, fakerText)\n\n return (\n <File\n baseName={meta.file.baseName}\n path={meta.file.path}\n meta={meta.file.meta}\n banner={resolver.resolveBanner(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n footer={resolver.resolveFooter(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n >\n <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path=\"@faker-js/faker\" />\n {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}\n {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}\n {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[meta.typeName]} />}\n {usedImports.map((imp) => (\n <File.Import key={[schemaName, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />\n ))}\n <Faker\n name={meta.name}\n typeName={typeReference.typeName}\n description={node.description}\n node={node}\n printer={printerInstance}\n seed={seed}\n canOverride={canOverride}\n />\n </File>\n )\n },\n operation(node, ctx) {\n const { adapter, config, resolver, root } = ctx\n const { output, group, paramsCasing, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options\n const pluginTs = ctx.driver.getPlugin(pluginTsName)\n\n if (!pluginTs) {\n return\n }\n\n const tsResolver = ctx.driver.getResolver(pluginTsName)\n\n const params = caseParams(node.parameters, paramsCasing)\n const paramEntries = params.map((param) => ({\n param,\n name: resolveParamNameByLocation(resolver, node, param),\n typeName: resolveParamNameByLocation(tsResolver, node, param),\n }))\n type RenderUnit = { schema: ast.SchemaNode | null; name: string; typeName: string; description?: string; skipImportNames: Array<string> }\n\n // Expands a content array into render units: one faker per content type plus a union faker\n // (named `baseName`) when more than one content type carries a schema, else a single faker.\n function expandContentUnits(\n entries: Array<{ contentType: string; schema?: ast.SchemaNode | null }>,\n baseName: string,\n tsBaseName: string,\n description: string | undefined,\n decorate?: (schema: ast.SchemaNode) => ast.SchemaNode,\n ): Array<RenderUnit> {\n const withSchema = entries.filter((entry) => entry.schema)\n if (withSchema.length <= 1) {\n const primary = withSchema[0] ?? entries[0]\n if (!primary?.schema) return []\n return [{ schema: decorate ? decorate(primary.schema) : primary.schema, name: baseName, typeName: tsBaseName, description, skipImportNames: [] }]\n }\n const variants = resolveContentTypeVariants(entries, baseName)\n const unionSchema = ast.factory.createSchema({\n type: 'union',\n members: variants.map((variant) => ast.factory.createSchema({ type: 'ref', name: variant.name })),\n })\n return [\n ...variants.map((variant) => ({\n schema: decorate ? decorate(variant.schema) : variant.schema,\n name: variant.name,\n typeName: getPerContentTypeName(tsBaseName, variant.suffix),\n description,\n skipImportNames: [],\n })),\n { schema: unionSchema, name: baseName, typeName: tsBaseName, description, skipImportNames: variants.map((variant) => variant.name) },\n ]\n }\n\n const responseUnits = node.responses.flatMap((response) =>\n expandContentUnits(\n response.content ?? [],\n resolver.resolveResponseStatusName(node, response.statusCode),\n tsResolver.resolveResponseStatusName(node, response.statusCode),\n response.description,\n ),\n )\n const dataUnits = expandContentUnits(\n node.requestBody?.content ?? [],\n resolver.resolveDataName(node),\n tsResolver.resolveDataName(node),\n node.requestBody?.description,\n (schema) => ({ ...schema, description: node.requestBody?.description ?? schema.description }),\n )\n const responseName = resolver.resolveResponseName(node)\n const localHelperNames = new Set([\n ...paramEntries.map((entry) => entry.name),\n ...responseUnits.map((unit) => unit.name),\n ...dataUnits.map((unit) => unit.name),\n responseName,\n ])\n const cyclicSchemas = new Set<string>(ctx.meta.circularNames)\n\n const meta = {\n file: resolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n { root, output, group: group ?? undefined },\n ),\n typeFile: tsResolver.resolveFile(\n {\n name: node.operationId,\n extname: '.ts',\n tag: node.tags[0] ?? 'default',\n path: node.path,\n },\n {\n root,\n output: pluginTs.options?.output ?? output,\n group: pluginTs.options?.group ?? undefined,\n },\n ),\n } as const\n\n function resolveMockImports(schema: ast.SchemaNode) {\n return adapter\n .getImports(schema, (schemaName) => ({\n name: resolver.resolveName(schemaName),\n path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,\n }))\n .filter((entry) => entry.path !== meta.file.path)\n }\n\n function renderEntry({\n schema,\n name,\n typeName,\n description,\n skipImportNames = [],\n }: {\n schema: ast.SchemaNode | null\n name: string\n typeName: string\n description?: string\n skipImportNames?: Array<string>\n }) {\n if (!schema) {\n return null\n }\n\n const canOverride = canOverrideSchema(schema)\n const printerInstance = printerFaker({\n resolver,\n schemaName: name,\n typeName,\n dateParser,\n regexGenerator,\n mapper,\n nodes: printer?.nodes,\n cyclicSchemas,\n })\n const fakerText = printerInstance.print(schema) ?? 'undefined'\n const usedImports = filterUsedImports(resolveMockImports(schema), fakerText, skipImportNames)\n const { imports, aliases } = aliasConflictingImports(usedImports, localHelperNames)\n const rewrittenFakerText = rewriteAliasedImports(fakerText, aliases)\n const typeReference = resolveTypeReference({\n node: schema,\n canOverride,\n name,\n typeName,\n filePath: meta.file.path,\n typeFilePath: meta.typeFile.path,\n })\n\n return (\n <>\n {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[typeName]} />}\n {imports.map((imp) => (\n <File.Import key={[name, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />\n ))}\n <Faker\n name={name}\n typeName={typeReference.typeName}\n description={description}\n node={schema}\n printer={{ ...printerInstance, print: () => rewrittenFakerText }}\n seed={seed}\n canOverride={canOverride}\n />\n </>\n )\n }\n\n return (\n <File\n baseName={meta.file.baseName}\n path={meta.file.path}\n meta={meta.file.meta}\n banner={resolver.resolveBanner(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n footer={resolver.resolveFooter(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n >\n <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path=\"@faker-js/faker\" />\n {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}\n {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}\n {paramEntries.map(({ param, name, typeName }) =>\n renderEntry({\n schema: param.schema,\n name,\n typeName,\n }),\n )}\n {responseUnits.map((unit) =>\n renderEntry({\n schema: unit.schema,\n name: unit.name,\n typeName: unit.typeName,\n description: unit.description,\n skipImportNames: unit.skipImportNames,\n }),\n )}\n {dataUnits.map((unit) =>\n renderEntry({\n schema: unit.schema,\n name: unit.name,\n typeName: unit.typeName,\n description: unit.description,\n skipImportNames: unit.skipImportNames,\n }),\n )}\n {renderEntry({\n schema: buildResponseUnionSchema(node, resolver),\n name: responseName,\n typeName: tsResolver.resolveResponseName(node),\n skipImportNames: responseUnits.map((unit) => unit.name),\n })}\n </File>\n )\n },\n})\n"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import "./chunk-C0LytTxp.js";
|
|
2
|
-
import { a as resolveParamNameByLocation, i as localeToFakerImport, n as buildResponseUnionSchema, o as resolveTypeReference, r as canOverrideSchema,
|
|
2
|
+
import { a as resolveParamNameByLocation, i as localeToFakerImport, n as buildResponseUnionSchema, o as resolveTypeReference, r as canOverrideSchema, t as Faker } from "./Faker-DUx7jvCo.js";
|
|
3
|
+
import { buildObject, caseParams, containsCircularRef, extractRefName, mapSchemaItems, mapSchemaMembers, objectKey, stringify, toRegExpString } from "@kubb/ast/utils";
|
|
3
4
|
import { ast, defineGenerator } from "@kubb/core";
|
|
4
5
|
import { pluginTsName } from "@kubb/plugin-ts";
|
|
5
|
-
import { File,
|
|
6
|
+
import { File, jsxRenderer } from "@kubb/renderer-jsx";
|
|
6
7
|
import { Fragment, jsx, jsxs } from "@kubb/renderer-jsx/jsx-runtime";
|
|
7
8
|
//#region ../../internals/utils/src/imports.ts
|
|
8
9
|
function escapeRegExp(value) {
|
|
@@ -49,40 +50,6 @@ function rewriteAliasedImports(text, aliases) {
|
|
|
49
50
|
return Array.from(aliases).reduce((acc, [name, alias]) => acc.replace(new RegExp(`\\b${escapeRegExp(name)}\\b`, "g"), alias), text);
|
|
50
51
|
}
|
|
51
52
|
//#endregion
|
|
52
|
-
//#region ../../internals/utils/src/object.ts
|
|
53
|
-
/**
|
|
54
|
-
* Serializes a primitive value to a JSON string literal, stripping any surrounding quote characters first.
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* stringify('hello') // '"hello"'
|
|
58
|
-
* stringify('"hello"') // '"hello"'
|
|
59
|
-
*/
|
|
60
|
-
function stringify(value) {
|
|
61
|
-
if (value === void 0 || value === null) return "\"\"";
|
|
62
|
-
return JSON.stringify(trimQuotes(value.toString()));
|
|
63
|
-
}
|
|
64
|
-
//#endregion
|
|
65
|
-
//#region ../../internals/utils/src/regexp.ts
|
|
66
|
-
/**
|
|
67
|
-
* Converts a pattern string into a `new RegExp(...)` constructor call or a regex literal string.
|
|
68
|
-
* Inline flags expressed as `^(?im)` prefixes are extracted and applied to the resulting expression.
|
|
69
|
-
* Pass `null` as the second argument to emit a `/pattern/flags` literal instead.
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* toRegExpString('^(?im)foo') // → 'new RegExp("foo", "im")'
|
|
73
|
-
* toRegExpString('^(?im)foo', null) // → '/foo/im'
|
|
74
|
-
*/
|
|
75
|
-
function toRegExpString(text, func = "RegExp") {
|
|
76
|
-
const raw = trimQuotes(text);
|
|
77
|
-
const match = raw.match(/^\^(\(\?([igmsuy]+)\))/i);
|
|
78
|
-
const replacementTarget = match?.[1] ?? "";
|
|
79
|
-
const matchedFlags = match?.[2];
|
|
80
|
-
const cleaned = raw.replace(/^\\?\//, "").replace(/\\?\/$/, "").replace(replacementTarget, "");
|
|
81
|
-
const { source, flags } = new RegExp(cleaned, matchedFlags);
|
|
82
|
-
if (func === null) return `/${source}/${flags}`;
|
|
83
|
-
return `new ${func}(${JSON.stringify(source)}${flags ? `, ${JSON.stringify(flags)}` : ""})`;
|
|
84
|
-
}
|
|
85
|
-
//#endregion
|
|
86
53
|
//#region ../../internals/shared/src/operation.ts
|
|
87
54
|
/**
|
|
88
55
|
* Maps a content type to the PascalCase suffix used to name per-content-type variants
|
|
@@ -269,7 +236,7 @@ const printerFaker = ast.definePrinter((options) => {
|
|
|
269
236
|
return fakerKeywordMapper.time(node.representation ?? "string", this.options.dateParser);
|
|
270
237
|
},
|
|
271
238
|
ref(node) {
|
|
272
|
-
const refName = node.ref ?
|
|
239
|
+
const refName = node.ref ? extractRefName(node.ref) ?? node.name ?? node.schema?.name : node.name ?? node.schema?.name;
|
|
273
240
|
if (!refName) throw new Error("Name not defined for ref node");
|
|
274
241
|
if (this.options.schemaName && refName === this.options.schemaName) return "undefined as any";
|
|
275
242
|
const resolvedName = node.ref ? this.options.resolver.resolveName(refName) : refName;
|
|
@@ -282,7 +249,7 @@ const printerFaker = ast.definePrinter((options) => {
|
|
|
282
249
|
union(node) {
|
|
283
250
|
const { discriminatorPropertyName } = node;
|
|
284
251
|
const baseTypeName = this.options.typeName;
|
|
285
|
-
const items = (node
|
|
252
|
+
const items = mapSchemaMembers(node, (member) => {
|
|
286
253
|
const value = discriminatorPropertyName ? getDiscriminatorValue(member, discriminatorPropertyName) : void 0;
|
|
287
254
|
if (baseTypeName && value !== void 0) return printNested(member, {
|
|
288
255
|
typeName: `Extract<NonNullable<${baseTypeName}>, { ${JSON.stringify(discriminatorPropertyName)}: ${parseEnumValue(value)} }>`,
|
|
@@ -293,18 +260,18 @@ const printerFaker = ast.definePrinter((options) => {
|
|
|
293
260
|
nestedInObject: true,
|
|
294
261
|
nestedInUnion: true
|
|
295
262
|
});
|
|
296
|
-
}).filter((item) => Boolean(item));
|
|
263
|
+
}).map(({ output }) => output).filter((item) => Boolean(item));
|
|
297
264
|
return fakerKeywordMapper.union(items);
|
|
298
265
|
},
|
|
299
266
|
intersection(node) {
|
|
300
|
-
const items = (node
|
|
267
|
+
const items = mapSchemaMembers(node, (member) => printNested(member, { nestedInObject: true })).map(({ output }) => output).filter((item) => Boolean(item));
|
|
301
268
|
return fakerKeywordMapper.and(items);
|
|
302
269
|
},
|
|
303
270
|
array(node) {
|
|
304
|
-
const items = (node
|
|
271
|
+
const items = mapSchemaItems(node, (member) => printNested(member, {
|
|
305
272
|
typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[number]` : void 0,
|
|
306
273
|
nestedInObject: true
|
|
307
|
-
})).filter((item) => Boolean(item));
|
|
274
|
+
})).map(({ output }) => output).filter((item) => Boolean(item));
|
|
308
275
|
return fakerKeywordMapper.array(items, node.min, node.max);
|
|
309
276
|
},
|
|
310
277
|
tuple(node) {
|
|
@@ -316,18 +283,18 @@ const printerFaker = ast.definePrinter((options) => {
|
|
|
316
283
|
},
|
|
317
284
|
object(node) {
|
|
318
285
|
const cyclicSchemas = this.options.cyclicSchemas;
|
|
319
|
-
return
|
|
320
|
-
if (this.options.mapper && Object.hasOwn(this.options.mapper, property.name)) return
|
|
286
|
+
return buildObject((node.properties ?? []).map((property) => {
|
|
287
|
+
if (this.options.mapper && Object.hasOwn(this.options.mapper, property.name)) return `${objectKey(property.name)}: ${this.options.mapper[property.name]}`;
|
|
321
288
|
const value = printNested(property.schema, {
|
|
322
289
|
typeName: this.options.typeName ? indexedTypeName(this.options.typeName, property.name, this.options.nestedInUnion) : void 0,
|
|
323
290
|
nestedInObject: true
|
|
324
291
|
}) ?? "undefined";
|
|
325
|
-
if (cyclicSchemas &&
|
|
292
|
+
if (cyclicSchemas && containsCircularRef(property.schema, {
|
|
326
293
|
circularSchemas: cyclicSchemas,
|
|
327
294
|
excludeName: this.options.schemaName
|
|
328
|
-
})) return `get ${property.name}() { const _value = ${value}; Object.defineProperty(this, ${JSON.stringify(property.name)}, { value: _value, configurable: true, writable: true, enumerable: true }); return _value }`;
|
|
329
|
-
return
|
|
330
|
-
})
|
|
295
|
+
})) return `get ${objectKey(property.name)}() { const _value = ${value}; Object.defineProperty(this, ${JSON.stringify(property.name)}, { value: _value, configurable: true, writable: true, enumerable: true }); return _value }`;
|
|
296
|
+
return `${objectKey(property.name)}: ${value}`;
|
|
297
|
+
}));
|
|
331
298
|
},
|
|
332
299
|
...options.nodes
|
|
333
300
|
},
|
|
@@ -346,7 +313,7 @@ const printerFaker = ast.definePrinter((options) => {
|
|
|
346
313
|
*/
|
|
347
314
|
const fakerGenerator = defineGenerator({
|
|
348
315
|
name: "faker",
|
|
349
|
-
renderer:
|
|
316
|
+
renderer: jsxRenderer,
|
|
350
317
|
schema(node, ctx) {
|
|
351
318
|
const { adapter, config, resolver, root } = ctx;
|
|
352
319
|
const { output, group, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options;
|
|
@@ -354,11 +321,10 @@ const fakerGenerator = defineGenerator({
|
|
|
354
321
|
if (!node.name || !pluginTs) return;
|
|
355
322
|
const tsResolver = ctx.driver.getResolver(pluginTsName);
|
|
356
323
|
const schemaName = node.name;
|
|
357
|
-
const mode = ctx.getMode(output);
|
|
358
324
|
const isEnumSchema = !!ast.narrowSchema(node, ast.schemaTypes.enum);
|
|
359
|
-
const tsEnumType = pluginTs.options?.
|
|
360
|
-
const tsEnumTypeSuffix = pluginTs.options?.
|
|
361
|
-
const schemaTypeName = isEnumSchema &&
|
|
325
|
+
const tsEnumType = pluginTs.options?.enum?.type;
|
|
326
|
+
const tsEnumTypeSuffix = pluginTs.options?.enum?.typeSuffix ?? "Key";
|
|
327
|
+
const schemaTypeName = isEnumSchema && tsEnumType === "asConst" ? tsResolver.resolveEnumKeyName({ name: schemaName }, tsEnumTypeSuffix) : tsResolver.resolveTypeName(schemaName);
|
|
362
328
|
const meta = {
|
|
363
329
|
name: resolver.resolveName(schemaName),
|
|
364
330
|
file: resolver.resolveFile({
|
|
@@ -410,7 +376,7 @@ const fakerGenerator = defineGenerator({
|
|
|
410
376
|
output,
|
|
411
377
|
group: group ?? void 0
|
|
412
378
|
}).path
|
|
413
|
-
}))
|
|
379
|
+
})), fakerText);
|
|
414
380
|
return /* @__PURE__ */ jsxs(File, {
|
|
415
381
|
baseName: meta.file.baseName,
|
|
416
382
|
path: meta.file.path,
|
|
@@ -453,7 +419,7 @@ const fakerGenerator = defineGenerator({
|
|
|
453
419
|
path: typeReference.importPath,
|
|
454
420
|
name: [meta.typeName]
|
|
455
421
|
}),
|
|
456
|
-
|
|
422
|
+
usedImports.map((imp) => /* @__PURE__ */ jsx(File.Import, {
|
|
457
423
|
root: meta.file.path,
|
|
458
424
|
path: imp.path,
|
|
459
425
|
name: imp.name
|
|
@@ -480,7 +446,7 @@ const fakerGenerator = defineGenerator({
|
|
|
480
446
|
const pluginTs = ctx.driver.getPlugin(pluginTsName);
|
|
481
447
|
if (!pluginTs) return;
|
|
482
448
|
const tsResolver = ctx.driver.getResolver(pluginTsName);
|
|
483
|
-
const paramEntries =
|
|
449
|
+
const paramEntries = caseParams(node.parameters, paramsCasing).map((param) => ({
|
|
484
450
|
param,
|
|
485
451
|
name: resolveParamNameByLocation(resolver, node, param),
|
|
486
452
|
typeName: resolveParamNameByLocation(tsResolver, node, param)
|
|
@@ -499,9 +465,9 @@ const fakerGenerator = defineGenerator({
|
|
|
499
465
|
}];
|
|
500
466
|
}
|
|
501
467
|
const variants = resolveContentTypeVariants(entries, baseName);
|
|
502
|
-
const unionSchema = ast.createSchema({
|
|
468
|
+
const unionSchema = ast.factory.createSchema({
|
|
503
469
|
type: "union",
|
|
504
|
-
members: variants.map((variant) => ast.createSchema({
|
|
470
|
+
members: variants.map((variant) => ast.factory.createSchema({
|
|
505
471
|
type: "ref",
|
|
506
472
|
name: variant.name
|
|
507
473
|
}))
|
|
@@ -690,4 +656,4 @@ const fakerGenerator = defineGenerator({
|
|
|
690
656
|
//#endregion
|
|
691
657
|
export { printerFaker as n, fakerGenerator as t };
|
|
692
658
|
|
|
693
|
-
//# sourceMappingURL=fakerGenerator-
|
|
659
|
+
//# sourceMappingURL=fakerGenerator-D5Bcy5WY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fakerGenerator-D5Bcy5WY.js","names":[],"sources":["../../../internals/utils/src/imports.ts","../../../internals/shared/src/operation.ts","../src/printers/printerFaker.ts","../src/generators/fakerGenerator.tsx"],"sourcesContent":["export type ImportName = string | { propertyName: string; name?: string }\n\nexport type ImportEntry = {\n name: string | Array<ImportName>\n path: string\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction getImportNames(entry: ImportEntry): Array<string> {\n return (Array.isArray(entry.name) ? entry.name : [entry.name])\n .map((name) => {\n if (typeof name === 'string') {\n return name\n }\n\n return name.name ?? name.propertyName\n })\n .filter((name): name is string => Boolean(name))\n}\n\nexport function filterUsedImports(imports: Array<ImportEntry>, text: string, skipImportNames: Array<string> = []): Array<ImportEntry> {\n const skip = new Set(skipImportNames)\n\n return imports.filter((entry) => {\n const names = getImportNames(entry)\n\n return names.some((name) => {\n if (skip.has(name)) {\n return false\n }\n\n return new RegExp(`\\\\b${escapeRegExp(name)}\\\\b(?=\\\\s*\\\\()`).test(text)\n })\n })\n}\n\nexport function aliasConflictingImports(\n imports: Array<ImportEntry>,\n reservedNames: Iterable<string>,\n): { imports: Array<ImportEntry>; aliases: Map<string, string> } {\n const reservedNameSet = new Set(reservedNames)\n const aliases = new Map<string, string>()\n\n const aliasedImports = imports.map((entry) => {\n const names = Array.isArray(entry.name) ? entry.name : [entry.name]\n const aliasedNames = names.map((item): ImportName => {\n if (typeof item !== 'string' || !reservedNameSet.has(item)) {\n return item\n }\n\n const alias = `${item}Schema`\n aliases.set(item, alias)\n\n return { propertyName: item, name: alias }\n })\n\n return aliasedNames.some((item) => typeof item === 'object' && item.name)\n ? {\n ...entry,\n name: aliasedNames,\n }\n : entry\n })\n\n return {\n imports: aliasedImports,\n aliases,\n }\n}\n\nexport function rewriteAliasedImports(text: string, aliases: ReadonlyMap<string, string>): string {\n return Array.from(aliases).reduce((acc, [name, alias]) => acc.replace(new RegExp(`\\\\b${escapeRegExp(name)}\\\\b`, 'g'), alias), text)\n}\n","import { Url } from '@internals/utils'\nimport { ast, type ResolverFileParams } from '@kubb/core'\nimport { caseParams } from '@kubb/ast/utils'\n\n/**\n * Builds the `ResolverFileParams` every operation generator passes to\n * `resolver.resolveFile`: a file named `name`, tagged by the operation's first\n * tag (or `'default'`), at the operation's path. Centralizes the entry object\n * that was repeated at dozens of call sites across the client and query plugins.\n *\n * @example\n * ```ts\n * resolver.resolveFile(operationFileEntry(node, node.operationId), { root, output, group })\n * ```\n */\nexport function operationFileEntry(node: ast.OperationNode, name: string, extname: ResolverFileParams['extname'] = '.ts'): ResolverFileParams {\n return {\n name,\n extname,\n tag: node.tags[0] ?? 'default',\n path: node.path,\n }\n}\n\nexport type ContentTypeInfo = {\n contentTypes: string[]\n isMultipleContentTypes: boolean\n contentTypeUnion: string\n defaultContentType: string\n hasFormData: boolean\n}\n\nexport type RequestConfigResolver = {\n resolveDataName(node: ast.OperationNode): string\n}\n\nexport type ResponseStatusNameResolver = {\n resolveResponseStatusName(node: ast.OperationNode, statusCode: ast.StatusCode): string\n}\n\nexport type ResponseNameResolver = ResponseStatusNameResolver & {\n resolveResponseName(node: ast.OperationNode): string\n}\n\nexport type OperationTypeNameResolver = RequestConfigResolver &\n ResponseNameResolver & {\n resolvePathParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveQueryParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveHeaderParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n }\n\nexport type OperationCommentLink = 'pathTemplate' | 'urlPath' | false | ((node: ast.OperationNode) => string | undefined)\n\nexport type BuildOperationCommentsOptions = {\n link?: OperationCommentLink\n linkPosition?: 'beforeDeprecated' | 'afterDeprecated'\n splitLines?: boolean\n}\n\ntype ResponseLike = {\n statusCode: ast.StatusCode | number | string\n}\n\nexport type OperationParameterGroups = Record<ast.ParameterNode['in'], Array<ast.ParameterNode>>\n\nexport type ResolveOperationTypeNameOptions = {\n paramsCasing?: 'camelcase'\n responseStatusNames?: boolean | 'error'\n exclude?: ReadonlyArray<string | undefined>\n order?: 'params-first' | 'body-response-first'\n}\n\nfunction getOperationLink(node: ast.OperationNode, link: OperationCommentLink): string | null {\n if (!link) {\n return null\n }\n\n if (typeof link === 'function') {\n return link(node) ?? null\n }\n\n if (link === 'urlPath') {\n return node.path ? `{@link ${Url.toPath(node.path)}}` : null\n }\n\n return node.path ? `{@link ${node.path.replaceAll('{', ':').replaceAll('}', '')}}` : null\n}\n\nexport function getContentTypeInfo(node: ast.OperationNode): ContentTypeInfo {\n const contentTypes = node.requestBody?.content?.map((e) => e.contentType) ?? []\n const isMultipleContentTypes = contentTypes.length > 1\n\n return {\n contentTypes,\n isMultipleContentTypes,\n contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(' | ') : '',\n defaultContentType: contentTypes[0] ?? 'application/json',\n hasFormData: contentTypes.some((ct) => ct === 'multipart/form-data'),\n }\n}\n\nexport type ResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'\n\n/**\n * Derives the default `responseType` for an operation from its primary success response.\n *\n * Returns a value only when that response declares a single non-JSON content type — a binary type\n * (`application/octet-stream`, `application/pdf`, `image/*`, `audio/*`, `video/*`) maps to `'blob'`\n * and other `text/*` maps to `'text'`. Otherwise `undefined`, leaving the runtime client's\n * `Content-Type` auto-detection in charge.\n */\nexport function getResponseType(node: ast.OperationNode): ResponseType | undefined {\n const contentTypes = getPrimarySuccessResponse(node)?.content?.map((entry) => entry.contentType) ?? []\n if (contentTypes.length !== 1) return undefined\n\n const baseType = contentTypes[0]!.split(';')[0]!.trim().toLowerCase()\n if (baseType === 'application/json' || baseType.endsWith('+json') || baseType === 'text/json') return undefined\n if (baseType.startsWith('text/')) return 'text'\n if (baseType === 'application/octet-stream' || baseType === 'application/pdf' || /^(image|audio|video)\\//.test(baseType)) return 'blob'\n return undefined\n}\n\n/**\n * Maps a content type to the PascalCase suffix used to name per-content-type variants\n * (e.g. `application/json` → `Json`, `application/xml` → `Xml`, `multipart/form-data` → `FormData`).\n */\nexport function getContentTypeSuffix(contentType: string): string {\n const baseType = contentType.split(';')[0]!.trim()\n if (baseType === 'application/json') return 'Json'\n if (baseType === 'multipart/form-data') return 'FormData'\n if (baseType === 'application/x-www-form-urlencoded') return 'FormUrlEncoded'\n const subtype = baseType.split('/').pop() ?? baseType\n const parts = subtype.split(/[^a-zA-Z0-9]+/).filter(Boolean)\n if (parts.length === 0) return 'Unknown'\n return parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join('')\n}\n\n/**\n * Appends a content-type suffix to a base name, keeping a trailing `Data` segment last\n * (e.g. `AddPetData` + `Json` → `AddPetJsonData`, `AddPetStatus200` + `Xml` → `AddPetStatus200Xml`).\n */\nexport function getPerContentTypeName(baseName: string, suffix: string): string {\n if (baseName.endsWith('Data')) {\n return suffix.endsWith('Data') ? baseName.slice(0, -4) + suffix : `${baseName.slice(0, -4)}${suffix}Data`\n }\n return baseName + suffix\n}\n\nexport type ContentVariantInput = { contentType: string; schema?: ast.SchemaNode | null; keysToOmit?: Array<string> | null }\nexport type ContentVariant = { name: string; suffix: string; schema: ast.SchemaNode; keysToOmit?: Array<string> | null; contentType: string }\n\n/**\n * Resolves per-content-type variant names for a set of content entries, deduplicating suffix\n * collisions with a numeric counter. Entries without a schema are skipped. The returned `suffix` is\n * the final (possibly counter-augmented) value, so callers can derive parallel names in another\n * namespace (e.g. plugin-faker deriving the matching plugin-ts type name).\n */\nexport function resolveContentTypeVariants(entries: Array<ContentVariantInput>, baseName: string): Array<ContentVariant> {\n const usedNames = new Set<string>()\n return entries\n .filter((entry) => entry.schema)\n .map((entry) => {\n const baseSuffix = getContentTypeSuffix(entry.contentType)\n let suffix = baseSuffix\n let name = getPerContentTypeName(baseName, suffix)\n let counter = 2\n while (usedNames.has(name)) {\n suffix = `${baseSuffix}${counter++}`\n name = getPerContentTypeName(baseName, suffix)\n }\n usedNames.add(name)\n return { name, suffix, schema: entry.schema!, keysToOmit: entry.keysToOmit, contentType: entry.contentType }\n })\n}\n\nexport function buildRequestConfigType(node: ast.OperationNode, resolver: RequestConfigResolver): string {\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : null\n const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node)\n const configType = requestName ? `Partial<RequestConfig<${requestName}>>` : 'Partial<RequestConfig>'\n const configProps = ['client?: Client', isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : null].filter(Boolean).join('; ')\n\n return `${configType} & { ${configProps} }`\n}\n\nexport function buildOperationComments(node: ast.OperationNode, options: BuildOperationCommentsOptions = {}): Array<string> {\n const { link = 'pathTemplate', linkPosition = 'afterDeprecated', splitLines = false } = options\n const linkComment = getOperationLink(node, link)\n const comments =\n linkPosition === 'beforeDeprecated'\n ? [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, linkComment, node.deprecated && '@deprecated']\n : [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, node.deprecated && '@deprecated', linkComment]\n\n const filteredComments = comments.filter((comment): comment is string => Boolean(comment))\n\n if (!splitLines) {\n return filteredComments\n }\n\n return filteredComments.flatMap((text) => text.split(/\\r?\\n/).map((line) => line.trim())).filter((comment): comment is string => Boolean(comment))\n}\n\nexport function getOperationParameters(node: ast.OperationNode, options: { paramsCasing?: 'camelcase' } = {}): OperationParameterGroups {\n const params = caseParams(node.parameters, options.paramsCasing)\n\n return {\n path: params.filter((param) => param.in === 'path'),\n query: params.filter((param) => param.in === 'query'),\n header: params.filter((param) => param.in === 'header'),\n cookie: params.filter((param) => param.in === 'cookie'),\n }\n}\n\nexport function getStatusCodeNumber(statusCode: ast.StatusCode | number | string): number | null {\n const code = Number(statusCode)\n\n return Number.isNaN(code) ? null : code\n}\n\nexport function isSuccessStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== null && code >= 200 && code < 300\n}\n\nexport function isErrorStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== null && code >= 400\n}\n\nexport function getSuccessResponses<TResponse extends ResponseLike>(responses: ReadonlyArray<TResponse>): Array<TResponse> {\n return responses.filter((response) => isSuccessStatusCode(response.statusCode))\n}\n\nexport function getOperationSuccessResponses(node: ast.OperationNode): Array<ast.ResponseNode> {\n return getSuccessResponses(node.responses)\n}\n\nexport function getPrimarySuccessResponse(node: ast.OperationNode): ast.ResponseNode | null {\n return getOperationSuccessResponses(node)[0] ?? null\n}\n\nexport function resolveErrorNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isErrorStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveSuccessNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isSuccessStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveStatusCodeNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses.map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\n/**\n * Builds the discriminated union type string for `dataReturnType: 'full'` return shapes.\n * Each member is `{ status: N; data: StatusNType; statusText: string }`.\n */\nexport function buildStatusUnionType(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string {\n const members = node.responses.map((r) => {\n const typeName = resolver.resolveResponseStatusName(node, r.statusCode)\n const statusCode = Number.parseInt(r.statusCode, 10)\n const statusLiteral = Number.isNaN(statusCode) ? 'number' : String(statusCode)\n return `{ status: ${statusLiteral}; data: ${typeName}; statusText: string }`\n })\n if (members.length === 1) return members[0]!\n return `(${members.join(' | ')})`\n}\n\nconst typeNamesByResolver = new WeakMap<OperationTypeNameResolver, Map<string, string[]>>()\n\nexport function resolveOperationTypeNames(\n node: ast.OperationNode,\n resolver: OperationTypeNameResolver,\n options: ResolveOperationTypeNameOptions = {},\n): string[] {\n const cacheKey = `${node.operationId}\\0${options.paramsCasing ?? ''}\\0${options.order ?? ''}\\0${options.responseStatusNames ?? ''}\\0${(options.exclude ?? []).join(',')}`\n let byResolver = typeNamesByResolver.get(resolver)\n if (byResolver) {\n const cached = byResolver.get(cacheKey)\n if (cached) return cached\n } else {\n byResolver = new Map()\n typeNamesByResolver.set(resolver, byResolver)\n }\n\n const { path, query, header } = getOperationParameters(node, { paramsCasing: options.paramsCasing })\n const responseStatusNames =\n options.responseStatusNames === 'error'\n ? resolveErrorNames(node, resolver)\n : options.responseStatusNames === false\n ? []\n : resolveStatusCodeNames(node, resolver)\n const exclude = new Set(options.exclude ?? [])\n const paramNames = [\n ...path.map((param) => resolver.resolvePathParamsName(node, param)),\n ...query.map((param) => resolver.resolveQueryParamsName(node, param)),\n ...header.map((param) => resolver.resolveHeaderParamsName(node, param)),\n ]\n const bodyAndResponseNames = [node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : null, resolver.resolveResponseName(node)]\n const names =\n options.order === 'body-response-first'\n ? [...bodyAndResponseNames, ...paramNames, ...responseStatusNames]\n : [...paramNames, ...bodyAndResponseNames, ...responseStatusNames]\n\n const result = names.filter((name): name is string => Boolean(name) && !exclude.has(name as string))\n byResolver.set(cacheKey, result)\n return result\n}\n\nexport function resolveResponseTypes(node: ast.OperationNode, resolver: ResponseNameResolver): Array<[statusCode: number | 'default', typeName: string]> {\n const types: Array<[number | 'default', string]> = []\n\n for (const response of node.responses) {\n if (response.statusCode === 'default') {\n types.push(['default', resolver.resolveResponseName(node)])\n continue\n }\n\n const code = getStatusCodeNumber(response.statusCode)\n if (code === null) {\n continue\n }\n\n types.push([code, isSuccessStatusCode(code) ? resolver.resolveResponseName(node) : resolver.resolveResponseStatusName(node, response.statusCode)])\n }\n\n return types\n}\n\nexport function findSuccessStatusCode(responses: Array<{ statusCode: ast.StatusCode | number | string }>): ast.StatusCode | null {\n for (const response of responses) {\n if (isSuccessStatusCode(response.statusCode)) {\n return response.statusCode as ast.StatusCode\n }\n }\n\n return null\n}\n","import { buildObject, extractRefName, mapSchemaItems, mapSchemaMembers, objectKey, stringify, toRegExpString } from '@kubb/ast/utils'\nimport { ast } from '@kubb/core'\nimport { containsCircularRef } from '@kubb/ast/utils'\nimport type { PluginFaker, ResolverFaker } from '../types.ts'\n\n/**\n * Partial map of node-type overrides for the Faker printer. Each key is a\n * `SchemaType` (`'string'`, `'date'`, ...) and each handler returns the\n * Faker expression for that schema as a string. Use `this.transform` to\n * recurse into nested schema nodes and `this.options` to read printer options.\n *\n * @example Override the integer handler\n * ```ts\n * pluginFaker({\n * printer: {\n * nodes: {\n * integer() {\n * return 'faker.number.float()'\n * },\n * },\n * },\n * })\n * ```\n */\nexport type PrinterFakerNodes = ast.PrinterPartial<string, PrinterFakerOptions>\n\n/**\n * Options passed to the Faker printer at instantiation: the parser library\n * for date strings, the regex generator, the user-supplied schema-name\n * mapper, and the resolver used to compute identifiers.\n */\nexport type PrinterFakerOptions = {\n dateParser?: PluginFaker['resolvedOptions']['dateParser']\n regexGenerator?: PluginFaker['resolvedOptions']['regexGenerator']\n mapper?: PluginFaker['resolvedOptions']['mapper']\n resolver: ResolverFaker\n typeName?: string\n schemaName?: string\n nestedInObject?: boolean\n /**\n * Set while printing the members of a union (`oneOf`). Object properties then index their\n * type as `(NonNullable<T> & Record<K, unknown>)[K]` instead of `NonNullable<T>[K]`, so a key\n * carried by only some branches stays valid (a plain index would be a TS2339).\n */\n nestedInUnion?: boolean\n nodes?: PrinterFakerNodes\n /**\n * Names of schemas that participate in a circular dependency chain.\n * Properties whose schema transitively references one of these are emitted\n * as lazy getters so that user overrides via the `data` parameter prevent\n * the recursive faker call from ever executing (avoiding stack overflow).\n */\n cyclicSchemas?: ReadonlySet<string>\n}\n\n/**\n * Factory options for the Faker printer, defining input/output types and configuration.\n */\nexport type PrinterFakerFactory = ast.PrinterFactoryOptions<'faker', PrinterFakerOptions, string, string>\n\nconst fakerKeywordMapper = {\n any: () => 'undefined',\n unknown: () => 'undefined',\n void: () => 'undefined',\n number: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.number.float({ min: ${min}, max: ${max} })`\n }\n\n if (max !== undefined) {\n return `faker.number.float({ max: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.number.float({ min: ${min} })`\n }\n\n return 'faker.number.float()'\n },\n integer: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.number.int({ min: ${min}, max: ${max} })`\n }\n\n if (max !== undefined) {\n return `faker.number.int({ max: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.number.int({ min: ${min} })`\n }\n\n return 'faker.number.int()'\n },\n bigint: () => 'faker.number.bigInt()',\n string: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.string.alpha({ length: { min: ${min}, max: ${max} } })`\n }\n\n if (max !== undefined) {\n return `faker.string.alpha({ length: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.string.alpha({ length: ${min} })`\n }\n\n return 'faker.string.alpha()'\n },\n boolean: () => 'faker.datatype.boolean()',\n null: () => 'null',\n array: (items: Array<string> = [], min?: number, max?: number) => {\n if (items.length > 1) {\n return `faker.helpers.arrayElements([${items.join(', ')}])`\n }\n\n const item = items.at(0)\n\n if (min !== undefined && max !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: { min: ${min}, max: ${max} }})`\n }\n\n if (min !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: ${min} })`\n }\n\n if (max !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: { min: 0, max: ${max} }})`\n }\n\n return `faker.helpers.multiple(() => (${item}))`\n },\n tuple: (items: Array<string> = []) => `[${items.join(', ')}]`,\n enum: (items: Array<string | number | boolean | undefined> = [], type = 'any') => `faker.helpers.arrayElement<${type}>([${items.join(', ')}])`,\n union: (items: Array<string> = []) => `faker.helpers.arrayElement<any>([${items.join(', ')}])`,\n datetime: () => 'faker.date.anytime().toISOString()',\n date: (representation: 'date' | 'string' = 'string', parser: PluginFaker['resolvedOptions']['dateParser'] = 'faker') => {\n if (representation === 'string') {\n if (parser !== 'faker') {\n return `${parser}(faker.date.anytime()).format(\"YYYY-MM-DD\")`\n }\n\n return 'faker.date.anytime().toISOString().substring(0, 10)'\n }\n\n if (parser !== 'faker') {\n throw new Error(`type '${representation}' and parser '${parser}' can not work together`)\n }\n\n return 'faker.date.anytime()'\n },\n time: (representation: 'date' | 'string' = 'string', parser: PluginFaker['resolvedOptions']['dateParser'] = 'faker') => {\n if (representation === 'string') {\n if (parser !== 'faker') {\n return `${parser}(faker.date.anytime()).format(\"HH:mm:ss\")`\n }\n\n return 'faker.date.anytime().toISOString().substring(11, 19)'\n }\n\n if (parser !== 'faker') {\n throw new Error(`type '${representation}' and parser '${parser}' can not work together`)\n }\n\n return 'faker.date.anytime()'\n },\n uuid: () => 'faker.string.uuid()',\n url: () => 'faker.internet.url()',\n and: (items: Array<string> = []) => {\n if (items.length === 0) {\n return '{}'\n }\n\n if (items.length === 1) {\n return items[0] ?? '{}'\n }\n\n return `{...${items.join(', ...')}}`\n },\n matches: (value = '', regexGenerator: 'faker' | 'randexp' = 'faker') => {\n if (regexGenerator === 'randexp') {\n return `${toRegExpString(value, 'RandExp')}.gen()`\n }\n\n return `faker.helpers.fromRegExp(\"${value}\")`\n },\n email: () => 'faker.internet.email()',\n blob: () => 'faker.image.url() as unknown as Blob',\n} as const\n\nfunction getEnumValues(node: ast.EnumSchemaNode): Array<string | number | boolean | undefined> {\n if (node.namedEnumValues?.length) {\n return node.namedEnumValues.map((item) => item.value as string | number | boolean | undefined)\n }\n\n return (node.enumValues ?? []) as Array<string | number | boolean | undefined>\n}\n\nfunction parseEnumValue(value: string | number | boolean | undefined) {\n if (typeof value === 'string') {\n return stringify(value)\n }\n\n return value\n}\n\n/** Reads the discriminator literal off a variant, or `undefined` when it can't be determined. */\nfunction getDiscriminatorValue(member: ast.SchemaNode, discriminatorPropertyName: string) {\n const prop = ast.narrowSchema(member, 'object')?.properties?.find((p) => p.name === discriminatorPropertyName)\n const enumNode = prop ? ast.narrowSchema(prop.schema, 'enum') : null\n\n return enumNode ? getEnumValues(enumNode)[0] : undefined\n}\n\n/**\n * Type expression for an object property's value, indexed off the parent `typeName`.\n *\n * In a union (`oneOf`), a key that only some branches declare turns a plain `NonNullable<T>[K]`\n * into a TS2339 error, so union members guard the access. The breakdown is below.\n */\nfunction indexedTypeName(typeName: string, propertyName: string, nestedInUnion?: boolean): string {\n const key = JSON.stringify(propertyName)\n\n // `(NonNullable<T> & Record<K, unknown>)[K]`, read inside-out:\n // NonNullable<T> strips null and undefined from the parent type T.\n // & Record<K, unknown> forces every branch to have key K. A branch that already declares K\n // keeps it (`T[K] & unknown` is `T[K]`); a branch missing K gains it as `unknown`.\n // [K] reads the key, which is now always present, so it never hits TS2339.\n // For a single object T the intersection does nothing, leaving `T[K]`.\n return nestedInUnion ? `(NonNullable<${typeName}> & Record<${key}, unknown>)[${key}]` : `NonNullable<${typeName}>[${key}]`\n}\n\n/**\n * Creates a Faker printer that generates mock data generation code from schema nodes.\n * Handles circular references gracefully by emitting memoizing getters for cyclic properties.\n */\nexport const printerFaker: (options: PrinterFakerOptions) => ast.Printer<PrinterFakerFactory> = ast.definePrinter<PrinterFakerFactory>((options) => {\n const printNested = (node: ast.SchemaNode, overrideOptions: Partial<PrinterFakerOptions> = {}): string => {\n return (\n printerFaker({\n ...options,\n ...overrideOptions,\n nodes: options.nodes,\n }).print(node) ?? 'undefined'\n )\n }\n\n return {\n name: 'faker',\n options,\n nodes: {\n any: () => fakerKeywordMapper.any(),\n unknown: () => fakerKeywordMapper.unknown(),\n void: () => fakerKeywordMapper.void(),\n boolean: () => fakerKeywordMapper.boolean(),\n null: () => fakerKeywordMapper.null(),\n string(node) {\n if (node.pattern) {\n return fakerKeywordMapper.matches(node.pattern, this.options.regexGenerator)\n }\n\n return fakerKeywordMapper.string(node.min, node.max)\n },\n email: () => fakerKeywordMapper.email(),\n url: () => fakerKeywordMapper.url(),\n uuid: () => fakerKeywordMapper.uuid(),\n number(node) {\n return fakerKeywordMapper.number(node.min, node.max)\n },\n integer(node) {\n return fakerKeywordMapper.integer(node.min, node.max)\n },\n bigint: () => fakerKeywordMapper.bigint(),\n blob: () => fakerKeywordMapper.blob(),\n datetime: () => fakerKeywordMapper.datetime(),\n date(node) {\n return fakerKeywordMapper.date(node.representation ?? 'string', this.options.dateParser)\n },\n time(node) {\n return fakerKeywordMapper.time(node.representation ?? 'string', this.options.dateParser)\n },\n ref(node) {\n // Parser-generated refs (with $ref) carry raw schema names that need resolving.\n // Use the canonical name from the $ref path — node.name may have been overridden\n // (e.g. by single-member allOf flatten using the property-derived child name).\n // Inline refs (without $ref) from faker utils already carry resolved helper names.\n const refName = node.ref ? (extractRefName(node.ref) ?? node.name ?? node.schema?.name) : (node.name ?? node.schema?.name)\n\n if (!refName) {\n throw new Error('Name not defined for ref node')\n }\n\n if (this.options.schemaName && refName === this.options.schemaName) {\n return 'undefined as any'\n }\n\n // Internal helper refs (for generated response/data helpers) are already\n // emitted with resolver output and should not be transformed twice.\n const resolvedName = node.ref ? this.options.resolver.resolveName(refName) : refName\n\n if (!this.options.nestedInObject) {\n return `${resolvedName}(data)`\n }\n\n return `${resolvedName}()`\n },\n enum(node) {\n return fakerKeywordMapper.enum(getEnumValues(node).map(parseEnumValue), this.options.typeName)\n },\n union(node): string {\n const { discriminatorPropertyName } = node\n const baseTypeName = this.options.typeName\n\n const items: Array<string> = mapSchemaMembers(node, (member) => {\n // For a discriminated union, narrow each variant to its own branch so nested\n // `NonNullable<T>[K]` indexes resolve against that branch instead of the whole union.\n const value = discriminatorPropertyName ? getDiscriminatorValue(member, discriminatorPropertyName) : undefined\n\n if (baseTypeName && value !== undefined) {\n const typeName = `Extract<NonNullable<${baseTypeName}>, { ${JSON.stringify(discriminatorPropertyName)}: ${parseEnumValue(value)} }>`\n\n return printNested(member, { typeName, nestedInObject: true })\n }\n\n // Without a discriminator, keep the union type but guard each indexed access (see\n // `indexedTypeName`) so a key carried by only some branches resolves to `unknown`\n // rather than erroring with TS2339.\n return printNested(member, { typeName: baseTypeName, nestedInObject: true, nestedInUnion: true })\n })\n .map(({ output }) => output)\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.union(items)\n },\n intersection(node): string {\n const items: Array<string> = mapSchemaMembers(node, (member) =>\n printNested(member, {\n nestedInObject: true,\n }),\n )\n .map(({ output }) => output)\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.and(items)\n },\n array(node): string {\n const items: Array<string> = mapSchemaItems(node, (member) =>\n printNested(member, {\n typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[number]` : undefined,\n nestedInObject: true,\n }),\n )\n .map(({ output }) => output)\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.array(items, node.min, node.max)\n },\n tuple(node): string {\n const items: Array<string> = (node.items ?? [])\n .map((member, index) =>\n printNested(member, {\n typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[${index}]` : undefined,\n nestedInObject: true,\n }),\n )\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.tuple(items)\n },\n object(node): string {\n const cyclicSchemas = this.options.cyclicSchemas\n const entries = (node.properties ?? []).map((property): string => {\n if (this.options.mapper && Object.hasOwn(this.options.mapper, property.name)) {\n return `${objectKey(property.name)}: ${this.options.mapper[property.name]}`\n }\n\n const value: string =\n printNested(property.schema, {\n typeName: this.options.typeName ? indexedTypeName(this.options.typeName, property.name, this.options.nestedInUnion) : undefined,\n nestedInObject: true,\n }) ?? 'undefined'\n\n // When the property's schema transitively references a schema that is\n // part of a circular dependency (other than the current schema itself),\n // emit a memoizing lazy getter. On first access it computes the value,\n // replaces itself with a plain data property via Object.defineProperty,\n // and returns the cached value – so every subsequent read is stable.\n if (cyclicSchemas && containsCircularRef(property.schema, { circularSchemas: cyclicSchemas, excludeName: this.options.schemaName })) {\n return `get ${objectKey(property.name)}() { const _value = ${value}; Object.defineProperty(this, ${JSON.stringify(property.name)}, { value: _value, configurable: true, writable: true, enumerable: true }); return _value }`\n }\n\n return `${objectKey(property.name)}: ${value}`\n })\n\n return buildObject(entries)\n },\n ...options.nodes,\n },\n print(node) {\n return this.transform(node) ?? null\n },\n }\n})\n","import { getPerContentTypeName, resolveContentTypeVariants } from '@internals/shared'\nimport { aliasConflictingImports, filterUsedImports, rewriteAliasedImports } from '@internals/utils'\nimport { ast, defineGenerator } from '@kubb/core'\nimport { caseParams } from '@kubb/ast/utils'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { File, jsxRenderer } from '@kubb/renderer-jsx'\nimport { Faker } from '../components/Faker.tsx'\nimport { printerFaker } from '../printers/printerFaker.ts'\nimport type { PluginFaker } from '../types.ts'\nimport { buildResponseUnionSchema, canOverrideSchema, localeToFakerImport, resolveParamNameByLocation, resolveTypeReference } from '../utils.ts'\n\n/**\n * Built-in generator for `@kubb/plugin-faker`. Emits one `createX` factory\n * per schema in the spec plus per-operation request/response factories. Each\n * factory returns a value matching the corresponding TypeScript type from\n * `@kubb/plugin-ts`.\n */\nexport const fakerGenerator = defineGenerator<PluginFaker>({\n name: 'faker',\n renderer: jsxRenderer,\n schema(node, ctx) {\n const { adapter, config, resolver, root } = ctx\n const { output, group, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options\n const pluginTs = ctx.driver.getPlugin(pluginTsName)\n\n if (!node.name || !pluginTs) {\n return\n }\n\n const tsResolver = ctx.driver.getResolver(pluginTsName)\n\n const schemaName = node.name\n const isEnumSchema = !!ast.narrowSchema(node, ast.schemaTypes.enum)\n const tsEnumType = pluginTs.options?.enum?.type\n const tsEnumTypeSuffix = pluginTs.options?.enum?.typeSuffix ?? 'Key'\n const schemaTypeName =\n isEnumSchema && tsEnumType === 'asConst' ? tsResolver.resolveEnumKeyName({ name: schemaName }, tsEnumTypeSuffix) : tsResolver.resolveTypeName(schemaName)\n const meta = {\n name: resolver.resolveName(schemaName),\n file: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }),\n typeName: schemaTypeName,\n typeFile: tsResolver.resolveFile(\n { name: schemaName, extname: '.ts' },\n { root, output: pluginTs.options?.output ?? output, group: pluginTs.options?.group ?? undefined },\n ),\n } as const\n const canOverride = canOverrideSchema(node)\n const cyclicSchemas = new Set<string>(ctx.meta.circularNames)\n const printerInstance = printerFaker({\n resolver,\n schemaName,\n typeName: meta.typeName,\n dateParser,\n regexGenerator,\n mapper,\n nodes: printer?.nodes,\n cyclicSchemas,\n })\n const fakerText = printerInstance.print(node) ?? 'undefined'\n const typeReference = resolveTypeReference({\n node,\n canOverride,\n name: meta.name,\n typeName: meta.typeName,\n filePath: meta.file.path,\n typeFilePath: meta.typeFile.path,\n })\n\n const imports = adapter.getImports(node, (schemaName) => ({\n name: resolver.resolveName(schemaName),\n path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,\n }))\n const usedImports = filterUsedImports(imports, fakerText)\n\n return (\n <File\n baseName={meta.file.baseName}\n path={meta.file.path}\n meta={meta.file.meta}\n banner={resolver.resolveBanner(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n footer={resolver.resolveFooter(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n >\n <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path=\"@faker-js/faker\" />\n {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}\n {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}\n {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[meta.typeName]} />}\n {usedImports.map((imp) => (\n <File.Import key={[schemaName, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />\n ))}\n <Faker\n name={meta.name}\n typeName={typeReference.typeName}\n description={node.description}\n node={node}\n printer={printerInstance}\n seed={seed}\n canOverride={canOverride}\n />\n </File>\n )\n },\n operation(node, ctx) {\n const { adapter, config, resolver, root } = ctx\n const { output, group, paramsCasing, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options\n const pluginTs = ctx.driver.getPlugin(pluginTsName)\n\n if (!pluginTs) {\n return\n }\n\n const tsResolver = ctx.driver.getResolver(pluginTsName)\n\n const params = caseParams(node.parameters, paramsCasing)\n const paramEntries = params.map((param) => ({\n param,\n name: resolveParamNameByLocation(resolver, node, param),\n typeName: resolveParamNameByLocation(tsResolver, node, param),\n }))\n type RenderUnit = { schema: ast.SchemaNode | null; name: string; typeName: string; description?: string; skipImportNames: Array<string> }\n\n // Expands a content array into render units: one faker per content type plus a union faker\n // (named `baseName`) when more than one content type carries a schema, else a single faker.\n function expandContentUnits(\n entries: Array<{ contentType: string; schema?: ast.SchemaNode | null }>,\n baseName: string,\n tsBaseName: string,\n description: string | undefined,\n decorate?: (schema: ast.SchemaNode) => ast.SchemaNode,\n ): Array<RenderUnit> {\n const withSchema = entries.filter((entry) => entry.schema)\n if (withSchema.length <= 1) {\n const primary = withSchema[0] ?? entries[0]\n if (!primary?.schema) return []\n return [{ schema: decorate ? decorate(primary.schema) : primary.schema, name: baseName, typeName: tsBaseName, description, skipImportNames: [] }]\n }\n const variants = resolveContentTypeVariants(entries, baseName)\n const unionSchema = ast.factory.createSchema({\n type: 'union',\n members: variants.map((variant) => ast.factory.createSchema({ type: 'ref', name: variant.name })),\n })\n return [\n ...variants.map((variant) => ({\n schema: decorate ? decorate(variant.schema) : variant.schema,\n name: variant.name,\n typeName: getPerContentTypeName(tsBaseName, variant.suffix),\n description,\n skipImportNames: [],\n })),\n { schema: unionSchema, name: baseName, typeName: tsBaseName, description, skipImportNames: variants.map((variant) => variant.name) },\n ]\n }\n\n const responseUnits = node.responses.flatMap((response) =>\n expandContentUnits(\n response.content ?? [],\n resolver.resolveResponseStatusName(node, response.statusCode),\n tsResolver.resolveResponseStatusName(node, response.statusCode),\n response.description,\n ),\n )\n const dataUnits = expandContentUnits(\n node.requestBody?.content ?? [],\n resolver.resolveDataName(node),\n tsResolver.resolveDataName(node),\n node.requestBody?.description,\n (schema) => ({ ...schema, description: node.requestBody?.description ?? schema.description }),\n )\n const responseName = resolver.resolveResponseName(node)\n const localHelperNames = new Set([\n ...paramEntries.map((entry) => entry.name),\n ...responseUnits.map((unit) => unit.name),\n ...dataUnits.map((unit) => unit.name),\n responseName,\n ])\n const cyclicSchemas = new Set<string>(ctx.meta.circularNames)\n\n const meta = {\n file: resolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n { root, output, group: group ?? undefined },\n ),\n typeFile: tsResolver.resolveFile(\n {\n name: node.operationId,\n extname: '.ts',\n tag: node.tags[0] ?? 'default',\n path: node.path,\n },\n {\n root,\n output: pluginTs.options?.output ?? output,\n group: pluginTs.options?.group ?? undefined,\n },\n ),\n } as const\n\n function resolveMockImports(schema: ast.SchemaNode) {\n return adapter\n .getImports(schema, (schemaName) => ({\n name: resolver.resolveName(schemaName),\n path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,\n }))\n .filter((entry) => entry.path !== meta.file.path)\n }\n\n function renderEntry({\n schema,\n name,\n typeName,\n description,\n skipImportNames = [],\n }: {\n schema: ast.SchemaNode | null\n name: string\n typeName: string\n description?: string\n skipImportNames?: Array<string>\n }) {\n if (!schema) {\n return null\n }\n\n const canOverride = canOverrideSchema(schema)\n const printerInstance = printerFaker({\n resolver,\n schemaName: name,\n typeName,\n dateParser,\n regexGenerator,\n mapper,\n nodes: printer?.nodes,\n cyclicSchemas,\n })\n const fakerText = printerInstance.print(schema) ?? 'undefined'\n const usedImports = filterUsedImports(resolveMockImports(schema), fakerText, skipImportNames)\n const { imports, aliases } = aliasConflictingImports(usedImports, localHelperNames)\n const rewrittenFakerText = rewriteAliasedImports(fakerText, aliases)\n const typeReference = resolveTypeReference({\n node: schema,\n canOverride,\n name,\n typeName,\n filePath: meta.file.path,\n typeFilePath: meta.typeFile.path,\n })\n\n return (\n <>\n {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[typeName]} />}\n {imports.map((imp) => (\n <File.Import key={[name, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />\n ))}\n <Faker\n name={name}\n typeName={typeReference.typeName}\n description={description}\n node={schema}\n printer={{ ...printerInstance, print: () => rewrittenFakerText }}\n seed={seed}\n canOverride={canOverride}\n />\n </>\n )\n }\n\n return (\n <File\n baseName={meta.file.baseName}\n path={meta.file.path}\n meta={meta.file.meta}\n banner={resolver.resolveBanner(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n footer={resolver.resolveFooter(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}\n >\n <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path=\"@faker-js/faker\" />\n {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}\n {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}\n {paramEntries.map(({ param, name, typeName }) =>\n renderEntry({\n schema: param.schema,\n name,\n typeName,\n }),\n )}\n {responseUnits.map((unit) =>\n renderEntry({\n schema: unit.schema,\n name: unit.name,\n typeName: unit.typeName,\n description: unit.description,\n skipImportNames: unit.skipImportNames,\n }),\n )}\n {dataUnits.map((unit) =>\n renderEntry({\n schema: unit.schema,\n name: unit.name,\n typeName: unit.typeName,\n description: unit.description,\n skipImportNames: unit.skipImportNames,\n }),\n )}\n {renderEntry({\n schema: buildResponseUnionSchema(node, resolver),\n name: responseName,\n typeName: tsResolver.resolveResponseName(node),\n skipImportNames: responseUnits.map((unit) => unit.name),\n })}\n </File>\n )\n },\n})\n"],"mappings":";;;;;;;;AAOA,SAAS,aAAa,OAAuB;CAC3C,OAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,eAAe,OAAmC;CACzD,QAAQ,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC,MAAM,IAAI,EAAA,CACzD,KAAK,SAAS;EACb,IAAI,OAAO,SAAS,UAClB,OAAO;EAGT,OAAO,KAAK,QAAQ,KAAK;CAC3B,CAAC,CAAC,CACD,QAAQ,SAAyB,QAAQ,IAAI,CAAC;AACnD;AAEA,SAAgB,kBAAkB,SAA6B,MAAc,kBAAiC,CAAC,GAAuB;CACpI,MAAM,OAAO,IAAI,IAAI,eAAe;CAEpC,OAAO,QAAQ,QAAQ,UAAU;EAG/B,OAFc,eAAe,KAElB,CAAC,CAAC,MAAM,SAAS;GAC1B,IAAI,KAAK,IAAI,IAAI,GACf,OAAO;GAGT,OAAO,IAAI,OAAO,MAAM,aAAa,IAAI,EAAE,eAAe,CAAC,CAAC,KAAK,IAAI;EACvE,CAAC;CACH,CAAC;AACH;AAEA,SAAgB,wBACd,SACA,eAC+D;CAC/D,MAAM,kBAAkB,IAAI,IAAI,aAAa;CAC7C,MAAM,0BAAU,IAAI,IAAoB;CAuBxC,OAAO;EACL,SAtBqB,QAAQ,KAAK,UAAU;GAE5C,MAAM,gBADQ,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC,MAAM,IAAI,EAAA,CACvC,KAAK,SAAqB;IACnD,IAAI,OAAO,SAAS,YAAY,CAAC,gBAAgB,IAAI,IAAI,GACvD,OAAO;IAGT,MAAM,QAAQ,GAAG,KAAK;IACtB,QAAQ,IAAI,MAAM,KAAK;IAEvB,OAAO;KAAE,cAAc;KAAM,MAAM;IAAM;GAC3C,CAAC;GAED,OAAO,aAAa,MAAM,SAAS,OAAO,SAAS,YAAY,KAAK,IAAI,IACpE;IACE,GAAG;IACH,MAAM;GACR,IACA;EACN,CAGwB;EACtB;CACF;AACF;AAEA,SAAgB,sBAAsB,MAAc,SAA8C;CAChG,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,MAAM,WAAW,IAAI,QAAQ,IAAI,OAAO,MAAM,aAAa,IAAI,EAAE,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI;AACpI;;;;;;;ACmDA,SAAgB,qBAAqB,aAA6B;CAChE,MAAM,WAAW,YAAY,MAAM,GAAG,CAAC,CAAC,EAAE,CAAE,KAAK;CACjD,IAAI,aAAa,oBAAoB,OAAO;CAC5C,IAAI,aAAa,uBAAuB,OAAO;CAC/C,IAAI,aAAa,qCAAqC,OAAO;CAE7D,MAAM,SADU,SAAS,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,SAAA,CACvB,MAAM,eAAe,CAAC,CAAC,OAAO,OAAO;CAC3D,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,OAAO,MAAM,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAClF;;;;;AAMA,SAAgB,sBAAsB,UAAkB,QAAwB;CAC9E,IAAI,SAAS,SAAS,MAAM,GAC1B,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI,SAAS,GAAG,SAAS,MAAM,GAAG,EAAE,IAAI,OAAO;CAEtG,OAAO,WAAW;AACpB;;;;;;;AAWA,SAAgB,2BAA2B,SAAqC,UAAyC;CACvH,MAAM,4BAAY,IAAI,IAAY;CAClC,OAAO,QACJ,QAAQ,UAAU,MAAM,MAAM,CAAC,CAC/B,KAAK,UAAU;EACd,MAAM,aAAa,qBAAqB,MAAM,WAAW;EACzD,IAAI,SAAS;EACb,IAAI,OAAO,sBAAsB,UAAU,MAAM;EACjD,IAAI,UAAU;EACd,OAAO,UAAU,IAAI,IAAI,GAAG;GAC1B,SAAS,GAAG,aAAa;GACzB,OAAO,sBAAsB,UAAU,MAAM;EAC/C;EACA,UAAU,IAAI,IAAI;EAClB,OAAO;GAAE;GAAM;GAAQ,QAAQ,MAAM;GAAS,YAAY,MAAM;GAAY,aAAa,MAAM;EAAY;CAC7G,CAAC;AACL;;;ACjHA,MAAM,qBAAqB;CACzB,WAAW;CACX,eAAe;CACf,YAAY;CACZ,SAAS,KAAc,QAAiB;EACtC,IAAI,QAAQ,KAAA,KAAa,QAAQ,KAAA,GAC/B,OAAO,6BAA6B,IAAI,SAAS,IAAI;EAGvD,IAAI,QAAQ,KAAA,GACV,OAAO,6BAA6B,IAAI;EAG1C,IAAI,QAAQ,KAAA,GACV,OAAO,6BAA6B,IAAI;EAG1C,OAAO;CACT;CACA,UAAU,KAAc,QAAiB;EACvC,IAAI,QAAQ,KAAA,KAAa,QAAQ,KAAA,GAC/B,OAAO,2BAA2B,IAAI,SAAS,IAAI;EAGrD,IAAI,QAAQ,KAAA,GACV,OAAO,2BAA2B,IAAI;EAGxC,IAAI,QAAQ,KAAA,GACV,OAAO,2BAA2B,IAAI;EAGxC,OAAO;CACT;CACA,cAAc;CACd,SAAS,KAAc,QAAiB;EACtC,IAAI,QAAQ,KAAA,KAAa,QAAQ,KAAA,GAC/B,OAAO,uCAAuC,IAAI,SAAS,IAAI;EAGjE,IAAI,QAAQ,KAAA,GACV,OAAO,gCAAgC,IAAI;EAG7C,IAAI,QAAQ,KAAA,GACV,OAAO,gCAAgC,IAAI;EAG7C,OAAO;CACT;CACA,eAAe;CACf,YAAY;CACZ,QAAQ,QAAuB,CAAC,GAAG,KAAc,QAAiB;EAChE,IAAI,MAAM,SAAS,GACjB,OAAO,gCAAgC,MAAM,KAAK,IAAI,EAAE;EAG1D,MAAM,OAAO,MAAM,GAAG,CAAC;EAEvB,IAAI,QAAQ,KAAA,KAAa,QAAQ,KAAA,GAC/B,OAAO,iCAAiC,KAAK,qBAAqB,IAAI,SAAS,IAAI;EAGrF,IAAI,QAAQ,KAAA,GACV,OAAO,iCAAiC,KAAK,cAAc,IAAI;EAGjE,IAAI,QAAQ,KAAA,GACV,OAAO,iCAAiC,KAAK,6BAA6B,IAAI;EAGhF,OAAO,iCAAiC,KAAK;CAC/C;CACA,QAAQ,QAAuB,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE;CAC3D,OAAO,QAAsD,CAAC,GAAG,OAAO,UAAU,8BAA8B,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE;CAC3I,QAAQ,QAAuB,CAAC,MAAM,oCAAoC,MAAM,KAAK,IAAI,EAAE;CAC3F,gBAAgB;CAChB,OAAO,iBAAoC,UAAU,SAAuD,YAAY;EACtH,IAAI,mBAAmB,UAAU;GAC/B,IAAI,WAAW,SACb,OAAO,GAAG,OAAO;GAGnB,OAAO;EACT;EAEA,IAAI,WAAW,SACb,MAAM,IAAI,MAAM,SAAS,eAAe,gBAAgB,OAAO,wBAAwB;EAGzF,OAAO;CACT;CACA,OAAO,iBAAoC,UAAU,SAAuD,YAAY;EACtH,IAAI,mBAAmB,UAAU;GAC/B,IAAI,WAAW,SACb,OAAO,GAAG,OAAO;GAGnB,OAAO;EACT;EAEA,IAAI,WAAW,SACb,MAAM,IAAI,MAAM,SAAS,eAAe,gBAAgB,OAAO,wBAAwB;EAGzF,OAAO;CACT;CACA,YAAY;CACZ,WAAW;CACX,MAAM,QAAuB,CAAC,MAAM;EAClC,IAAI,MAAM,WAAW,GACnB,OAAO;EAGT,IAAI,MAAM,WAAW,GACnB,OAAO,MAAM,MAAM;EAGrB,OAAO,OAAO,MAAM,KAAK,OAAO,EAAE;CACpC;CACA,UAAU,QAAQ,IAAI,iBAAsC,YAAY;EACtE,IAAI,mBAAmB,WACrB,OAAO,GAAG,eAAe,OAAO,SAAS,EAAE;EAG7C,OAAO,6BAA6B,MAAM;CAC5C;CACA,aAAa;CACb,YAAY;AACd;AAEA,SAAS,cAAc,MAAwE;CAC7F,IAAI,KAAK,iBAAiB,QACxB,OAAO,KAAK,gBAAgB,KAAK,SAAS,KAAK,KAA8C;CAG/F,OAAQ,KAAK,cAAc,CAAC;AAC9B;AAEA,SAAS,eAAe,OAA8C;CACpE,IAAI,OAAO,UAAU,UACnB,OAAO,UAAU,KAAK;CAGxB,OAAO;AACT;;AAGA,SAAS,sBAAsB,QAAwB,2BAAmC;CACxF,MAAM,OAAO,IAAI,aAAa,QAAQ,QAAQ,CAAC,EAAE,YAAY,MAAM,MAAM,EAAE,SAAS,yBAAyB;CAC7G,MAAM,WAAW,OAAO,IAAI,aAAa,KAAK,QAAQ,MAAM,IAAI;CAEhE,OAAO,WAAW,cAAc,QAAQ,CAAC,CAAC,KAAK,KAAA;AACjD;;;;;;;AAQA,SAAS,gBAAgB,UAAkB,cAAsB,eAAiC;CAChG,MAAM,MAAM,KAAK,UAAU,YAAY;CAQvC,OAAO,gBAAgB,gBAAgB,SAAS,aAAa,IAAI,cAAc,IAAI,KAAK,eAAe,SAAS,IAAI,IAAI;AAC1H;;;;;AAMA,MAAa,eAAmF,IAAI,eAAoC,YAAY;CAClJ,MAAM,eAAe,MAAsB,kBAAgD,CAAC,MAAc;EACxG,OACE,aAAa;GACX,GAAG;GACH,GAAG;GACH,OAAO,QAAQ;EACjB,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK;CAEtB;CAEA,OAAO;EACL,MAAM;EACN;EACA,OAAO;GACL,WAAW,mBAAmB,IAAI;GAClC,eAAe,mBAAmB,QAAQ;GAC1C,YAAY,mBAAmB,KAAK;GACpC,eAAe,mBAAmB,QAAQ;GAC1C,YAAY,mBAAmB,KAAK;GACpC,OAAO,MAAM;IACX,IAAI,KAAK,SACP,OAAO,mBAAmB,QAAQ,KAAK,SAAS,KAAK,QAAQ,cAAc;IAG7E,OAAO,mBAAmB,OAAO,KAAK,KAAK,KAAK,GAAG;GACrD;GACA,aAAa,mBAAmB,MAAM;GACtC,WAAW,mBAAmB,IAAI;GAClC,YAAY,mBAAmB,KAAK;GACpC,OAAO,MAAM;IACX,OAAO,mBAAmB,OAAO,KAAK,KAAK,KAAK,GAAG;GACrD;GACA,QAAQ,MAAM;IACZ,OAAO,mBAAmB,QAAQ,KAAK,KAAK,KAAK,GAAG;GACtD;GACA,cAAc,mBAAmB,OAAO;GACxC,YAAY,mBAAmB,KAAK;GACpC,gBAAgB,mBAAmB,SAAS;GAC5C,KAAK,MAAM;IACT,OAAO,mBAAmB,KAAK,KAAK,kBAAkB,UAAU,KAAK,QAAQ,UAAU;GACzF;GACA,KAAK,MAAM;IACT,OAAO,mBAAmB,KAAK,KAAK,kBAAkB,UAAU,KAAK,QAAQ,UAAU;GACzF;GACA,IAAI,MAAM;IAKR,MAAM,UAAU,KAAK,MAAO,eAAe,KAAK,GAAG,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAS,KAAK,QAAQ,KAAK,QAAQ;IAErH,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,+BAA+B;IAGjD,IAAI,KAAK,QAAQ,cAAc,YAAY,KAAK,QAAQ,YACtD,OAAO;IAKT,MAAM,eAAe,KAAK,MAAM,KAAK,QAAQ,SAAS,YAAY,OAAO,IAAI;IAE7E,IAAI,CAAC,KAAK,QAAQ,gBAChB,OAAO,GAAG,aAAa;IAGzB,OAAO,GAAG,aAAa;GACzB;GACA,KAAK,MAAM;IACT,OAAO,mBAAmB,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,cAAc,GAAG,KAAK,QAAQ,QAAQ;GAC/F;GACA,MAAM,MAAc;IAClB,MAAM,EAAE,8BAA8B;IACtC,MAAM,eAAe,KAAK,QAAQ;IAElC,MAAM,QAAuB,iBAAiB,OAAO,WAAW;KAG9D,MAAM,QAAQ,4BAA4B,sBAAsB,QAAQ,yBAAyB,IAAI,KAAA;KAErG,IAAI,gBAAgB,UAAU,KAAA,GAG5B,OAAO,YAAY,QAAQ;MAAE,UAAA,uBAFW,aAAa,OAAO,KAAK,UAAU,yBAAyB,EAAE,IAAI,eAAe,KAAK,EAAE;MAEzF,gBAAgB;KAAK,CAAC;KAM/D,OAAO,YAAY,QAAQ;MAAE,UAAU;MAAc,gBAAgB;MAAM,eAAe;KAAK,CAAC;IAClG,CAAC,CAAC,CACC,KAAK,EAAE,aAAa,MAAM,CAAC,CAC3B,QAAQ,SAAyB,QAAQ,IAAI,CAAC;IAEjD,OAAO,mBAAmB,MAAM,KAAK;GACvC;GACA,aAAa,MAAc;IACzB,MAAM,QAAuB,iBAAiB,OAAO,WACnD,YAAY,QAAQ,EAClB,gBAAgB,KAClB,CAAC,CACH,CAAC,CACE,KAAK,EAAE,aAAa,MAAM,CAAC,CAC3B,QAAQ,SAAyB,QAAQ,IAAI,CAAC;IAEjD,OAAO,mBAAmB,IAAI,KAAK;GACrC;GACA,MAAM,MAAc;IAClB,MAAM,QAAuB,eAAe,OAAO,WACjD,YAAY,QAAQ;KAClB,UAAU,KAAK,QAAQ,WAAW,eAAe,KAAK,QAAQ,SAAS,aAAa,KAAA;KACpF,gBAAgB;IAClB,CAAC,CACH,CAAC,CACE,KAAK,EAAE,aAAa,MAAM,CAAC,CAC3B,QAAQ,SAAyB,QAAQ,IAAI,CAAC;IAEjD,OAAO,mBAAmB,MAAM,OAAO,KAAK,KAAK,KAAK,GAAG;GAC3D;GACA,MAAM,MAAc;IAClB,MAAM,SAAwB,KAAK,SAAS,CAAC,EAAA,CAC1C,KAAK,QAAQ,UACZ,YAAY,QAAQ;KAClB,UAAU,KAAK,QAAQ,WAAW,eAAe,KAAK,QAAQ,SAAS,IAAI,MAAM,KAAK,KAAA;KACtF,gBAAgB;IAClB,CAAC,CACH,CAAC,CACA,QAAQ,SAAyB,QAAQ,IAAI,CAAC;IAEjD,OAAO,mBAAmB,MAAM,KAAK;GACvC;GACA,OAAO,MAAc;IACnB,MAAM,gBAAgB,KAAK,QAAQ;IAwBnC,OAAO,aAvBU,KAAK,cAAc,CAAC,EAAA,CAAG,KAAK,aAAqB;KAChE,IAAI,KAAK,QAAQ,UAAU,OAAO,OAAO,KAAK,QAAQ,QAAQ,SAAS,IAAI,GACzE,OAAO,GAAG,UAAU,SAAS,IAAI,EAAE,IAAI,KAAK,QAAQ,OAAO,SAAS;KAGtE,MAAM,QACJ,YAAY,SAAS,QAAQ;MAC3B,UAAU,KAAK,QAAQ,WAAW,gBAAgB,KAAK,QAAQ,UAAU,SAAS,MAAM,KAAK,QAAQ,aAAa,IAAI,KAAA;MACtH,gBAAgB;KAClB,CAAC,KAAK;KAOR,IAAI,iBAAiB,oBAAoB,SAAS,QAAQ;MAAE,iBAAiB;MAAe,aAAa,KAAK,QAAQ;KAAW,CAAC,GAChI,OAAO,OAAO,UAAU,SAAS,IAAI,EAAE,sBAAsB,MAAM,gCAAgC,KAAK,UAAU,SAAS,IAAI,EAAE;KAGnI,OAAO,GAAG,UAAU,SAAS,IAAI,EAAE,IAAI;IACzC,CAEyB,CAAC;GAC5B;GACA,GAAG,QAAQ;EACb;EACA,MAAM,MAAM;GACV,OAAO,KAAK,UAAU,IAAI,KAAK;EACjC;CACF;AACF,CAAC;;;;;;;;;AClYD,MAAa,iBAAiB,gBAA6B;CACzD,MAAM;CACN,UAAU;CACV,OAAO,MAAM,KAAK;EAChB,MAAM,EAAE,SAAS,QAAQ,UAAU,SAAS;EAC5C,MAAM,EAAE,QAAQ,OAAO,YAAY,gBAAgB,QAAQ,MAAM,QAAQ,YAAY,IAAI;EACzF,MAAM,WAAW,IAAI,OAAO,UAAU,YAAY;EAElD,IAAI,CAAC,KAAK,QAAQ,CAAC,UACjB;EAGF,MAAM,aAAa,IAAI,OAAO,YAAY,YAAY;EAEtD,MAAM,aAAa,KAAK;EACxB,MAAM,eAAe,CAAC,CAAC,IAAI,aAAa,MAAM,IAAI,YAAY,IAAI;EAClE,MAAM,aAAa,SAAS,SAAS,MAAM;EAC3C,MAAM,mBAAmB,SAAS,SAAS,MAAM,cAAc;EAC/D,MAAM,iBACJ,gBAAgB,eAAe,YAAY,WAAW,mBAAmB,EAAE,MAAM,WAAW,GAAG,gBAAgB,IAAI,WAAW,gBAAgB,UAAU;EAC1J,MAAM,OAAO;GACX,MAAM,SAAS,YAAY,UAAU;GACrC,MAAM,SAAS,YAAY;IAAE,MAAM;IAAY,SAAS;GAAM,GAAG;IAAE;IAAM;IAAQ,OAAO,SAAS,KAAA;GAAU,CAAC;GAC5G,UAAU;GACV,UAAU,WAAW,YACnB;IAAE,MAAM;IAAY,SAAS;GAAM,GACnC;IAAE;IAAM,QAAQ,SAAS,SAAS,UAAU;IAAQ,OAAO,SAAS,SAAS,SAAS,KAAA;GAAU,CAClG;EACF;EACA,MAAM,cAAc,kBAAkB,IAAI;EAC1C,MAAM,gBAAgB,IAAI,IAAY,IAAI,KAAK,aAAa;EAC5D,MAAM,kBAAkB,aAAa;GACnC;GACA;GACA,UAAU,KAAK;GACf;GACA;GACA;GACA,OAAO,SAAS;GAChB;EACF,CAAC;EACD,MAAM,YAAY,gBAAgB,MAAM,IAAI,KAAK;EACjD,MAAM,gBAAgB,qBAAqB;GACzC;GACA;GACA,MAAM,KAAK;GACX,UAAU,KAAK;GACf,UAAU,KAAK,KAAK;GACpB,cAAc,KAAK,SAAS;EAC9B,CAAC;EAMD,MAAM,cAAc,kBAJJ,QAAQ,WAAW,OAAO,gBAAgB;GACxD,MAAM,SAAS,YAAY,UAAU;GACrC,MAAM,SAAS,YAAY;IAAE,MAAM;IAAY,SAAS;GAAM,GAAG;IAAE;IAAM;IAAQ,OAAO,SAAS,KAAA;GAAU,CAAC,CAAC,CAAC;EAChH,EAC4C,GAAG,SAAS;EAExD,OACE,qBAAC,MAAD;GACE,UAAU,KAAK,KAAK;GACpB,MAAM,KAAK,KAAK;GAChB,MAAM,KAAK,KAAK;GAChB,QAAQ,SAAS,cAAc,IAAI,MAAM;IAAE;IAAQ;IAAQ,MAAM;KAAE,MAAM,KAAK,KAAK;KAAM,UAAU,KAAK,KAAK;IAAS;GAAE,CAAC;GACzH,QAAQ,SAAS,cAAc,IAAI,MAAM;IAAE;IAAQ;IAAQ,MAAM;KAAE,MAAM,KAAK,KAAK;KAAM,UAAU,KAAK,KAAK;IAAS;GAAE,CAAC;aAL3H;IAOE,oBAAC,KAAK,QAAN;KAAa,MAAM,SAAS,CAAC;MAAE,cAAc,oBAAoB,MAAM;MAAG,MAAM;KAAQ,CAAC,IAAI,CAAC,OAAO;KAAG,MAAK;IAAmB,CAAA;IAC/H,mBAAmB,aAAa,oBAAC,KAAK,QAAN;KAAa,MAAM;KAAW,MAAM;IAAY,CAAA;IAChF,eAAe,WAAW,oBAAC,KAAK,QAAN;KAAa,MAAM;KAAY,MAAM;IAAa,CAAA;IAC5E,cAAc,cAAc,oBAAC,KAAK,QAAN;KAAa,YAAA;KAAW,MAAM,KAAK,KAAK;KAAM,MAAM,cAAc;KAAY,MAAM,CAAC,KAAK,QAAQ;IAAI,CAAA;IAClI,YAAY,KAAK,QAChB,oBAAC,KAAK,QAAN;KAA8D,MAAM,KAAK,KAAK;KAAM,MAAM,IAAI;KAAM,MAAM,IAAI;IAAO,GAAnG;KAAC;KAAY,IAAI;KAAM,IAAI;IAAI,CAAC,CAAC,KAAK,GAAG,CAA0D,CACtH;IACD,oBAAC,OAAD;KACE,MAAM,KAAK;KACX,UAAU,cAAc;KACxB,aAAa,KAAK;KACZ;KACN,SAAS;KACH;KACO;IACd,CAAA;GACG;;CAEV;CACA,UAAU,MAAM,KAAK;EACnB,MAAM,EAAE,SAAS,QAAQ,UAAU,SAAS;EAC5C,MAAM,EAAE,QAAQ,OAAO,cAAc,YAAY,gBAAgB,QAAQ,MAAM,QAAQ,YAAY,IAAI;EACvG,MAAM,WAAW,IAAI,OAAO,UAAU,YAAY;EAElD,IAAI,CAAC,UACH;EAGF,MAAM,aAAa,IAAI,OAAO,YAAY,YAAY;EAGtD,MAAM,eADS,WAAW,KAAK,YAAY,YACjB,CAAC,CAAC,KAAK,WAAW;GAC1C;GACA,MAAM,2BAA2B,UAAU,MAAM,KAAK;GACtD,UAAU,2BAA2B,YAAY,MAAM,KAAK;EAC9D,EAAE;EAKF,SAAS,mBACP,SACA,UACA,YACA,aACA,UACmB;GACnB,MAAM,aAAa,QAAQ,QAAQ,UAAU,MAAM,MAAM;GACzD,IAAI,WAAW,UAAU,GAAG;IAC1B,MAAM,UAAU,WAAW,MAAM,QAAQ;IACzC,IAAI,CAAC,SAAS,QAAQ,OAAO,CAAC;IAC9B,OAAO,CAAC;KAAE,QAAQ,WAAW,SAAS,QAAQ,MAAM,IAAI,QAAQ;KAAQ,MAAM;KAAU,UAAU;KAAY;KAAa,iBAAiB,CAAC;IAAE,CAAC;GAClJ;GACA,MAAM,WAAW,2BAA2B,SAAS,QAAQ;GAC7D,MAAM,cAAc,IAAI,QAAQ,aAAa;IAC3C,MAAM;IACN,SAAS,SAAS,KAAK,YAAY,IAAI,QAAQ,aAAa;KAAE,MAAM;KAAO,MAAM,QAAQ;IAAK,CAAC,CAAC;GAClG,CAAC;GACD,OAAO,CACL,GAAG,SAAS,KAAK,aAAa;IAC5B,QAAQ,WAAW,SAAS,QAAQ,MAAM,IAAI,QAAQ;IACtD,MAAM,QAAQ;IACd,UAAU,sBAAsB,YAAY,QAAQ,MAAM;IAC1D;IACA,iBAAiB,CAAC;GACpB,EAAE,GACF;IAAE,QAAQ;IAAa,MAAM;IAAU,UAAU;IAAY;IAAa,iBAAiB,SAAS,KAAK,YAAY,QAAQ,IAAI;GAAE,CACrI;EACF;EAEA,MAAM,gBAAgB,KAAK,UAAU,SAAS,aAC5C,mBACE,SAAS,WAAW,CAAC,GACrB,SAAS,0BAA0B,MAAM,SAAS,UAAU,GAC5D,WAAW,0BAA0B,MAAM,SAAS,UAAU,GAC9D,SAAS,WACX,CACF;EACA,MAAM,YAAY,mBAChB,KAAK,aAAa,WAAW,CAAC,GAC9B,SAAS,gBAAgB,IAAI,GAC7B,WAAW,gBAAgB,IAAI,GAC/B,KAAK,aAAa,cACjB,YAAY;GAAE,GAAG;GAAQ,aAAa,KAAK,aAAa,eAAe,OAAO;EAAY,EAC7F;EACA,MAAM,eAAe,SAAS,oBAAoB,IAAI;EACtD,MAAM,mBAAmB,IAAI,IAAI;GAC/B,GAAG,aAAa,KAAK,UAAU,MAAM,IAAI;GACzC,GAAG,cAAc,KAAK,SAAS,KAAK,IAAI;GACxC,GAAG,UAAU,KAAK,SAAS,KAAK,IAAI;GACpC;EACF,CAAC;EACD,MAAM,gBAAgB,IAAI,IAAY,IAAI,KAAK,aAAa;EAE5D,MAAM,OAAO;GACX,MAAM,SAAS,YACb;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;GAAK,GAC1F;IAAE;IAAM;IAAQ,OAAO,SAAS,KAAA;GAAU,CAC5C;GACA,UAAU,WAAW,YACnB;IACE,MAAM,KAAK;IACX,SAAS;IACT,KAAK,KAAK,KAAK,MAAM;IACrB,MAAM,KAAK;GACb,GACA;IACE;IACA,QAAQ,SAAS,SAAS,UAAU;IACpC,OAAO,SAAS,SAAS,SAAS,KAAA;GACpC,CACF;EACF;EAEA,SAAS,mBAAmB,QAAwB;GAClD,OAAO,QACJ,WAAW,SAAS,gBAAgB;IACnC,MAAM,SAAS,YAAY,UAAU;IACrC,MAAM,SAAS,YAAY;KAAE,MAAM;KAAY,SAAS;IAAM,GAAG;KAAE;KAAM;KAAQ,OAAO,SAAS,KAAA;IAAU,CAAC,CAAC,CAAC;GAChH,EAAE,CAAC,CACF,QAAQ,UAAU,MAAM,SAAS,KAAK,KAAK,IAAI;EACpD;EAEA,SAAS,YAAY,EACnB,QACA,MACA,UACA,aACA,kBAAkB,CAAC,KAOlB;GACD,IAAI,CAAC,QACH,OAAO;GAGT,MAAM,cAAc,kBAAkB,MAAM;GAC5C,MAAM,kBAAkB,aAAa;IACnC;IACA,YAAY;IACZ;IACA;IACA;IACA;IACA,OAAO,SAAS;IAChB;GACF,CAAC;GACD,MAAM,YAAY,gBAAgB,MAAM,MAAM,KAAK;GAEnD,MAAM,EAAE,SAAS,YAAY,wBADT,kBAAkB,mBAAmB,MAAM,GAAG,WAAW,eACd,GAAG,gBAAgB;GAClF,MAAM,qBAAqB,sBAAsB,WAAW,OAAO;GACnE,MAAM,gBAAgB,qBAAqB;IACzC,MAAM;IACN;IACA;IACA;IACA,UAAU,KAAK,KAAK;IACpB,cAAc,KAAK,SAAS;GAC9B,CAAC;GAED,OACE,qBAAA,UAAA,EAAA,UAAA;IACG,cAAc,cAAc,oBAAC,KAAK,QAAN;KAAa,YAAA;KAAW,MAAM,KAAK,KAAK;KAAM,MAAM,cAAc;KAAY,MAAM,CAAC,QAAQ;IAAI,CAAA;IAC7H,QAAQ,KAAK,QACZ,oBAAC,KAAK,QAAN;KAAwD,MAAM,KAAK,KAAK;KAAM,MAAM,IAAI;KAAM,MAAM,IAAI;IAAO,GAA7F;KAAC;KAAM,IAAI;KAAM,IAAI;IAAI,CAAC,CAAC,KAAK,GAAG,CAA0D,CAChH;IACD,oBAAC,OAAD;KACQ;KACN,UAAU,cAAc;KACX;KACb,MAAM;KACN,SAAS;MAAE,GAAG;MAAiB,aAAa;KAAmB;KACzD;KACO;IACd,CAAA;GACD,EAAA,CAAA;EAEN;EAEA,OACE,qBAAC,MAAD;GACE,UAAU,KAAK,KAAK;GACpB,MAAM,KAAK,KAAK;GAChB,MAAM,KAAK,KAAK;GAChB,QAAQ,SAAS,cAAc,IAAI,MAAM;IAAE;IAAQ;IAAQ,MAAM;KAAE,MAAM,KAAK,KAAK;KAAM,UAAU,KAAK,KAAK;IAAS;GAAE,CAAC;GACzH,QAAQ,SAAS,cAAc,IAAI,MAAM;IAAE;IAAQ;IAAQ,MAAM;KAAE,MAAM,KAAK,KAAK;KAAM,UAAU,KAAK,KAAK;IAAS;GAAE,CAAC;aAL3H;IAOE,oBAAC,KAAK,QAAN;KAAa,MAAM,SAAS,CAAC;MAAE,cAAc,oBAAoB,MAAM;MAAG,MAAM;KAAQ,CAAC,IAAI,CAAC,OAAO;KAAG,MAAK;IAAmB,CAAA;IAC/H,mBAAmB,aAAa,oBAAC,KAAK,QAAN;KAAa,MAAM;KAAW,MAAM;IAAY,CAAA;IAChF,eAAe,WAAW,oBAAC,KAAK,QAAN;KAAa,MAAM;KAAY,MAAM;IAAa,CAAA;IAC5E,aAAa,KAAK,EAAE,OAAO,MAAM,eAChC,YAAY;KACV,QAAQ,MAAM;KACd;KACA;IACF,CAAC,CACH;IACC,cAAc,KAAK,SAClB,YAAY;KACV,QAAQ,KAAK;KACb,MAAM,KAAK;KACX,UAAU,KAAK;KACf,aAAa,KAAK;KAClB,iBAAiB,KAAK;IACxB,CAAC,CACH;IACC,UAAU,KAAK,SACd,YAAY;KACV,QAAQ,KAAK;KACb,MAAM,KAAK;KACX,UAAU,KAAK;KACf,aAAa,KAAK;KAClB,iBAAiB,KAAK;IACxB,CAAC,CACH;IACC,YAAY;KACX,QAAQ,yBAAyB,MAAM,QAAQ;KAC/C,MAAM;KACN,UAAU,WAAW,oBAAoB,IAAI;KAC7C,iBAAiB,cAAc,KAAK,SAAS,KAAK,IAAI;IACxD,CAAC;GACG;;CAEV;AACF,CAAC"}
|
package/dist/generators.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_fakerGenerator = require("./fakerGenerator-
|
|
2
|
+
const require_fakerGenerator = require("./fakerGenerator-BeKRKYuy.cjs");
|
|
3
3
|
exports.fakerGenerator = require_fakerGenerator.fakerGenerator;
|
package/dist/generators.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as fakerGenerator } from "./fakerGenerator-
|
|
1
|
+
import { t as fakerGenerator } from "./fakerGenerator-BNysC6rh.js";
|
|
2
2
|
export { fakerGenerator };
|
package/dist/generators.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as fakerGenerator } from "./fakerGenerator-
|
|
1
|
+
import { t as fakerGenerator } from "./fakerGenerator-D5Bcy5WY.js";
|
|
2
2
|
export { fakerGenerator };
|