@kubb/plugin-faker 5.0.0-beta.42 → 5.0.0-beta.56

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.
Files changed (35) hide show
  1. package/dist/{Faker-SBhWTdC7.d.ts → Faker-A5UuxwJj.d.ts} +2 -2
  2. package/dist/{Faker-DBPx_MVh.js → Faker-CHh0JtBG.js} +4 -46
  3. package/dist/Faker-CHh0JtBG.js.map +1 -0
  4. package/dist/{Faker-DRL0W5Lt.cjs → Faker-CcGjn5ZM.cjs} +5 -53
  5. package/dist/Faker-CcGjn5ZM.cjs.map +1 -0
  6. package/dist/components.cjs +1 -1
  7. package/dist/components.d.ts +1 -1
  8. package/dist/components.js +1 -1
  9. package/dist/{fakerGenerator-DNJ61yLj.js → fakerGenerator-DDNsdbH2.js} +16 -50
  10. package/dist/fakerGenerator-DDNsdbH2.js.map +1 -0
  11. package/dist/{fakerGenerator-CVOr0Pwm.cjs → fakerGenerator-DrwGWYwv.cjs} +17 -51
  12. package/dist/fakerGenerator-DrwGWYwv.cjs.map +1 -0
  13. package/dist/{fakerGenerator-Duc28_FK.d.ts → fakerGenerator-KKVr-CA2.d.ts} +2 -2
  14. package/dist/generators.cjs +1 -1
  15. package/dist/generators.d.ts +1 -1
  16. package/dist/generators.js +1 -1
  17. package/dist/index.cjs +45 -42
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +3 -3
  20. package/dist/index.js +45 -42
  21. package/dist/index.js.map +1 -1
  22. package/dist/{printerFaker-DXS861Q0.d.ts → printerFaker-CMCJT3FB.d.ts} +9 -13
  23. package/package.json +8 -15
  24. package/src/components/Faker.tsx +1 -1
  25. package/src/generators/fakerGenerator.tsx +12 -16
  26. package/src/plugin.ts +2 -2
  27. package/src/printers/printerFaker.ts +23 -25
  28. package/src/resolvers/resolverFaker.ts +8 -8
  29. package/src/types.ts +8 -12
  30. package/src/utils.ts +1 -1
  31. package/dist/Faker-DBPx_MVh.js.map +0 -1
  32. package/dist/Faker-DRL0W5Lt.cjs.map +0 -1
  33. package/dist/fakerGenerator-CVOr0Pwm.cjs.map +0 -1
  34. package/dist/fakerGenerator-DNJ61yLj.js.map +0 -1
  35. package/extension.yaml +0 -819
@@ -1,5 +1,5 @@
1
1
  import { t as __name } from "./chunk-C0LytTxp.js";
2
- import { o as PluginFaker, t as PrinterFakerFactory } from "./printerFaker-DXS861Q0.js";
2
+ import { o as PluginFaker, t as PrinterFakerFactory } from "./printerFaker-CMCJT3FB.js";
3
3
  import { ast } from "@kubb/core";
4
4
  import { KubbReactNode } from "@kubb/renderer-jsx/types";
5
5
 
@@ -24,4 +24,4 @@ declare function Faker({
24
24
  }: Props): KubbReactNode;
25
25
  //#endregion
26
26
  export { Faker as t };
27
- //# sourceMappingURL=Faker-SBhWTdC7.d.ts.map
27
+ //# sourceMappingURL=Faker-A5UuxwJj.d.ts.map
@@ -1,52 +1,10 @@
1
1
  import "./chunk-C0LytTxp.js";
2
- import { posix } from "node:path";
2
+ import { jsStringEscape } from "@kubb/ast/utils";
3
3
  import { ast } from "@kubb/core";
4
4
  import { functionPrinter } from "@kubb/plugin-ts";
5
5
  import { File, Function } from "@kubb/renderer-jsx";
6
+ import { posix } from "node:path";
6
7
  import { Fragment, jsx, jsxs } from "@kubb/renderer-jsx/jsx-runtime";
