@kubb/plugin-faker 5.0.0-beta.4 → 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 (38) hide show
  1. package/README.md +39 -22
  2. package/dist/{Faker-CdyPfOPg.d.ts → Faker-A5UuxwJj.d.ts} +3 -3
  3. package/dist/{Faker-fcQEB9i5.js → Faker-CHh0JtBG.js} +41 -145
  4. package/dist/Faker-CHh0JtBG.js.map +1 -0
  5. package/dist/{Faker-BgleOzVN.cjs → Faker-CcGjn5ZM.cjs} +40 -174
  6. package/dist/Faker-CcGjn5ZM.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-D7daHCh6.js → fakerGenerator-DDNsdbH2.js} +237 -94
  11. package/dist/fakerGenerator-DDNsdbH2.js.map +1 -0
  12. package/dist/{fakerGenerator-VJEVzLjc.cjs → fakerGenerator-DrwGWYwv.cjs} +240 -97
  13. package/dist/fakerGenerator-DrwGWYwv.cjs.map +1 -0
  14. package/dist/fakerGenerator-KKVr-CA2.d.ts +14 -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 +240 -69
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.ts +35 -15
  21. package/dist/index.js +241 -70
  22. package/dist/index.js.map +1 -1
  23. package/dist/{printerFaker-CJiwzoto.d.ts → printerFaker-CMCJT3FB.d.ts} +68 -35
  24. package/package.json +12 -22
  25. package/src/components/Faker.tsx +51 -65
  26. package/src/generators/fakerGenerator.tsx +108 -72
  27. package/src/plugin.ts +27 -23
  28. package/src/printers/printerFaker.ts +102 -40
  29. package/src/resolvers/resolverFaker.ts +31 -39
  30. package/src/types.ts +40 -31
  31. package/src/utils.ts +7 -106
  32. package/dist/Faker-BgleOzVN.cjs.map +0 -1
  33. package/dist/Faker-fcQEB9i5.js.map +0 -1
  34. package/dist/fakerGenerator-C3Ho3BaI.d.ts +0 -9
  35. package/dist/fakerGenerator-D7daHCh6.js.map +0 -1
  36. package/dist/fakerGenerator-VJEVzLjc.cjs.map +0 -1
  37. package/extension.yaml +0 -364
  38. /package/dist/{chunk--u3MIqq1.js → chunk-C0LytTxp.js} +0 -0
@@ -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.
@@ -121,14 +79,6 @@ function canOverrideSchema(node) {
121
79
  ]).has(node.type);
122
80
  }
123
81
  /**
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
82
  * Resolves a parameter name based on its location (path, query, header, etc.) using the provided resolver.
133
83
  */
