@kubb/plugin-faker 5.0.0-beta.3 → 5.0.0-beta.31

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 (37) hide show
  1. package/README.md +26 -5
  2. package/dist/{Faker-CdyPfOPg.d.ts → Faker-BaLJxPyl.d.ts} +2 -2
  3. package/dist/{Faker-fcQEB9i5.js → Faker-DwIc_lta.js} +38 -100
  4. package/dist/Faker-DwIc_lta.js.map +1 -0
  5. package/dist/{Faker-BgleOzVN.cjs → Faker-XuyEQflW.cjs} +37 -123
  6. package/dist/Faker-XuyEQflW.cjs.map +1 -0
  7. package/dist/components.cjs +1 -1
  8. package/dist/components.d.ts +1 -1
  9. package/dist/components.js +1 -1
  10. package/dist/{fakerGenerator-VJEVzLjc.cjs → fakerGenerator-BBr2WsG8.cjs} +236 -60
  11. package/dist/fakerGenerator-BBr2WsG8.cjs.map +1 -0
  12. package/dist/{fakerGenerator-D7daHCh6.js → fakerGenerator-BDNxA7KY.js} +235 -59
  13. package/dist/fakerGenerator-BDNxA7KY.js.map +1 -0
  14. package/dist/fakerGenerator-DSvAJTq3.d.ts +15 -0
  15. package/dist/generators.cjs +1 -1
  16. package/dist/generators.d.ts +1 -1
  17. package/dist/generators.js +1 -1
  18. package/dist/index.cjs +213 -42
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.ts +33 -12
  21. package/dist/index.js +214 -43
  22. package/dist/index.js.map +1 -1
  23. package/dist/{printerFaker-CJiwzoto.d.ts → printerFaker-Bhwq62d1.d.ts} +63 -26
  24. package/extension.yaml +817 -0
  25. package/package.json +9 -13
  26. package/src/components/Faker.tsx +50 -64
  27. package/src/generators/fakerGenerator.tsx +107 -67
  28. package/src/plugin.ts +25 -21
  29. package/src/printers/printerFaker.ts +80 -16
  30. package/src/resolvers/resolverFaker.ts +29 -37
  31. package/src/types.ts +36 -23
  32. package/src/utils.ts +6 -105
  33. package/dist/Faker-BgleOzVN.cjs.map +0 -1
  34. package/dist/Faker-fcQEB9i5.js.map +0 -1
  35. package/dist/fakerGenerator-C3Ho3BaI.d.ts +0 -9
  36. package/dist/fakerGenerator-D7daHCh6.js.map +0 -1
  37. package/dist/fakerGenerator-VJEVzLjc.cjs.map +0 -1
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <div align="center">
2
- <h1>Plugin Faker</h1>
2
+ <h1>@kubb/plugin-faker</h1>
3
3
  <a href="https://kubb.dev" target="_blank" rel="noopener noreferrer">
4
4
  <img width="180" src="https://raw.githubusercontent.com/kubb-labs/kubb/main/assets/logo.png" alt="Kubb logo">
5
5
  </a>
@@ -11,9 +11,9 @@
11
11
  [![Sponsors][sponsors-src]][sponsors-href]
12
12
 
13
13
  <h4>
14
- <a href="https://codesandbox.io/s/github/kubb-labs/kubb/tree/main//examples/typescript" target="_blank">View Demo</a>
14
+ <a href="https://codesandbox.io/s/github/kubb-labs/plugins/tree/main/examples/faker" target="_blank">View Demo</a>
15
15
  <span> · </span>
16
- <a href="https://kubb.dev/" target="_blank">Documentation</a>
16
+ <a href="https://kubb.dev/plugins/faker" target="_blank">Documentation</a>
17
17
  <span> · </span>
18
18
  <a href="https://github.com/kubb-labs/kubb/issues/" target="_blank">Report Bug</a>
19
19
  <span> · </span>
@@ -21,11 +21,32 @@
21
21
  </h4>
22
22
  </div>
23
23
 