7
- //#region ../../internals/utils/src/string.ts
8
- /**
9
- * Strips a single matching pair of `"..."`, `'...'`, or `` `...` `` from both ends of `text`.
10
- * Returns the string unchanged when no balanced quote pair is found.
11
- *
12
- * @example
13
- * trimQuotes('"hello"') // 'hello'
14
- * trimQuotes('hello') // 'hello'
15
- */
16
- function trimQuotes(text) {
17
- if (text.length >= 2) {
18
- const first = text[0];
19
- const last = text[text.length - 1];
20
- if (first === "\"" && last === "\"" || first === "'" && last === "'" || first === "`" && last === "`") return text.slice(1, -1);
21
- }
22
- return text;
23
- }
24
- /**
25
- * Escapes characters that are not allowed inside JS string literals.
26
- * Handles quotes, backslashes, and Unicode line terminators (U+2028 / U+2029).
27
- *
28
- * @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
29
- *
30
- * @example
31
- * ```ts
32
- * jsStringEscape('say "hi"\nbye') // 'say \\"hi\\"\\nbye'
33
- * ```
34
- */
35
- function jsStringEscape(input) {
36
- return `${input}`.replace(/["'\\\n\r\u2028\u2029]/g, (character) => {
37
- switch (character) {
38
- case "\"":
39
- case "'":
40
- case "\\": return `\\${character}`;
41
- case "\n": return "\\n";
42
- case "\r": return "\\r";
43
- case "\u2028": return "\\u2028";
44
- case "\u2029": return "\\u2029";
45
- default: return "";
46
- }
47
- });
48
- }
49
- //#endregion
50
8
  //#region src/utils.ts