134
84
  function resolveParamNameByLocation(resolver, node, param) {
@@ -168,10 +118,11 @@ function shouldInlineSingleResponseSchema(schema) {
168
118
  * Returns null if no responses are provided, or embeds single simple responses inline.
169
119
  */
170
120
  function buildResponseUnionSchema(node, resolver) {
171
- const responses = node.responses.filter((response) => response.schema);
121
+ const responses = node.responses.filter((response) => response.content?.[0]?.schema);
172
122
  if (!responses.length) return null;
173
123
  if (responses.length === 1) {
174
- if (shouldInlineSingleResponseSchema(responses[0].schema)) return responses[0].schema;
124
+ const schema = responses[0].content?.[0]?.schema;
125
+ if (schema && shouldInlineSingleResponseSchema(schema)) return schema;
175
126
  return _kubb_core.ast.createSchema({
176
127
  type: "ref",
177
128
  name: resolver.resolveResponseStatusName(node, responses[0].statusCode)
@@ -205,56 +156,6 @@ function toRelativeImportPath(from, to) {
205
156
  const relativePath = node_path.posix.relative(node_path.posix.dirname(from), to);
206
157
  return relativePath.startsWith("../") ? relativePath : `./${relativePath}`;
207
158
  }
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
159
  /**
259
160
  * Resolves a type reference, determining if it needs an import statement or inline type reference.
260
161
  * Takes into account whether the type can be overridden and the file paths.
@@ -301,7 +202,7 @@ function resolveFakerTypeUsage(node, typeName, canOverride) {
301
202
  let dataType = `Partial<${typeName}>`;
302
203
  if (isArray || isTuple || node.type === "union" || node.type === "enum") dataType = typeName;
303
204
  if (isScalar) dataType = getScalarType(node, typeName);
304
- let returnType = canOverride ? typeName : void 0;
205
+ let returnType = canOverride ? typeName : null;
305
206
  if (isScalar) returnType = getScalarType(node, typeName);
306
207
  return {
307
208
  dataType,
@@ -335,42 +236,15 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
335
236
  const isObject = OBJECT_TYPES.has(node.type);
336
237
  const isTuple = node.type === "tuple";
337
238
  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}`;
239
+ const useGenericOverride = canOverride && isObject;
240
+ const fakerTextWithOverride = (() => {
241
+ if (canOverride && isTuple) return `data || ${fakerText}`;
242
+ if (canOverride && isArray) return `[\n ...${fakerText},\n ...(data || [])\n]`;
243
+ if (canOverride && isScalar) return `data ?? ${fakerText}`;
244
+ return fakerText;
245
+ })();
347
246
  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 {
247
+ if (!useGenericOverride) {
374
248
  const dataParamName = /\bdata\b/.test(fakerTextWithOverride) ? "data" : "_data";
375
249
  const params = _kubb_core.ast.createFunctionParameters({ params: [_kubb_core.ast.createFunctionParameter({
376
250
  name: dataParamName,
@@ -382,6 +256,7 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
382
256
  })] });
383
257
  const paramsSignature = declarationPrinter.print(params) ?? "";
384
258
  const returnType = resolvedReturnType;
259
+ const returnExpression = node.type === "ref" && canOverride && returnType ? `${fakerTextWithOverride} as ${returnType}` : fakerTextWithOverride;
385
260
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
386
261
  name,
387
262
  isExportable: true,
@@ -389,13 +264,34 @@ function Faker({ node, description, name, typeName, printer, seed, canOverride }
389
264
  children: /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.Function, {
390
265
  export: true,
391
266
  name,
392
- JSDoc: { comments: description ? [`@description ${jsStringEscape(description)}`] : [] },
267
+ JSDoc: { comments: description ? [`@description ${(0, _kubb_ast_utils.jsStringEscape)(description)}`] : [] },
393
268
  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}`]
269
+ returnType: returnType ?? void 0,
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}`]
396
271
  })
397
272
  });
398
273
  }
274
+ const functionSignature = `${description ? `/**\n * @description ${(0, _kubb_ast_utils.jsStringEscape)(description)}\n */\n ` : ""}export function ${name}<TData extends Partial<${typeName}> = object>(data?: TData)`;
275
+ const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\n ` : "";
276
+ const { cyclicSchemas, schemaName } = printer.options;
277
+ const functionBody = node.type === "object" && !!cyclicSchemas && (node.properties ?? []).some((p) => _kubb_core.ast.containsCircularRef(p.schema, {
278
+ circularSchemas: cyclicSchemas,
279
+ excludeName: schemaName
280
+ })) ? `{
281
+ ${seedCode}const defaultFakeData = ${fakerText}
282
+ if (data) {
283
+ for (const [key, value] of Object.entries(data)) {
284
+ Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })
285
+ }
286
+ }
287
+ return defaultFakeData as Omit<typeof defaultFakeData, keyof TData> & TData
288
+ }` : `{
289
+ ${seedCode}const defaultFakeData = ${fakerText}
290
+ return {
291
+ ...defaultFakeData,
292
+ ...(data || {}),
293
+ } as Omit<typeof defaultFakeData, keyof TData> & TData
294
+ }`;
399
295
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File.Source, {
400
296
  name,
401
297
  isExportable: true,
@@ -422,12 +318,6 @@ Object.defineProperty(exports, "__toESM", {
422
318
  return __toESM;
423
319
  }
424
320
  });
425
- Object.defineProperty(exports, "aliasConflictingImports", {
426
- enumerable: true,
427
- get: function() {
428
- return aliasConflictingImports;
429
- }
430
- });
431
321
  Object.defineProperty(exports, "buildResponseUnionSchema", {
432
322
  enumerable: true,
433
323
  get: function() {
@@ -440,12 +330,6 @@ Object.defineProperty(exports, "canOverrideSchema", {
440
330
  return canOverrideSchema;
441
331
  }
442
332
  });
443
- Object.defineProperty(exports, "filterUsedImports", {
444
- enumerable: true,
445
- get: function() {
446
- return filterUsedImports;
447
- }
448
- });
449
333
  Object.defineProperty(exports, "localeToFakerImport", {
450
334
  enumerable: true,
451
335
  get: function() {
@@ -458,29 +342,11 @@ Object.defineProperty(exports, "resolveParamNameByLocation", {
458
342
  return resolveParamNameByLocation;
459
343
  }
460
344
  });
461
- Object.defineProperty(exports, "resolveSchemaRef", {
462
- enumerable: true,
463
- get: function() {
464
- return resolveSchemaRef;
465
- }
466
- });
467
345
  Object.defineProperty(exports, "resolveTypeReference", {
468
346
  enumerable: true,
469
347
  get: function() {
470
348
  return resolveTypeReference;
471
349
  }
472
350
  });
473
- Object.defineProperty(exports, "rewriteAliasedImports", {
474
- enumerable: true,
475
- get: function() {
476
- return rewriteAliasedImports;
477
- }
478
- });
479
- Object.defineProperty(exports, "trimQuotes", {
480
- enumerable: true,
481
- get: function() {
482
- return trimQuotes;
483
- }
484
- });
485
351
 
486
- //# sourceMappingURL=Faker-BgleOzVN.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-BgleOzVN.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-CdyPfOPg.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-fcQEB9i5.js";
1
+ import { t as Faker } from "./Faker-CHh0JtBG.js";
2
2
  export { Faker };