24
- Swagger integration to create mock data based on Faker.js
24
+ `@kubb/plugin-faker` generates Faker.js factory functions from your OpenAPI schemas. Each schema produces a function that returns realistic mock data matching the schema's structure.
25
+
26
+ ## Features
27
+
28
+ - Creates one factory function per schema with optional field overrides
29
+ - Uses Faker.js to produce realistic values for common field types
30
+ - Handles recursive schemas with lazy getters to avoid circular reference errors
31
+ - Works with `@kubb/plugin-msw` to serve mock responses in the browser or Node.js
32
+
33
+ ## Installation
34
+
35
+ ```bash
36
+ bun add @kubb/plugin-faker
37
+ # or
38
+ pnpm add @kubb/plugin-faker
39
+ # or
40
+ npm install @kubb/plugin-faker
41
+ ```
42
+
43
+ ## Documentation
44
+
45
+ See the [full documentation](https://kubb.dev/plugins/faker) for configuration options and examples.
25
46
 
26
47
  ## Supporting Kubb
27
48
 
28
- Kubb uses an MIT-licensed open source project with its ongoing development made possible entirely by the support of Sponsors. If you would like to become a sponsor, please consider:
49
+ Kubb is an MIT-licensed open source project with its ongoing development made possible entirely by the support of Sponsors. If you would like to become a sponsor, please consider:
29
50
 
30
51
  - [Become a Sponsor on GitHub](https://github.com/sponsors/stijnvanhulle)
31
52
 
@@ -1,5 +1,5 @@
1
1
  import { t as __name } from "./chunk--u3MIqq1.js";
2
- import { o as PluginFaker, t as PrinterFakerFactory } from "./printerFaker-CJiwzoto.js";
2
+ import { o as PluginFaker, t as PrinterFakerFactory } from "./printerFaker-Bhwq62d1.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-CdyPfOPg.d.ts.map
27
+ //# sourceMappingURL=Faker-BaLJxPyl.d.ts.map
@@ -96,14 +96,6 @@ function canOverrideSchema(node) {
96
96
  ]).has(node.type);
97
97
  }
98
98
  /**
99
- * Resolves a schema reference by looking up the referenced schema in the provided array.
100
- * Returns the original node if it's not a reference.
101
- */
102
- function resolveSchemaRef(node, schemas) {
103
- if (node.type !== "ref") return node;
104
- return schemas.find((schema) => schema.name === node.name && schema.type !== "ref") ?? node;
105
- }
106
- /**
107
99
  * Resolves a parameter name based on its location (path, query, header, etc.) using the provided resolver.
108
100
  */