51
9
  /**
52
10
  * Returns the `@faker-js/faker` named export for a locale code.
@@ -317,6 +275,6 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
317
275
  });
318
276
  }
319
277
  //#endregion
320
- export { resolveParamNameByLocation as a, localeToFakerImport as i, buildResponseUnionSchema as n, resolveTypeReference as o, canOverrideSchema as r, trimQuotes as s, Faker as t };
278
+ export { resolveParamNameByLocation as a, localeToFakerImport as i, buildResponseUnionSchema as n, resolveTypeReference as o, canOverrideSchema as r, Faker as t };
321
279
 
322
- //# sourceMappingURL=Faker-DBPx_MVh.js.map
280
+ //# sourceMappingURL=Faker-CHh0JtBG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Faker-CHh0JtBG.js","names":["SCALAR_TYPES","ARRAY_TYPES"],"sources":["../src/utils.ts","../src/components/Faker.tsx"],"sourcesContent":["import { posix } from 'node:path'\nimport { ast } from '@kubb/core'\nimport type { ResolverFaker } from './types.ts'\n\n/**\n * Returns the `@faker-js/faker` named export for a locale code.\n *\n * Without a locale, returns `'faker'` for the default English instance.\n * With a locale, the language code is converted to upper case and joined with any region suffix.\n *\n * @example Default\n * `localeToFakerImport() // 'faker'`\n *\n * @example Simple locale\n * `localeToFakerImport('de') // 'fakerDE'`\n *\n * @example Compound locale\n * `localeToFakerImport('de_AT') // 'fakerDE_AT'`\n */\nexport function localeToFakerImport(locale?: string): string {\n if (!locale) {\n return 'faker'\n }\n\n const parts = locale.split('_')\n parts[0] = parts[0]!.toUpperCase()\n return `faker${parts.join('_')}`\n}\n\n/**\n * Determines if a schema node can be overridden during faker generation.\n */\nexport function canOverrideSchema(node: ast.SchemaNode): boolean {\n return new Set<ast.SchemaNode['type']>([\n 'array',\n 'tuple',\n 'object',\n 'intersection',\n 'union',\n 'enum',\n 'ref',\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n ]).has(node.type)\n}\n\n/**\n * Resolves a parameter name based on its location (path, query, header, etc.) using the provided resolver.\n */\nexport function resolveParamNameByLocation(\n resolver: Pick<ResolverFaker, 'resolvePathParamsName' | 'resolveQueryParamsName' | 'resolveHeaderParamsName' | 'resolveParamName'>,\n node: ast.OperationNode,\n param: ast.ParameterNode,\n): string {\n switch (param.in) {\n case 'path':\n return resolver.resolvePathParamsName(node, param)\n case 'query':\n return resolver.resolveQueryParamsName(node, param)\n case 'header':\n return resolver.resolveHeaderParamsName(node, param)\n default:\n return resolver.resolveParamName(node, param)\n }\n}\n\nfunction shouldInlineSingleResponseSchema(schema: ast.SchemaNode): boolean {\n return new Set<ast.SchemaNode['type']>([\n 'any',\n 'unknown',\n 'void',\n 'null',\n 'array',\n 'tuple',\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n 'enum',\n 'union',\n ]).has(schema.type)\n}\n\n/**\n * Builds a response schema as a union of all response statuses.\n * Returns null if no responses are provided, or embeds single simple responses inline.\n */\nexport function buildResponseUnionSchema(node: ast.OperationNode, resolver: ResolverFaker): ast.SchemaNode | null {\n const responses = node.responses.filter((response) => response.content?.[0]?.schema)\n\n if (!responses.length) {\n return null\n }\n\n if (responses.length === 1) {\n const schema = responses[0]!.content?.[0]?.schema\n if (schema && shouldInlineSingleResponseSchema(schema)) {\n return schema\n }\n\n return ast.createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, responses[0]!.statusCode) })\n }\n\n return ast.createSchema({\n type: 'union',\n members: responses.map((response) => ast.createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, response.statusCode) })),\n })\n}\n\nconst SCALAR_TYPES = new Set<ast.SchemaNode['type']>([\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n 'enum',\n])\nconst ARRAY_TYPES = new Set<ast.SchemaNode['type']>(['array'])\n\nfunction toRelativeImportPath(from: string, to: string): string {\n const relativePath = posix.relative(posix.dirname(from), to)\n return relativePath.startsWith('../') ? relativePath : `./${relativePath}`\n}\n\n/**\n * Resolves a type reference, determining if it needs an import statement or inline type reference.\n * Takes into account whether the type can be overridden and the file paths.\n */\nexport function resolveTypeReference({\n node,\n canOverride,\n name,\n typeName,\n filePath,\n typeFilePath,\n}: {\n node: ast.SchemaNode\n canOverride: boolean\n name: string\n typeName: string\n filePath: string\n typeFilePath: string\n}): { importPath?: string; typeName: string } {\n const { usesTypeName } = resolveFakerTypeUsage(node, typeName, canOverride)\n\n if (!usesTypeName) {\n return { typeName }\n }\n\n if (name === typeName) {\n return {\n typeName: `import('${toRelativeImportPath(filePath, typeFilePath)}').${typeName}`,\n }\n }\n\n return {\n importPath: typeFilePath,\n typeName,\n }\n}\n\n/**\n * Maps a schema node type to its corresponding scalar type representation.\n * Returns the type name for enums or the base type (string, number, etc.) for primitives.\n */\nfunction getScalarType(node: ast.SchemaNode, typeName: string): string {\n switch (node.type) {\n case 'string':\n case 'email':\n case 'url':\n case 'uuid':\n return 'string'\n case 'number':\n case 'integer':\n return 'number'\n case 'bigint':\n return 'bigint'\n case 'boolean':\n return 'boolean'\n case 'date':\n case 'time':\n return node.representation === 'date' ? 'Date' : 'string'\n case 'datetime':\n return 'string'\n case 'blob':\n return 'Blob'\n case 'enum':\n return typeName\n default:\n return typeName\n }\n}\n\n/**\n * Resolves faker type usage information for a schema.\n * Determines the data type, return type, and whether it uses the type name.\n */\nexport function resolveFakerTypeUsage(\n node: ast.SchemaNode,\n typeName: string,\n canOverride: boolean,\n): {\n dataType: string\n returnType: string | null\n usesTypeName: boolean\n} {\n const isArray = ARRAY_TYPES.has(node.type)\n const isTuple = node.type === 'tuple'\n const isScalar = SCALAR_TYPES.has(node.type)\n\n let dataType = `Partial<${typeName}>`\n\n if (isArray || isTuple || node.type === 'union' || node.type === 'enum') {\n dataType = typeName\n }\n\n if (isScalar) {\n dataType = getScalarType(node, typeName)\n }\n\n let returnType = canOverride ? typeName : null\n\n if (isScalar) {\n returnType = getScalarType(node, typeName)\n }\n\n return {\n dataType,\n returnType,\n usesTypeName: dataType.includes(typeName) || Boolean(returnType?.includes(typeName)),\n }\n}\n","import { jsStringEscape } from '@kubb/ast/utils'\nimport { ast } from '@kubb/core'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PrinterFakerFactory } from '../printers/printerFaker.ts'\nimport type { PluginFaker } from '../types.ts'\nimport { resolveFakerTypeUsage } from '../utils.ts'\n\ntype Props = {\n name: string\n typeName: string\n node: ast.SchemaNode\n printer: ast.Printer<PrinterFakerFactory>\n seed?: PluginFaker['options']['seed']\n description?: string\n canOverride: boolean\n}\n\nconst OBJECT_TYPES = new Set<ast.SchemaNode['type']>(['object', 'intersection'])\nconst ARRAY_TYPES = new Set<ast.SchemaNode['type']>(['array'])\nconst SCALAR_TYPES = new Set<ast.SchemaNode['type']>([\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n 'enum',\n])\nconst declarationPrinter = functionPrinter({ mode: 'declaration' })\n\nexport function Faker({ node, description, name, typeName, printer, seed, canOverride }: Props): KubbReactNode {\n const fakerText = printer.print(node) ?? 'undefined'\n\n const isArray = ARRAY_TYPES.has(node.type)\n const isObject = OBJECT_TYPES.has(node.type)\n const isTuple = node.type === 'tuple'\n const isScalar = SCALAR_TYPES.has(node.type)\n\n const useGenericOverride = canOverride && isObject\n const fakerTextWithOverride = (() => {\n if (canOverride && isTuple) return `data || ${fakerText}`\n if (canOverride && isArray) return `[\\n ...${fakerText},\\n ...(data || [])\\n]`\n if (canOverride && isScalar) return `data ?? ${fakerText}`\n return fakerText\n })()\n\n const { dataType, returnType: resolvedReturnType } = resolveFakerTypeUsage(node, typeName, canOverride)\n\n if (!useGenericOverride) {\n const usesData = /\\bdata\\b/.test(fakerTextWithOverride)\n const dataParamName = usesData ? 'data' : '_data'\n const params = ast.createFunctionParameters({\n params: [\n ast.createFunctionParameter({\n name: dataParamName,\n type: ast.createParamsType({ variant: 'reference', name: dataType }),\n optional: true,\n }),\n ],\n })\n const paramsSignature = declarationPrinter.print(params) ?? ''\n const returnType = resolvedReturnType\n\n // A `ref` wrapper delegates to another faker. Object fakers are now generic and\n // widen to `Partial<T>` when called with a `Partial<T>`-typed argument, so cast\n // back to the wrapper's declared return type to keep it assignable.\n const returnExpression = node.type === 'ref' && canOverride && returnType ? `${fakerTextWithOverride} as ${returnType}` : fakerTextWithOverride\n\n return (\n <File.Source name={name} isExportable isIndexable>\n <Function\n export\n name={name}\n JSDoc={{ comments: description ? [`@description ${jsStringEscape(description)}`] : [] }}\n params={canOverride ? paramsSignature : undefined}\n returnType={returnType ?? undefined}\n >\n {seed ? (\n <>\n {`faker.seed(${JSON.stringify(seed)})`}\n <br />\n </>\n ) : undefined}\n {`return ${returnExpression}`}\n </Function>\n </File.Source>\n )\n }\n\n // Generate function with defaultFakeData structure\n const jsdoc = description ? `/**\\n * @description ${jsStringEscape(description)}\\n */\\n ` : ''\n const functionSignature = `${jsdoc}export function ${name}<TData extends Partial<${typeName}> = object>(data?: TData)`\n\n const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\\n ` : ''\n\n // When the object node has properties that transitively reference a cyclic schema,\n // the printer emits memoizing getters for those properties. Spreading the object\n // literal would immediately invoke those getters, triggering recursive faker calls\n // and causing a stack overflow. Detect this upfront via ast helpers so we can\n // use Object.defineProperty-based merging instead of spread.\n const { cyclicSchemas, schemaName } = printer.options\n const hasGetters =\n node.type === 'object' &&\n !!cyclicSchemas &&\n (node.properties ?? []).some((p) => ast.containsCircularRef(p.schema, { circularSchemas: cyclicSchemas, excludeName: schemaName }))\n\n const functionBody = hasGetters\n ? `{\n ${seedCode}const defaultFakeData = ${fakerText}\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })\n }\n }\n return defaultFakeData as Omit<typeof defaultFakeData, keyof TData> & TData\n}`\n : `{\n ${seedCode}const defaultFakeData = ${fakerText}\n return {\n ...defaultFakeData,\n ...(data || {}),\n } as Omit<typeof defaultFakeData, keyof TData> & TData\n}`\n\n return (\n <File.Source name={name} isExportable isIndexable>\n {functionSignature}\n {functionBody}\n </File.Source>\n )\n}\n"],"mappings":"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"}
@@ -24,54 +24,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- let node_path = require("node:path");
27
+ let _kubb_ast_utils = require("@kubb/ast/utils");
28
28
  let _kubb_core = require("@kubb/core");
29
29
  let _kubb_plugin_ts = require("@kubb/plugin-ts");
30
30
  let _kubb_renderer_jsx = require("@kubb/renderer-jsx");
31
+ let node_path = require("node:path");
31
32
  let _kubb_renderer_jsx_jsx_runtime = require("@kubb/renderer-jsx/jsx-runtime");
32
- //#region ../../internals/utils/src/string.ts
33
- /**
34
- * Strips a single matching pair of `"..."`, `'...'`, or `` `...` `` from both ends of `text`.
35
- * Returns the string unchanged when no balanced quote pair is found.
36
- *
37
- * @example
38
- * trimQuotes('"hello"') // 'hello'
39
- * trimQuotes('hello') // 'hello'
40
- */
41
- function trimQuotes(text) {
42
- if (text.length >= 2) {
43
- const first = text[0];
44
- const last = text[text.length - 1];
45
- if (first === "\"" && last === "\"" || first === "'" && last === "'" || first === "`" && last === "`") return text.slice(1, -1);
46
- }
47
- return text;
48
- }
49
- /**
50
- * Escapes characters that are not allowed inside JS string literals.
51
- * Handles quotes, backslashes, and Unicode line terminators (U+2028 / U+2029).
52
- *
53
- * @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
54
- *
55
- * @example
56
- * ```ts
57
- * jsStringEscape('say "hi"\nbye') // 'say \\"hi\\"\\nbye'
58
- * ```
59
- */
60
- function jsStringEscape(input) {
61
- return `${input}`.replace(/["'\\\n\r\u2028\u2029]/g, (character) => {
62
- switch (character) {
63
- case "\"":
64
- case "'":
65
- case "\\": return `\\${character}`;
66
- case "\n": return "\\n";
67
- case "\r": return "\\r";
68
- case "\u2028": return "\\u2028";
69
- case "\u2029": return "\\u2029";
70
- default: return "";
71
- }
72
- });
73
- }
74
- //#endregion
75
33
  //#region src/utils.ts
76
34
  /**
77
35
  * Returns the `@faker-js/faker` named export for a locale code.
@@ -306,14 +264,14 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
306
264
  children: /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.Function, {
307
265
  export: true,
308
266
  name,
309
- JSDoc: { comments: description ? [`@description ${jsStringEscape(description)}`] : [] },
267
+ JSDoc: { comments: description ? [`@description ${(0, _kubb_ast_utils.jsStringEscape)(description)}`] : [] },
310
268
  params: canOverride ? paramsSignature : void 0,
311
269
  returnType: returnType ?? void 0,
312
270
  children: [seed ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [`faker.seed(${JSON.stringify(seed)})`, /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)("br", {})] }) : void 0, `return ${returnExpression}`]
313
271
  })
314
272
  });
315
273
  }
316
- const functionSignature = `${description ? `/**\n * @description ${jsStringEscape(description)}\n */\n ` : ""}export function ${name}<TData extends Partial<${typeName}> = object>(data?: TData)`;
274
+ const functionSignature = `${description ? `/**\n * @description ${(0, _kubb_ast_utils.jsStringEscape)(description)}\n */\n ` : ""}export function ${name}<TData extends Partial<${typeName}> = object>(data?: TData)`;
317
275
  const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\n ` : "";
318
276
  const { cyclicSchemas, schemaName } = printer.options;
319
277
  const functionBody = node.type === "object" && !!cyclicSchemas && (node.properties ?? []).some((p) => _kubb_core.ast.containsCircularRef(p.schema, {
@@ -390,11 +348,5 @@ Object.defineProperty(exports, "resolveTypeReference", {
390
348
  return resolveTypeReference;
391
349
  }
392
350
  });
393
- Object.defineProperty(exports, "trimQuotes", {
394
- enumerable: true,
395
- get: function() {
396
- return trimQuotes;
397
- }
398
- });
399
351
 
400
- //# sourceMappingURL=Faker-DRL0W5Lt.cjs.map
352
+ //# sourceMappingURL=Faker-CcGjn5ZM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Faker-CcGjn5ZM.cjs","names":["ast","SCALAR_TYPES","ARRAY_TYPES","posix","ast","File","Function"],"sources":["../src/utils.ts","../src/components/Faker.tsx"],"sourcesContent":["import { posix } from 'node:path'\nimport { ast } from '@kubb/core'\nimport type { ResolverFaker } from './types.ts'\n\n/**\n * Returns the `@faker-js/faker` named export for a locale code.\n *\n * Without a locale, returns `'faker'` for the default English instance.\n * With a locale, the language code is converted to upper case and joined with any region suffix.\n *\n * @example Default\n * `localeToFakerImport() // 'faker'`\n *\n * @example Simple locale\n * `localeToFakerImport('de') // 'fakerDE'`\n *\n * @example Compound locale\n * `localeToFakerImport('de_AT') // 'fakerDE_AT'`\n */\nexport function localeToFakerImport(locale?: string): string {\n if (!locale) {\n return 'faker'\n }\n\n const parts = locale.split('_')\n parts[0] = parts[0]!.toUpperCase()\n return `faker${parts.join('_')}`\n}\n\n/**\n * Determines if a schema node can be overridden during faker generation.\n */\nexport function canOverrideSchema(node: ast.SchemaNode): boolean {\n return new Set<ast.SchemaNode['type']>([\n 'array',\n 'tuple',\n 'object',\n 'intersection',\n 'union',\n 'enum',\n 'ref',\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n ]).has(node.type)\n}\n\n/**\n * Resolves a parameter name based on its location (path, query, header, etc.) using the provided resolver.\n */\nexport function resolveParamNameByLocation(\n resolver: Pick<ResolverFaker, 'resolvePathParamsName' | 'resolveQueryParamsName' | 'resolveHeaderParamsName' | 'resolveParamName'>,\n node: ast.OperationNode,\n param: ast.ParameterNode,\n): string {\n switch (param.in) {\n case 'path':\n return resolver.resolvePathParamsName(node, param)\n case 'query':\n return resolver.resolveQueryParamsName(node, param)\n case 'header':\n return resolver.resolveHeaderParamsName(node, param)\n default:\n return resolver.resolveParamName(node, param)\n }\n}\n\nfunction shouldInlineSingleResponseSchema(schema: ast.SchemaNode): boolean {\n return new Set<ast.SchemaNode['type']>([\n 'any',\n 'unknown',\n 'void',\n 'null',\n 'array',\n 'tuple',\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n 'enum',\n 'union',\n ]).has(schema.type)\n}\n\n/**\n * Builds a response schema as a union of all response statuses.\n * Returns null if no responses are provided, or embeds single simple responses inline.\n */\nexport function buildResponseUnionSchema(node: ast.OperationNode, resolver: ResolverFaker): ast.SchemaNode | null {\n const responses = node.responses.filter((response) => response.content?.[0]?.schema)\n\n if (!responses.length) {\n return null\n }\n\n if (responses.length === 1) {\n const schema = responses[0]!.content?.[0]?.schema\n if (schema && shouldInlineSingleResponseSchema(schema)) {\n return schema\n }\n\n return ast.createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, responses[0]!.statusCode) })\n }\n\n return ast.createSchema({\n type: 'union',\n members: responses.map((response) => ast.createSchema({ type: 'ref', name: resolver.resolveResponseStatusName(node, response.statusCode) })),\n })\n}\n\nconst SCALAR_TYPES = new Set<ast.SchemaNode['type']>([\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n 'enum',\n])\nconst ARRAY_TYPES = new Set<ast.SchemaNode['type']>(['array'])\n\nfunction toRelativeImportPath(from: string, to: string): string {\n const relativePath = posix.relative(posix.dirname(from), to)\n return relativePath.startsWith('../') ? relativePath : `./${relativePath}`\n}\n\n/**\n * Resolves a type reference, determining if it needs an import statement or inline type reference.\n * Takes into account whether the type can be overridden and the file paths.\n */\nexport function resolveTypeReference({\n node,\n canOverride,\n name,\n typeName,\n filePath,\n typeFilePath,\n}: {\n node: ast.SchemaNode\n canOverride: boolean\n name: string\n typeName: string\n filePath: string\n typeFilePath: string\n}): { importPath?: string; typeName: string } {\n const { usesTypeName } = resolveFakerTypeUsage(node, typeName, canOverride)\n\n if (!usesTypeName) {\n return { typeName }\n }\n\n if (name === typeName) {\n return {\n typeName: `import('${toRelativeImportPath(filePath, typeFilePath)}').${typeName}`,\n }\n }\n\n return {\n importPath: typeFilePath,\n typeName,\n }\n}\n\n/**\n * Maps a schema node type to its corresponding scalar type representation.\n * Returns the type name for enums or the base type (string, number, etc.) for primitives.\n */\nfunction getScalarType(node: ast.SchemaNode, typeName: string): string {\n switch (node.type) {\n case 'string':\n case 'email':\n case 'url':\n case 'uuid':\n return 'string'\n case 'number':\n case 'integer':\n return 'number'\n case 'bigint':\n return 'bigint'\n case 'boolean':\n return 'boolean'\n case 'date':\n case 'time':\n return node.representation === 'date' ? 'Date' : 'string'\n case 'datetime':\n return 'string'\n case 'blob':\n return 'Blob'\n case 'enum':\n return typeName\n default:\n return typeName\n }\n}\n\n/**\n * Resolves faker type usage information for a schema.\n * Determines the data type, return type, and whether it uses the type name.\n */\nexport function resolveFakerTypeUsage(\n node: ast.SchemaNode,\n typeName: string,\n canOverride: boolean,\n): {\n dataType: string\n returnType: string | null\n usesTypeName: boolean\n} {\n const isArray = ARRAY_TYPES.has(node.type)\n const isTuple = node.type === 'tuple'\n const isScalar = SCALAR_TYPES.has(node.type)\n\n let dataType = `Partial<${typeName}>`\n\n if (isArray || isTuple || node.type === 'union' || node.type === 'enum') {\n dataType = typeName\n }\n\n if (isScalar) {\n dataType = getScalarType(node, typeName)\n }\n\n let returnType = canOverride ? typeName : null\n\n if (isScalar) {\n returnType = getScalarType(node, typeName)\n }\n\n return {\n dataType,\n returnType,\n usesTypeName: dataType.includes(typeName) || Boolean(returnType?.includes(typeName)),\n }\n}\n","import { jsStringEscape } from '@kubb/ast/utils'\nimport { ast } from '@kubb/core'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PrinterFakerFactory } from '../printers/printerFaker.ts'\nimport type { PluginFaker } from '../types.ts'\nimport { resolveFakerTypeUsage } from '../utils.ts'\n\ntype Props = {\n name: string\n typeName: string\n node: ast.SchemaNode\n printer: ast.Printer<PrinterFakerFactory>\n seed?: PluginFaker['options']['seed']\n description?: string\n canOverride: boolean\n}\n\nconst OBJECT_TYPES = new Set<ast.SchemaNode['type']>(['object', 'intersection'])\nconst ARRAY_TYPES = new Set<ast.SchemaNode['type']>(['array'])\nconst SCALAR_TYPES = new Set<ast.SchemaNode['type']>([\n 'string',\n 'email',\n 'url',\n 'uuid',\n 'number',\n 'integer',\n 'bigint',\n 'boolean',\n 'date',\n 'time',\n 'datetime',\n 'blob',\n 'enum',\n])\nconst declarationPrinter = functionPrinter({ mode: 'declaration' })\n\nexport function Faker({ node, description, name, typeName, printer, seed, canOverride }: Props): KubbReactNode {\n const fakerText = printer.print(node) ?? 'undefined'\n\n const isArray = ARRAY_TYPES.has(node.type)\n const isObject = OBJECT_TYPES.has(node.type)\n const isTuple = node.type === 'tuple'\n const isScalar = SCALAR_TYPES.has(node.type)\n\n const useGenericOverride = canOverride && isObject\n const fakerTextWithOverride = (() => {\n if (canOverride && isTuple) return `data || ${fakerText}`\n if (canOverride && isArray) return `[\\n ...${fakerText},\\n ...(data || [])\\n]`\n if (canOverride && isScalar) return `data ?? ${fakerText}`\n return fakerText\n })()\n\n const { dataType, returnType: resolvedReturnType } = resolveFakerTypeUsage(node, typeName, canOverride)\n\n if (!useGenericOverride) {\n const usesData = /\\bdata\\b/.test(fakerTextWithOverride)\n const dataParamName = usesData ? 'data' : '_data'\n const params = ast.createFunctionParameters({\n params: [\n ast.createFunctionParameter({\n name: dataParamName,\n type: ast.createParamsType({ variant: 'reference', name: dataType }),\n optional: true,\n }),\n ],\n })\n const paramsSignature = declarationPrinter.print(params) ?? ''\n const returnType = resolvedReturnType\n\n // A `ref` wrapper delegates to another faker. Object fakers are now generic and\n // widen to `Partial<T>` when called with a `Partial<T>`-typed argument, so cast\n // back to the wrapper's declared return type to keep it assignable.\n const returnExpression = node.type === 'ref' && canOverride && returnType ? `${fakerTextWithOverride} as ${returnType}` : fakerTextWithOverride\n\n return (\n <File.Source name={name} isExportable isIndexable>\n <Function\n export\n name={name}\n JSDoc={{ comments: description ? [`@description ${jsStringEscape(description)}`] : [] }}\n params={canOverride ? paramsSignature : undefined}\n returnType={returnType ?? undefined}\n >\n {seed ? (\n <>\n {`faker.seed(${JSON.stringify(seed)})`}\n <br />\n </>\n ) : undefined}\n {`return ${returnExpression}`}\n </Function>\n </File.Source>\n )\n }\n\n // Generate function with defaultFakeData structure\n const jsdoc = description ? `/**\\n * @description ${jsStringEscape(description)}\\n */\\n ` : ''\n const functionSignature = `${jsdoc}export function ${name}<TData extends Partial<${typeName}> = object>(data?: TData)`\n\n const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\\n ` : ''\n\n // When the object node has properties that transitively reference a cyclic schema,\n // the printer emits memoizing getters for those properties. Spreading the object\n // literal would immediately invoke those getters, triggering recursive faker calls\n // and causing a stack overflow. Detect this upfront via ast helpers so we can\n // use Object.defineProperty-based merging instead of spread.\n const { cyclicSchemas, schemaName } = printer.options\n const hasGetters =\n node.type === 'object' &&\n !!cyclicSchemas &&\n (node.properties ?? []).some((p) => ast.containsCircularRef(p.schema, { circularSchemas: cyclicSchemas, excludeName: schemaName }))\n\n const functionBody = hasGetters\n ? `{\n ${seedCode}const defaultFakeData = ${fakerText}\n if (data) {\n for (const [key, value] of Object.entries(data)) {\n Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })\n }\n }\n return defaultFakeData as Omit<typeof defaultFakeData, keyof TData> & TData\n}`\n : `{\n ${seedCode}const defaultFakeData = ${fakerText}\n return {\n ...defaultFakeData,\n ...(data || {}),\n } as Omit<typeof defaultFakeData, keyof TData> & TData\n}`\n\n return (\n <File.Source name={name} isExportable isIndexable>\n {functionSignature}\n {functionBody}\n </File.Source>\n )\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_Faker = require("./Faker-DRL0W5Lt.cjs");
2
+ const require_Faker = require("./Faker-CcGjn5ZM.cjs");
3
3
  exports.Faker = require_Faker.Faker;
@@ -1,2 +1,2 @@
1
- import { t as Faker } from "./Faker-SBhWTdC7.js";
1
+ import { t as Faker } from "./Faker-A5UuxwJj.js";
2
2
  export { Faker };
@@ -1,2 +1,2 @@
1
- import { t as Faker } from "./Faker-DBPx_MVh.js";
1
+ import { t as Faker } from "./Faker-CHh0JtBG.js";
2
2
  export { Faker };
@@ -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, s as trimQuotes, t as Faker } from "./Faker-DBPx_MVh.js";
2
+ import { a as resolveParamNameByLocation, i as localeToFakerImport, n as buildResponseUnionSchema, o as resolveTypeReference, r as canOverrideSchema, t as Faker } from "./Faker-CHh0JtBG.js";
3
+ import { buildObject, extractRefName, 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, jsxRendererSync } from "@kubb/renderer-jsx";
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 ? ast.extractRefName(node.ref) ?? node.name ?? node.schema?.name : node.name ?? node.schema?.name;
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;
@@ -316,8 +283,8 @@ const printerFaker = ast.definePrinter((options) => {
316
283
  },
317
284
  object(node) {
318
285
  const cyclicSchemas = this.options.cyclicSchemas;
319
- return `{${(node.properties ?? []).map((property) => {
320
- if (this.options.mapper && Object.hasOwn(this.options.mapper, property.name)) return `"${property.name}": ${this.options.mapper[property.name]}`;
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
@@ -325,9 +292,9 @@ const printerFaker = ast.definePrinter((options) => {
325
292
  if (cyclicSchemas && ast.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 `"${property.name}": ${value}`;
330
- }).join(",")}}`;
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: jsxRendererSync,
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?.enumType;
360
- const tsEnumTypeSuffix = pluginTs.options?.enumTypeSuffix ?? "Key";
361
- const schemaTypeName = isEnumSchema && (tsEnumType === "asConst" || tsEnumType === "asPascalConst") ? tsResolver.resolveEnumKeyName({ name: schemaName }, tsEnumTypeSuffix) : tsResolver.resolveTypeName(schemaName);
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
- })).filter((entry) => entry.path !== meta.file.path), fakerText);
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
- mode === "split" && usedImports.map((imp) => /* @__PURE__ */ jsx(File.Import, {
422
+ usedImports.map((imp) => /* @__PURE__ */ jsx(File.Import, {
457
423
  root: meta.file.path,
458
424
  path: imp.path,
459
425
  name: imp.name
@@ -690,4 +656,4 @@ const fakerGenerator = defineGenerator({
690
656
  //#endregion
691
657
  export { printerFaker as n, fakerGenerator as t };
692
658
 
693
- //# sourceMappingURL=fakerGenerator-DNJ61yLj.js.map
659
+ //# sourceMappingURL=fakerGenerator-DDNsdbH2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fakerGenerator-DDNsdbH2.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'\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 = ast.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, objectKey, stringify, toRegExpString } from '@kubb/ast/utils'\nimport { ast } from '@kubb/core'\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> = (node.members ?? [])\n .map((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 .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.union(items)\n },\n intersection(node): string {\n const items: Array<string> = (node.members ?? [])\n .map((member) =>\n printNested(member, {\n nestedInObject: true,\n }),\n )\n .filter((item): item is string => Boolean(item))\n\n return fakerKeywordMapper.and(items)\n },\n array(node): string {\n const items: Array<string> = (node.items ?? [])\n .map((member) =>\n printNested(member, {\n typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[number]` : undefined,\n nestedInObject: true,\n }),\n )\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 && ast.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 { 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 = ast.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.createSchema({ type: 'union', members: variants.map((variant) => ast.createSchema({ type: 'ref', name: variant.name })) })\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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"}