109
101
  function resolveParamNameByLocation(resolver, node, param) {
@@ -143,10 +135,11 @@ function shouldInlineSingleResponseSchema(schema) {
143
135
  * Returns null if no responses are provided, or embeds single simple responses inline.
144
136
  */
145
137
  function buildResponseUnionSchema(node, resolver) {
146
- const responses = node.responses.filter((response) => response.schema);
138
+ const responses = node.responses.filter((response) => response.content?.[0]?.schema);
147
139
  if (!responses.length) return null;
148
140
  if (responses.length === 1) {
149
- if (shouldInlineSingleResponseSchema(responses[0].schema)) return responses[0].schema;
141
+ const schema = responses[0].content?.[0]?.schema;
142
+ if (schema && shouldInlineSingleResponseSchema(schema)) return schema;
150
143
  return ast.createSchema({
151
144
  type: "ref",
152
145
  name: resolver.resolveResponseStatusName(node, responses[0].statusCode)
@@ -180,56 +173,6 @@ function toRelativeImportPath(from, to) {
180
173
  const relativePath = posix.relative(posix.dirname(from), to);
181
174
  return relativePath.startsWith("../") ? relativePath : `./${relativePath}`;
182
175
  }
183
- function escapeRegExp(value) {
184
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
185
- }
186
- /**
187
- * Filters imports to only those that are actually used in the generated code.
188
- * Checks for function calls matching the imported names.
189
- */
190
- function filterUsedImports(imports, text, skipImportNames = []) {
191
- return imports.filter((entry) => {
192
- return (Array.isArray(entry.name) ? entry.name : [entry.name]).map((name) => {
193
- if (typeof name === "string") return name;
194
- return name?.name ?? name?.propertyName;
195
- }).filter((name) => Boolean(name)).some((name) => {
196
- if (skipImportNames.includes(name)) return false;
197
- return new RegExp(`\\b${escapeRegExp(name)}\\b(?=\\s*\\()`).test(text);
198
- });
199
- });
200
- }
201
- /**
202
- * Detects and resolves import name conflicts by adding aliases to conflicting names.
203
- * Returns updated imports with a mapping of original names to their aliases.
204
- */
205
- function aliasConflictingImports(imports, reservedNames) {
206
- const reservedNameSet = new Set(reservedNames);
207
- const aliases = /* @__PURE__ */ new Map();
208
- return {
209
- imports: imports.map((entry) => {
210
- const aliasedNames = (Array.isArray(entry.name) ? entry.name : [entry.name]).map((item) => {
211
- if (typeof item !== "string" || !reservedNameSet.has(item)) return item;
212
- const alias = `${item}Schema`;
213
- aliases.set(item, alias);
214
- return {
215
- propertyName: item,
216
- name: alias
217
- };
218
- });
219
- return aliasedNames.some((item) => typeof item === "object" && item.name) ? {
220
- ...entry,
221
- name: aliasedNames
222
- } : entry;
223
- }),
224
- aliases
225
- };
226
- }
227
- /**
228
- * Replaces all occurrences of original names with their aliased versions in the given text.
229
- */
230
- function rewriteAliasedImports(text, aliases) {
231
- return Array.from(aliases).reduce((acc, [name, alias]) => acc.replace(new RegExp(`\\b${escapeRegExp(name)}\\b`, "g"), alias), text);
232
- }
233
176
  /**
234
177
  * Resolves a type reference, determining if it needs an import statement or inline type reference.
235
178
  * Takes into account whether the type can be overridden and the file paths.
@@ -276,7 +219,7 @@ function resolveFakerTypeUsage(node, typeName, canOverride) {
276
219
  let dataType = `Partial<${typeName}>`;
277
220
  if (isArray || isTuple || node.type === "union" || node.type === "enum") dataType = typeName;
278
221
  if (isScalar) dataType = getScalarType(node, typeName);
279
- let returnType = canOverride ? typeName : void 0;
222
+ let returnType = canOverride ? typeName : null;
280
223
  if (isScalar) returnType = getScalarType(node, typeName);
281
224
  return {
282
225
  dataType,
@@ -310,42 +253,15 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
310
253
  const isObject = OBJECT_TYPES.has(node.type);
311
254
  const isTuple = node.type === "tuple";
312
255
  const isScalar = SCALAR_TYPES.has(node.type);
313
- let fakerTextWithOverride = fakerText;
314
- let useGenericOverride = false;
315
- if (canOverride && isObject) useGenericOverride = true;
316
- if (canOverride && isTuple) fakerTextWithOverride = `data || ${fakerText}`;
317
- if (canOverride && isArray) fakerTextWithOverride = `[
318
- ...${fakerText},
319
- ...(data || [])
320
- ]`;
321
- if (canOverride && isScalar) fakerTextWithOverride = `data ?? ${fakerText}`;
256
+ const useGenericOverride = canOverride && isObject;
257
+ const fakerTextWithOverride = (() => {
258
+ if (canOverride && isTuple) return `data || ${fakerText}`;
259
+ if (canOverride && isArray) return `[\n ...${fakerText},\n ...(data || [])\n]`;
260
+ if (canOverride && isScalar) return `data ?? ${fakerText}`;
261
+ return fakerText;
262
+ })();
322
263
  const { dataType, returnType: resolvedReturnType } = resolveFakerTypeUsage(node, typeName, canOverride);
323
- let functionSignature = "";
324
- let functionBody = "";
325
- if (useGenericOverride) {
326
- functionSignature = `${description ? `/**\n * @description ${jsStringEscape(description)}\n */\n ` : ""}export function ${name}(data?: Partial<${typeName}>): Required<${typeName}>`;
327
- const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\n ` : "";
328
- const { cyclicSchemas, schemaName } = printer.options;
329
- if (node.type === "object" && !!cyclicSchemas && (node.properties ?? []).some((p) => ast.containsCircularRef(p.schema, {
330
- circularSchemas: cyclicSchemas,
331
- excludeName: schemaName
332
- }))) functionBody = `{
333
- ${seedCode}const defaultFakeData = ${fakerText}
334
- if (data) {
335
- for (const [key, value] of Object.entries(data)) {
336
- Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })
337
- }
338
- }
339
- return defaultFakeData as Required<${typeName}>
340
- }`;
341
- else functionBody = `{
342
- ${seedCode}const defaultFakeData = ${fakerText}
343
- return {
344
- ...defaultFakeData,
345
- ...(data || {}),
346
- } as Required<${typeName}>
347
- }`;
348
- } else {
264
+ if (!useGenericOverride) {
349
265
  const dataParamName = /\bdata\b/.test(fakerTextWithOverride) ? "data" : "_data";
350
266
  const params = ast.createFunctionParameters({ params: [ast.createFunctionParameter({
351
267
  name: dataParamName,
@@ -357,6 +273,7 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
357
273
  })] });
358
274
  const paramsSignature = declarationPrinter.print(params) ?? "";
359
275
  const returnType = resolvedReturnType;
276
+ const returnExpression = node.type === "ref" && canOverride && returnType ? `${fakerTextWithOverride} as ${returnType}` : fakerTextWithOverride;
360
277
  return /* @__PURE__ */ jsx(File.Source, {
361
278
  name,
362
279
  isExportable: true,
@@ -366,11 +283,32 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
366
283
  name,
367
284
  JSDoc: { comments: description ? [`@description ${jsStringEscape(description)}`] : [] },
368
285
  params: canOverride ? paramsSignature : void 0,
369
- returnType,
370
- children: [seed ? /* @__PURE__ */ jsxs(Fragment, { children: [`faker.seed(${JSON.stringify(seed)})`, /* @__PURE__ */ jsx("br", {})] }) : void 0, `return ${fakerTextWithOverride}`]
286
+ returnType: returnType ?? void 0,
287
+ children: [seed ? /* @__PURE__ */ jsxs(Fragment, { children: [`faker.seed(${JSON.stringify(seed)})`, /* @__PURE__ */ jsx("br", {})] }) : void 0, `return ${returnExpression}`]
371
288
  })
372
289
  });
373
290
  }
291
+ const functionSignature = `${description ? `/**\n * @description ${jsStringEscape(description)}\n */\n ` : ""}export function ${name}<TData extends Partial<${typeName}> = object>(data?: TData)`;
292
+ const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\n ` : "";
293
+ const { cyclicSchemas, schemaName } = printer.options;
294
+ const functionBody = node.type === "object" && !!cyclicSchemas && (node.properties ?? []).some((p) => ast.containsCircularRef(p.schema, {
295
+ circularSchemas: cyclicSchemas,
296
+ excludeName: schemaName
297
+ })) ? `{
298
+ ${seedCode}const defaultFakeData = ${fakerText}
299
+ if (data) {
300
+ for (const [key, value] of Object.entries(data)) {
301
+ Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })
302
+ }
303
+ }
304
+ return defaultFakeData as Omit<typeof defaultFakeData, keyof TData> & TData
305
+ }` : `{
306
+ ${seedCode}const defaultFakeData = ${fakerText}
307
+ return {
308
+ ...defaultFakeData,
309
+ ...(data || {}),
310
+ } as Omit<typeof defaultFakeData, keyof TData> & TData
311
+ }`;
374
312
  return /* @__PURE__ */ jsxs(File.Source, {
375
313
  name,
376
314
  isExportable: true,
@@ -379,6 +317,6 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
379
317
  });
380
318
  }
381
319
  //#endregion
382
- export { filterUsedImports as a, resolveSchemaRef as c, trimQuotes as d, canOverrideSchema as i, resolveTypeReference as l, aliasConflictingImports as n, localeToFakerImport as o, buildResponseUnionSchema as r, resolveParamNameByLocation as s, Faker as t, rewriteAliasedImports as u };
320
+ export { resolveParamNameByLocation as a, localeToFakerImport as i, buildResponseUnionSchema as n, resolveTypeReference as o, canOverrideSchema as r, trimQuotes as s, Faker as t };
383
321
 
384
- //# sourceMappingURL=Faker-fcQEB9i5.js.map
322
+ //# sourceMappingURL=Faker-DwIc_lta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Faker-DwIc_lta.js","names":["SCALAR_TYPES","ARRAY_TYPES"],"sources":["../../../internals/utils/src/string.ts","../src/utils.ts","../src/components/Faker.tsx"],"sourcesContent":["/**\n * Strips a single matching pair of `\"...\"`, `'...'`, or `` `...` `` from both ends of `text`.\n * Returns the string unchanged when no balanced quote pair is found.\n *\n * @example\n * trimQuotes('\"hello\"') // 'hello'\n * trimQuotes('hello') // 'hello'\n */\nexport function trimQuotes(text: string): string {\n if (text.length >= 2) {\n const first = text[0]\n const last = text[text.length - 1]\n if ((first === '\"' && last === '\"') || (first === \"'\" && last === \"'\") || (first === '`' && last === '`')) {\n return text.slice(1, -1)\n }\n }\n return text\n}\n\n/**\n * Escapes characters that are not allowed inside JS string literals.\n * Handles quotes, backslashes, and Unicode line terminators (U+2028 / U+2029).\n *\n * @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4\n *\n * @example\n * ```ts\n * jsStringEscape('say \"hi\"\\nbye') // 'say \\\\\"hi\\\\\"\\\\nbye'\n * ```\n */\nexport function jsStringEscape(input: unknown): string {\n return `${input}`.replace(/[\"'\\\\\\n\\r\\u2028\\u2029]/g, (character) => {\n switch (character) {\n case '\"':\n case \"'\":\n case '\\\\':\n return `\\\\${character}`\n case '\\n':\n return '\\\\n'\n case '\\r':\n return '\\\\r'\n case '\\u2028':\n return '\\\\u2028'\n case '\\u2029':\n return '\\\\u2029'\n default:\n return ''\n }\n })\n}\n\n/**\n * Strips the file extension from a path or file name.\n * Only removes the last `.ext` segment when the dot is not part of a directory name.\n *\n * @example\n * trimExtName('petStore.ts') // 'petStore'\n * trimExtName('/src/models/pet.ts') // '/src/models/pet'\n * trimExtName('/project.v2/gen/pet.ts') // '/project.v2/gen/pet'\n * trimExtName('noExtension') // 'noExtension'\n */\nexport function trimExtName(text: string): string {\n const dotIndex = text.lastIndexOf('.')\n if (dotIndex > 0 && !text.includes('/', dotIndex)) {\n return text.slice(0, dotIndex)\n }\n return text\n}\n","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 */\nexport function 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 '@internals/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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"}
@@ -121,14 +121,6 @@ function canOverrideSchema(node) {
121
121
  ]).has(node.type);
122
122
  }
123
123
  /**
124
- * Resolves a schema reference by looking up the referenced schema in the provided array.
125
- * Returns the original node if it's not a reference.
126
- */
127
- function resolveSchemaRef(node, schemas) {
128
- if (node.type !== "ref") return node;
129
- return schemas.find((schema) => schema.name === node.name && schema.type !== "ref") ?? node;
130
- }
131
- /**
132
124
  * Resolves a parameter name based on its location (path, query, header, etc.) using the provided resolver.
133
125
  */
134
126
  function resolveParamNameByLocation(resolver, node, param) {
@@ -168,10 +160,11 @@ function shouldInlineSingleResponseSchema(schema) {
168
160
  * Returns null if no responses are provided, or embeds single simple responses inline.
169
161
  */
170
162
  function buildResponseUnionSchema(node, resolver) {
171
- const responses = node.responses.filter((response) => response.schema);
163
+ const responses = node.responses.filter((response) => response.content?.[0]?.schema);
172
164
  if (!responses.length) return null;
173
165
  if (responses.length === 1) {
174
- if (shouldInlineSingleResponseSchema(responses[0].schema)) return responses[0].schema;
166
+ const schema = responses[0].content?.[0]?.schema;
167
+ if (schema && shouldInlineSingleResponseSchema(schema)) return schema;
175
168
  return _kubb_core.ast.createSchema({
176
169
  type: "ref",
177
170
  name: resolver.resolveResponseStatusName(node, responses[0].statusCode)
@@ -205,56 +198,6 @@ function toRelativeImportPath(from, to) {
205
198
  const relativePath = node_path.posix.relative(node_path.posix.dirname(from), to);
206
199
  return relativePath.startsWith("../") ? relativePath : `./${relativePath}`;
207
200
  }
208
- function escapeRegExp(value) {
209
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
210
- }
211
- /**
212
- * Filters imports to only those that are actually used in the generated code.
213
- * Checks for function calls matching the imported names.
214
- */
215
- function filterUsedImports(imports, text, skipImportNames = []) {
216
- return imports.filter((entry) => {
217
- return (Array.isArray(entry.name) ? entry.name : [entry.name]).map((name) => {
218
- if (typeof name === "string") return name;
219
- return name?.name ?? name?.propertyName;
220
- }).filter((name) => Boolean(name)).some((name) => {
221
- if (skipImportNames.includes(name)) return false;
222
- return new RegExp(`\\b${escapeRegExp(name)}\\b(?=\\s*\\()`).test(text);
223
- });
224
- });
225
- }
226
- /**
227
- * Detects and resolves import name conflicts by adding aliases to conflicting names.
228
- * Returns updated imports with a mapping of original names to their aliases.
229
- */
230
- function aliasConflictingImports(imports, reservedNames) {
231
- const reservedNameSet = new Set(reservedNames);
232
- const aliases = /* @__PURE__ */ new Map();
233
- return {
234
- imports: imports.map((entry) => {
235
- const aliasedNames = (Array.isArray(entry.name) ? entry.name : [entry.name]).map((item) => {
236
- if (typeof item !== "string" || !reservedNameSet.has(item)) return item;
237
- const alias = `${item}Schema`;
238
- aliases.set(item, alias);
239
- return {
240
- propertyName: item,
241
- name: alias
242
- };
243
- });
244
- return aliasedNames.some((item) => typeof item === "object" && item.name) ? {
245
- ...entry,
246
- name: aliasedNames
247
- } : entry;
248
- }),
249
- aliases
250
- };
251
- }
252
- /**
253
- * Replaces all occurrences of original names with their aliased versions in the given text.
254
- */
255
- function rewriteAliasedImports(text, aliases) {
256
- return Array.from(aliases).reduce((acc, [name, alias]) => acc.replace(new RegExp(`\\b${escapeRegExp(name)}\\b`, "g"), alias), text);
257
- }
258
201
  /**
259
202
  * Resolves a type reference, determining if it needs an import statement or inline type reference.
260
203
  * Takes into account whether the type can be overridden and the file paths.
@@ -301,7 +244,7 @@ function resolveFakerTypeUsage(node, typeName, canOverride) {
301
244
  let dataType = `Partial<${typeName}>`;
302
245
  if (isArray || isTuple || node.type === "union" || node.type === "enum") dataType = typeName;
303
246
  if (isScalar) dataType = getScalarType(node, typeName);
304
- let returnType = canOverride ? typeName : void 0;
247
+ let returnType = canOverride ? typeName : null;
305
248
  if (isScalar) returnType = getScalarType(node, typeName);
306
249
  return {
307
250
  dataType,
@@ -335,42 +278,15 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
335
278
  const isObject = OBJECT_TYPES.has(node.type);
336
279
  const isTuple = node.type === "tuple";
337
280
  const isScalar = SCALAR_TYPES.has(node.type);
338
- let fakerTextWithOverride = fakerText;
339
- let useGenericOverride = false;
340
- if (canOverride && isObject) useGenericOverride = true;
341
- if (canOverride && isTuple) fakerTextWithOverride = `data || ${fakerText}`;
342
- if (canOverride && isArray) fakerTextWithOverride = `[
343
- ...${fakerText},
344
- ...(data || [])
345
- ]`;
346
- if (canOverride && isScalar) fakerTextWithOverride = `data ?? ${fakerText}`;
281
+ const useGenericOverride = canOverride && isObject;
282
+ const fakerTextWithOverride = (() => {
283
+ if (canOverride && isTuple) return `data || ${fakerText}`;
284
+ if (canOverride && isArray) return `[\n ...${fakerText},\n ...(data || [])\n]`;
285
+ if (canOverride && isScalar) return `data ?? ${fakerText}`;
286
+ return fakerText;
287
+ })();
347
288
  const { dataType, returnType: resolvedReturnType } = resolveFakerTypeUsage(node, typeName, canOverride);
348
- let functionSignature = "";
349
- let functionBody = "";
350
- if (useGenericOverride) {
351
- functionSignature = `${description ? `/**\n * @description ${jsStringEscape(description)}\n */\n ` : ""}export function ${name}(data?: Partial<${typeName}>): Required<${typeName}>`;
352
- const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\n ` : "";
353
- const { cyclicSchemas, schemaName } = printer.options;
354
- if (node.type === "object" && !!cyclicSchemas && (node.properties ?? []).some((p) => _kubb_core.ast.containsCircularRef(p.schema, {
355
- circularSchemas: cyclicSchemas,
356
- excludeName: schemaName
357
- }))) functionBody = `{
358
- ${seedCode}const defaultFakeData = ${fakerText}
359
- if (data) {
360
- for (const [key, value] of Object.entries(data)) {
361
- Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })
362
- }
363
- }
364
- return defaultFakeData as Required<${typeName}>
365
- }`;
366
- else functionBody = `{
367
- ${seedCode}const defaultFakeData = ${fakerText}
368
- return {
369
- ...defaultFakeData,
370
- ...(data || {}),
371
- } as Required<${typeName}>
372
- }`;
373
- } else {
289
+ if (!useGenericOverride) {
374
290
  const dataParamName = /\bdata\b/.test(fakerTextWithOverride) ? "data" : "_data";
375
291
  const params = _kubb_core.ast.createFunctionParameters({ params: [_kubb_core.ast.createFunctionParameter({
376
292
  name: dataParamName,
@@ -382,6 +298,7 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
382
298
  })] });
383
299
  const paramsSignature = declarationPrinter.print(params) ?? "";
384
300
  const returnType = resolvedReturnType;
301
+ const returnExpression = node.type === "ref" && canOverride && returnType ? `${fakerTextWithOverride} as ${returnType}` : fakerTextWithOverride;
385
302
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
386
303
  name,
387
304
  isExportable: true,
@@ -391,11 +308,32 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
391
308
  name,
392
309
  JSDoc: { comments: description ? [`@description ${jsStringEscape(description)}`] : [] },
393
310
  params: canOverride ? paramsSignature : void 0,
394
- returnType,
395
- 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 ${fakerTextWithOverride}`]
311
+ returnType: returnType ?? void 0,
312
+ 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}`]
396
313
  })
397
314
  });
398
315
  }
316
+ const functionSignature = `${description ? `/**\n * @description ${jsStringEscape(description)}\n */\n ` : ""}export function ${name}<TData extends Partial<${typeName}> = object>(data?: TData)`;
317
+ const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\n ` : "";
318
+ const { cyclicSchemas, schemaName } = printer.options;
319
+ const functionBody = node.type === "object" && !!cyclicSchemas && (node.properties ?? []).some((p) => _kubb_core.ast.containsCircularRef(p.schema, {
320
+ circularSchemas: cyclicSchemas,
321
+ excludeName: schemaName
322
+ })) ? `{
323
+ ${seedCode}const defaultFakeData = ${fakerText}
324
+ if (data) {
325
+ for (const [key, value] of Object.entries(data)) {
326
+ Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })
327
+ }
328
+ }
329
+ return defaultFakeData as Omit<typeof defaultFakeData, keyof TData> & TData
330
+ }` : `{
331
+ ${seedCode}const defaultFakeData = ${fakerText}
332
+ return {
333
+ ...defaultFakeData,
334
+ ...(data || {}),
335
+ } as Omit<typeof defaultFakeData, keyof TData> & TData
336
+ }`;
399
337
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File.Source, {
400
338
  name,
401
339
  isExportable: true,
@@ -422,12 +360,6 @@ Object.defineProperty(exports, "__toESM", {
422
360
  return __toESM;
423
361
  }
424
362
  });
425
- Object.defineProperty(exports, "aliasConflictingImports", {
426
- enumerable: true,
427
- get: function() {
428
- return aliasConflictingImports;
429
- }
430
- });
431
363
  Object.defineProperty(exports, "buildResponseUnionSchema", {
432
364
  enumerable: true,
433
365
  get: function() {
@@ -440,12 +372,6 @@ Object.defineProperty(exports, "canOverrideSchema", {
440
372
  return canOverrideSchema;
441
373
  }
442
374
  });
443
- Object.defineProperty(exports, "filterUsedImports", {
444
- enumerable: true,
445
- get: function() {
446
- return filterUsedImports;
447
- }
448
- });
449
375
  Object.defineProperty(exports, "localeToFakerImport", {
450
376
  enumerable: true,
451
377
  get: function() {
@@ -458,24 +384,12 @@ Object.defineProperty(exports, "resolveParamNameByLocation", {
458
384
  return resolveParamNameByLocation;
459
385
  }
460
386
  });
461
- Object.defineProperty(exports, "resolveSchemaRef", {
462
- enumerable: true,
463
- get: function() {
464
- return resolveSchemaRef;
465
- }
466
- });
467
387
  Object.defineProperty(exports, "resolveTypeReference", {
468
388
  enumerable: true,
469
389
  get: function() {
470
390
  return resolveTypeReference;
471
391
  }
472
392
  });
473
- Object.defineProperty(exports, "rewriteAliasedImports", {
474
- enumerable: true,
475
- get: function() {
476
- return rewriteAliasedImports;
477
- }
478
- });
479
393
  Object.defineProperty(exports, "trimQuotes", {
480
394
  enumerable: true,
481
395
  get: function() {
@@ -483,4 +397,4 @@ Object.defineProperty(exports, "trimQuotes", {
483
397
  }
484
398
  });
485
399
 
486
- //# sourceMappingURL=Faker-BgleOzVN.cjs.map
400
+ //# sourceMappingURL=Faker-XuyEQflW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Faker-XuyEQflW.cjs","names":["ast","SCALAR_TYPES","ARRAY_TYPES","posix","ast","File","Function"],"sources":["../../../internals/utils/src/string.ts","../src/utils.ts","../src/components/Faker.tsx"],"sourcesContent":["/**\n * Strips a single matching pair of `\"...\"`, `'...'`, or `` `...` `` from both ends of `text`.\n * Returns the string unchanged when no balanced quote pair is found.\n *\n * @example\n * trimQuotes('\"hello\"') // 'hello'\n * trimQuotes('hello') // 'hello'\n */\nexport function trimQuotes(text: string): string {\n if (text.length >= 2) {\n const first = text[0]\n const last = text[text.length - 1]\n if ((first === '\"' && last === '\"') || (first === \"'\" && last === \"'\") || (first === '`' && last === '`')) {\n return text.slice(1, -1)\n }\n }\n return text\n}\n\n/**\n * Escapes characters that are not allowed inside JS string literals.\n * Handles quotes, backslashes, and Unicode line terminators (U+2028 / U+2029).\n *\n * @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4\n *\n * @example\n * ```ts\n * jsStringEscape('say \"hi\"\\nbye') // 'say \\\\\"hi\\\\\"\\\\nbye'\n * ```\n */\nexport function jsStringEscape(input: unknown): string {\n return `${input}`.replace(/[\"'\\\\\\n\\r\\u2028\\u2029]/g, (character) => {\n switch (character) {\n case '\"':\n case \"'\":\n case '\\\\':\n return `\\\\${character}`\n case '\\n':\n return '\\\\n'\n case '\\r':\n return '\\\\r'\n case '\\u2028':\n return '\\\\u2028'\n case '\\u2029':\n return '\\\\u2029'\n default:\n return ''\n }\n })\n}\n\n/**\n * Strips the file extension from a path or file name.\n * Only removes the last `.ext` segment when the dot is not part of a directory name.\n *\n * @example\n * trimExtName('petStore.ts') // 'petStore'\n * trimExtName('/src/models/pet.ts') // '/src/models/pet'\n * trimExtName('/project.v2/gen/pet.ts') // '/project.v2/gen/pet'\n * trimExtName('noExtension') // 'noExtension'\n */\nexport function trimExtName(text: string): string {\n const dotIndex = text.lastIndexOf('.')\n if (dotIndex > 0 && !text.includes('/', dotIndex)) {\n return text.slice(0, dotIndex)\n }\n return text\n}\n","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 */\nexport function 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 '@internals/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-BgleOzVN.cjs");
2
+ const require_Faker = require("./Faker-XuyEQflW.cjs");
3
3
  exports.Faker = require_Faker.Faker;
@@ -1,2 +1,2 @@
1
- import { t as Faker } from "./Faker-CdyPfOPg.js";
1
+ import { t as Faker } from "./Faker-BaLJxPyl.js";
2
2
  export { Faker };
@@ -1,2 +1,2 @@
1
- import { t as Faker } from "./Faker-fcQEB9i5.js";
1
+ import { t as Faker } from "./Faker-DwIc_lta.js";
2
2
  export { Faker };