@kubb/plugin-faker 5.0.0-beta.22 → 5.0.0-beta.27

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 (36) hide show
  1. package/dist/{Faker-BMgoFj8b.d.ts → Faker-BQpBZ2hU.d.ts} +2 -2
  2. package/dist/{Faker-AHTTvWZS.js → Faker-C7Cu9GKC.js} +3 -3
  3. package/dist/Faker-C7Cu9GKC.js.map +1 -0
  4. package/dist/{Faker-BoPNqNfi.cjs → Faker-DaKMu5pc.cjs} +3 -3
  5. package/dist/Faker-DaKMu5pc.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-DnCf6Dr6.cjs → fakerGenerator-C00Es7eC.cjs} +14 -8
  10. package/dist/fakerGenerator-C00Es7eC.cjs.map +1 -0
  11. package/dist/fakerGenerator-C85ME3uM.d.ts +15 -0
  12. package/dist/{fakerGenerator-Br2FyPbG.js → fakerGenerator-Crs3X84u.js} +14 -8
  13. package/dist/fakerGenerator-Crs3X84u.js.map +1 -0
  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 +54 -14
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +33 -12
  20. package/dist/index.js +54 -14
  21. package/dist/index.js.map +1 -1
  22. package/dist/{printerFaker-W0pLunAj.d.ts → printerFaker-GYscoNnG.d.ts} +50 -26
  23. package/extension.yaml +572 -122
  24. package/package.json +5 -5
  25. package/src/components/Faker.tsx +1 -1
  26. package/src/generators/fakerGenerator.tsx +15 -6
  27. package/src/plugin.ts +23 -6
  28. package/src/printers/printerFaker.ts +28 -10
  29. package/src/resolvers/resolverFaker.ts +10 -11
  30. package/src/types.ts +29 -23
  31. package/src/utils.ts +2 -2
  32. package/dist/Faker-AHTTvWZS.js.map +0 -1
  33. package/dist/Faker-BoPNqNfi.cjs.map +0 -1
  34. package/dist/fakerGenerator-B-QnVz9o.d.ts +0 -9
  35. package/dist/fakerGenerator-Br2FyPbG.js.map +0 -1
  36. package/dist/fakerGenerator-DnCf6Dr6.cjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/plugin-faker",
3
- "version": "5.0.0-beta.22",
3
+ "version": "5.0.0-beta.27",
4
4
  "description": "Generate Faker.js mock data factories from your OpenAPI schemas. Produces realistic seed data, test fixtures, and datasets for development and testing.",
5
5
  "keywords": [
6
6
  "code-generation",
@@ -66,15 +66,15 @@
66
66
  "registry": "https://registry.npmjs.org/"
67
67
  },
68
68
  "dependencies": {
69
- "@kubb/core": "5.0.0-beta.22",
70
- "@kubb/renderer-jsx": "5.0.0-beta.22",
71
- "@kubb/plugin-ts": "5.0.0-beta.22"
69
+ "@kubb/core": "5.0.0-beta.27",
70
+ "@kubb/renderer-jsx": "5.0.0-beta.27",
71
+ "@kubb/plugin-ts": "5.0.0-beta.27"
72
72
  },
73
73
  "devDependencies": {
74
74
  "@internals/utils": "0.0.0"
75
75
  },
76
76
  "peerDependencies": {
77
- "@kubb/renderer-jsx": "5.0.0-beta.22"
77
+ "@kubb/renderer-jsx": "5.0.0-beta.27"
78
78
  },
79
79
  "size-limit": [
80
80
  {
@@ -76,7 +76,7 @@ export function Faker({ node, description, name, typeName, printer, seed, canOve
76
76
  name={name}
77
77
  JSDoc={{ comments: description ? [`@description ${jsStringEscape(description)}`] : [] }}
78
78
  params={canOverride ? paramsSignature : undefined}
79
- returnType={returnType}
79
+ returnType={returnType ?? undefined}
80
80
  >
81
81
  {seed ? (
82
82
  <>
@@ -7,6 +7,12 @@ import { printerFaker } from '../printers/printerFaker.ts'
7
7
  import type { PluginFaker } from '../types.ts'
8
8
  import { buildResponseUnionSchema, canOverrideSchema, localeToFakerImport, resolveParamNameByLocation, resolveTypeReference } from '../utils.ts'
9
9
 
10
+ /**
11
+ * Built-in generator for `@kubb/plugin-faker`. Emits one `createX` factory
12
+ * per schema in the spec plus per-operation request/response factories. Each
13
+ * factory returns a value matching the corresponding TypeScript type from
14
+ * `@kubb/plugin-ts`.
15
+ */
10
16
  export const fakerGenerator = defineGenerator<PluginFaker>({
11
17
  name: 'faker',
12
18
  renderer: jsxRendererSync,
@@ -25,11 +31,11 @@ export const fakerGenerator = defineGenerator<PluginFaker>({
25
31
  const mode = ctx.getMode(output)
26
32
  const meta = {
27
33
  name: resolver.resolveName(schemaName),
28
- file: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }),
34
+ file: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }),
29
35
  typeName: tsResolver.resolveTypeName(schemaName),
30
36
  typeFile: tsResolver.resolveFile(
31
37
  { name: schemaName, extname: '.ts' },
32
- { root, output: pluginTs.options?.output ?? output, group: pluginTs.options?.group },
38
+ { root, output: pluginTs.options?.output ?? output, group: pluginTs.options?.group ?? undefined },
33
39
  ),
34
40
  } as const
35
41
  const canOverride = canOverrideSchema(node)
@@ -57,7 +63,7 @@ export const fakerGenerator = defineGenerator<PluginFaker>({
57
63
  const imports = adapter
58
64
  .getImports(node, (schemaName) => ({
59
65
  name: resolver.resolveName(schemaName),
60
- path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }).path,
66
+ path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,
61
67
  }))
62
68
  .filter((entry) => entry.path !== meta.file.path)
63
69
  const usedImports = filterUsedImports(imports, fakerText)
@@ -131,7 +137,10 @@ export const fakerGenerator = defineGenerator<PluginFaker>({
131
137
  const cyclicSchemas = new Set<string>(ctx.meta.circularNames)
132
138
 
133
139
  const meta = {
134
- file: resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group }),
140
+ file: resolver.resolveFile(
141
+ { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },
142
+ { root, output, group: group ?? undefined },
143
+ ),
135
144
  typeFile: tsResolver.resolveFile(
136
145
  {
137
146
  name: node.operationId,
@@ -142,7 +151,7 @@ export const fakerGenerator = defineGenerator<PluginFaker>({
142
151
  {
143
152
  root,
144
153
  output: pluginTs.options?.output ?? output,
145
- group: pluginTs.options?.group,
154
+ group: pluginTs.options?.group ?? undefined,
146
155
  },
147
156
  ),
148
157
  } as const
@@ -151,7 +160,7 @@ export const fakerGenerator = defineGenerator<PluginFaker>({
151
160
  return adapter
152
161
  .getImports(schema, (schemaName) => ({
153
162
  name: resolver.resolveName(schemaName),
154
- path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }).path,
163
+ path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,
155
164
  }))
156
165
  .filter((entry) => entry.path !== meta.file.path)
157
166
  }
package/src/plugin.ts CHANGED
@@ -6,17 +6,34 @@ import { resolverFaker } from './resolvers/resolverFaker.ts'
6
6
  import type { PluginFaker } from './types.ts'
7
7
 
8
8
  /**
9
- * Canonical plugin name for `@kubb/plugin-faker`, used in driver lookups and warnings.
9
+ * Canonical plugin name for `@kubb/plugin-faker`. Used for driver lookups and
10
+ * cross-plugin dependency references.
10
11
  */
11
12
  export const pluginFakerName = 'plugin-faker' satisfies PluginFaker['name']
12
13
 
13
14
  /**
14
- * Generates Faker mock data factories from OpenAPI/AST specification.
15
- *
16
- * Creates randomized test data and mock helpers from schema definitions.
15
+ * Generates one mock-data factory per OpenAPI schema using Faker.js. Call
16
+ * `createPet()` to get a realistic `Pet` object. Useful for tests, Storybook,
17
+ * and local development without a running backend.
17
18
  *
18
19
  * @example
19
- * `import pluginFaker from '@kubb/plugin-faker'; export default defineConfig({ plugins: [pluginFaker({ output: { path: 'mocks' } })], })`
20
+ * ```ts
21
+ * import { defineConfig } from 'kubb'
22
+ * import { pluginTs } from '@kubb/plugin-ts'
23
+ * import { pluginFaker } from '@kubb/plugin-faker'
24
+ *
25
+ * export default defineConfig({
26
+ * input: { path: './petStore.yaml' },
27
+ * output: { path: './src/gen' },
28
+ * plugins: [
29
+ * pluginTs(),
30
+ * pluginFaker({
31
+ * output: { path: './mocks' },
32
+ * seed: [100],
33
+ * }),
34
+ * ],
35
+ * })
36
+ * ```
20
37
  */
21
38
  export const pluginFaker = definePlugin<PluginFaker>((options) => {
22
39
  const {
@@ -50,7 +67,7 @@ export const pluginFaker = definePlugin<PluginFaker>((options) => {
50
67
  return `${camelCase(ctx.group)}Controller`
51
68
  },
52
69
  } satisfies Group)
53
- : undefined
70
+ : null
54
71
 
55
72
  return {
56
73
  name: pluginFakerName,
@@ -3,12 +3,30 @@ import { ast } from '@kubb/core'
3
3
  import type { PluginFaker, ResolverFaker } from '../types.ts'
4
4
 
5
5
  /**
6
- * Partial printer nodes for Faker generation, mapping schema types to output strings.
6
+ * Partial map of node-type overrides for the Faker printer. Each key is a
7
+ * `SchemaType` (`'string'`, `'date'`, ...) and each handler returns the
8
+ * Faker expression for that schema as a string. Use `this.transform` to
9
+ * recurse into nested schema nodes and `this.options` to read printer options.
10
+ *
11
+ * @example Override the integer handler
12
+ * ```ts
13
+ * pluginFaker({
14
+ * printer: {
15
+ * nodes: {
16
+ * integer() {
17
+ * return 'faker.number.float()'
18
+ * },
19
+ * },
20
+ * },
21
+ * })
22
+ * ```
7
23
  */
8
24
  export type PrinterFakerNodes = ast.PrinterPartial<string, PrinterFakerOptions>
9
25
 
10
26
  /**
11
- * Configuration options for the Faker printer, including resolvers, mappers, and cyclic schema tracking.
27
+ * Options passed to the Faker printer at instantiation: the parser library
28
+ * for date strings, the regex generator, the user-supplied schema-name
29
+ * mapper, and the resolver used to compute identifiers.
12
30
  */
13
31
  export type PrinterFakerOptions = {
14
32
  dateParser?: PluginFaker['resolvedOptions']['dateParser']
@@ -85,7 +103,7 @@ const fakerKeywordMapper = {
85
103
  },
86
104
  boolean: () => 'faker.datatype.boolean()',
87
105
  null: () => 'null',
88
- array: (items: string[] = [], min?: number, max?: number) => {
106
+ array: (items: Array<string> = [], min?: number, max?: number) => {
89
107
  if (items.length > 1) {
90
108
  return `faker.helpers.arrayElements([${items.join(', ')}])`
91
109
  }
@@ -106,9 +124,9 @@ const fakerKeywordMapper = {
106
124
 
107
125
  return `faker.helpers.multiple(() => (${item}))`
108
126
  },
109
- tuple: (items: string[] = []) => `[${items.join(', ')}]`,
127
+ tuple: (items: Array<string> = []) => `[${items.join(', ')}]`,
110
128
  enum: (items: Array<string | number | boolean | undefined> = [], type = 'any') => `faker.helpers.arrayElement<${type}>([${items.join(', ')}])`,
111
- union: (items: string[] = []) => `faker.helpers.arrayElement<any>([${items.join(', ')}])`,
129
+ union: (items: Array<string> = []) => `faker.helpers.arrayElement<any>([${items.join(', ')}])`,
112
130
  datetime: () => 'faker.date.anytime().toISOString()',
113
131
  date: (representation: 'date' | 'string' = 'string', parser: PluginFaker['resolvedOptions']['dateParser'] = 'faker') => {
114
132
  if (representation === 'string') {
@@ -142,7 +160,7 @@ const fakerKeywordMapper = {
142
160
  },
143
161
  uuid: () => 'faker.string.uuid()',
144
162
  url: () => 'faker.internet.url()',
145
- and: (items: string[] = []) => {
163
+ and: (items: Array<string> = []) => {
146
164
  if (items.length === 0) {
147
165
  return '{}'
148
166
  }
@@ -258,7 +276,7 @@ export const printerFaker: (options: PrinterFakerOptions) => ast.Printer<Printer
258
276
  return fakerKeywordMapper.enum(getEnumValues(node).map(parseEnumValue), this.options.typeName)
259
277
  },
260
278
  union(node): string {
261
- const items: string[] = (node.members ?? [])
279
+ const items: Array<string> = (node.members ?? [])
262
280
  .map((member) =>
263
281
  printNested(member, {
264
282
  nestedInObject: true,
@@ -269,7 +287,7 @@ export const printerFaker: (options: PrinterFakerOptions) => ast.Printer<Printer
269
287
  return fakerKeywordMapper.union(items)
270
288
  },
271
289
  intersection(node): string {
272
- const items: string[] = (node.members ?? [])
290
+ const items: Array<string> = (node.members ?? [])
273
291
  .map((member) =>
274
292
  printNested(member, {
275
293
  nestedInObject: true,
@@ -280,7 +298,7 @@ export const printerFaker: (options: PrinterFakerOptions) => ast.Printer<Printer
280
298
  return fakerKeywordMapper.and(items)
281
299
  },
282
300
  array(node): string {
283
- const items: string[] = (node.items ?? [])
301
+ const items: Array<string> = (node.items ?? [])
284
302
  .map((member) =>
285
303
  printNested(member, {
286
304
  typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[number]` : undefined,
@@ -292,7 +310,7 @@ export const printerFaker: (options: PrinterFakerOptions) => ast.Printer<Printer
292
310
  return fakerKeywordMapper.array(items, node.min, node.max)
293
311
  },
294
312
  tuple(node): string {
295
- const items: string[] = (node.items ?? [])
313
+ const items: Array<string> = (node.items ?? [])
296
314
  .map((member, index) =>
297
315
  printNested(member, {
298
316
  typeName: this.options.typeName ? `NonNullable<${this.options.typeName}>[${index}]` : undefined,
@@ -1,16 +1,20 @@
1
1
  import { createHash } from 'node:crypto'
2
2
  import path from 'node:path'
3
- import { camelCase, isValidVarName } from '@internals/utils'
3
+ import { camelCase, ensureValidVarName } from '@internals/utils'
4
4
  import { defineResolver, KubbDriver } from '@kubb/core'
5
5
  import type { PluginFaker } from '../types.ts'
6
6
 
7
7
  /**
8
- * Naming convention resolver for Faker plugin.
8
+ * Default resolver used by `@kubb/plugin-faker`. Decides the names and file
9
+ * paths for every generated mock factory. Functions and files are prefixed
10
+ * with `create` so `Pet` becomes `createPet`.
9
11
  *
10
- * Provides default naming helpers using camelCase with a `create` prefix for factory functions and files.
12
+ * @example Resolve a factory name
13
+ * ```ts
14
+ * import { resolverFaker } from '@kubb/plugin-faker'
11
15
  *
12
- * @example
13
- * `resolverFaker.default('list pets', 'function') // → 'createListPets'`
16
+ * resolverFaker.default('list pets', 'function') // 'createListPets'
17
+ * ```
14
18
  */
15
19
  export const resolverFaker = defineResolver<PluginFaker>(() => {
16
20
  return {
@@ -18,12 +22,7 @@ export const resolverFaker = defineResolver<PluginFaker>(() => {
18
22
  pluginName: 'plugin-faker',
19
23
  default(name, type) {
20
24
  const resolvedName = camelCase(name, { isFile: type === 'file', prefix: 'create' })
21
-
22
- if (type === 'file' || isValidVarName(resolvedName)) {
23
- return resolvedName
24
- }
25
-
26
- return `_${resolvedName}`
25
+ return type === 'file' ? resolvedName : ensureValidVarName(resolvedName)
27
26
  },
28
27
  resolveName(name, type) {
29
28
  return this.default(name, type)
package/src/types.ts CHANGED
@@ -73,80 +73,86 @@ export type ResolverFaker = Resolver &
73
73
 
74
74
  export type Options = {
75
75
  /**
76
- * Specify the export location for the files and define the behavior of the output.
77
- * @default { path: 'mocks', barrelType: 'named' }
76
+ * Where the generated mock factories are written and how they are exported.
77
+ *
78
+ * @default { path: 'mocks', barrel: { type: 'named' } }
78
79
  */
79
80
  output?: Output
80
81
  /**
81
- * Group the Faker mocks based on the provided name.
82
+ * Split generated files into subfolders based on the operation's tag.
82
83
  */
83
84
  group?: Group
84
85
  /**
85
- * Tags, operations, or paths to exclude from generation.
86
+ * Skip operations matching at least one entry in the list.
86
87
  */
87
88
  exclude?: Array<Exclude>
88
89
  /**
89
- * Tags, operations, or paths to include in generation.
90
+ * Restrict generation to operations matching at least one entry in the list.
90
91
  */
91
92
  include?: Array<Include>
92
93
  /**
93
- * Override options for specific tags, operations, or paths.
94
+ * Apply a different options object to operations matching a pattern.
94
95
  */
95
96
  override?: Array<Override<ResolvedOptions>>
96
97
  /**
97
- * Parser to use when formatting date/time values as strings.
98
+ * Library used to format string-represented date, time, and datetime fields.
99
+ * Any library exporting a default function works; Kubb adds the import for you.
98
100
  *
99
101
  * @default 'faker'
100
102
  */
101
103
  dateParser?: 'faker' | 'dayjs' | 'moment' | (string & {})
102
104
  /**
103
- * Generator to use for RegExp patterns.
105
+ * Library used to generate strings that satisfy a regex `pattern` keyword.
106
+ * - `'faker'` uses `faker.helpers.fromRegExp`. No extra dependency.
107
+ * - `'randexp'` uses the `randexp` package. Supports a wider regex grammar.
104
108
  *
105
109
  * @default 'faker'
106
110
  */
107
111
  regexGenerator?: 'faker' | 'randexp'
108
112
  /**
109
- * Provide per-property faker expressions keyed by property name.
113
+ * Map a schema name to a custom Faker expression. Use this when the schema name
114
+ * does not give Faker enough context (`'email'`, `'avatarUrl'`, `'phoneNumber'`).
110
115
  */
111
116
  mapper?: Record<string, string>
112
117
  /**
113
- * Locale for generating mock data.
114
- * Imports the matching localized `@faker-js/faker` instance so names, addresses,
115
- * and phone numbers reflect the target region.
118
+ * Faker locale code. Switches the named import to `fakerXX` from `@faker-js/faker`
119
+ * so names, addresses, and phone numbers reflect the target region.
116
120
  *
117
121
  * @default 'en'
118
- *
119
122
  * @example German
120
123
  * `locale: 'de'`
121
- *
122
124
  * @example Austrian German
123
125
  * `locale: 'de_AT'`
124
- *
125
126
  * @see https://fakerjs.dev/api/localization.html
126
127
  */
127
128
  locale?: string
128
129
  /**
129
- * Seed faker for deterministic output.
130
+ * Value passed to `faker.seed(...)`. Set this for deterministic mock output,
131
+ * which is useful for snapshot tests.
130
132
  */
131
- seed?: number | number[]
133
+ seed?: number | Array<number>
132
134
  /**
133
- * Apply casing to parameter names to match your configuration.
135
+ * Rename properties inside path/query/header mocks. Body mocks are unaffected.
136
+ *
137
+ * @note Must match the value of `paramsCasing` on `@kubb/plugin-ts`.
134
138
  */
135
139
  paramsCasing?: 'camelcase'
136
140
  /**
137
- * Additional generators alongside the default generators.
141
+ * Custom generators that run alongside the built-in Faker generators.
138
142
  */
139
143
  generators?: Array<Generator<PluginFaker>>
140
144
  /**
141
- * Override naming conventions for function names and types.
145
+ * Override the naming of generated factory helpers. Common use: append `Mock` or
146
+ * `Factory` so helpers do not clash with imported types.
142
147
  */
143
148
  resolver?: Partial<ResolverFaker> & ThisType<ResolverFaker>
144
149
  /**
145
- * AST visitor to transform generated nodes.
150
+ * AST visitor applied to schema and operation nodes before printing.
146
151
  */
147
152
  transformer?: ast.Visitor
148
153
  /**
149
- * Override individual faker printer node handlers.
154
+ * Replace the Faker handler for a specific schema type (`'integer'`, `'date'`, ...).
155
+ * Each handler returns the Faker expression as a string.
150
156
  */
151
157
  printer?: {
152
158
  nodes?: PrinterFakerNodes
@@ -155,7 +161,7 @@ export type Options = {
155
161
 
156
162
  type ResolvedOptions = {
157
163
  output: Output
158
- group: Group | undefined
164
+ group: Group | null
159
165
  exclude: NonNullable<Options['exclude']>
160
166
  include: Options['include']
161
167
  override: NonNullable<Options['override']>
package/src/utils.ts CHANGED
@@ -225,7 +225,7 @@ export function resolveFakerTypeUsage(
225
225
  canOverride: boolean,
226
226
  ): {
227
227
  dataType: string
228
- returnType: string | undefined
228
+ returnType: string | null
229
229
  usesTypeName: boolean
230
230
  } {
231
231
  const isArray = ARRAY_TYPES.has(node.type)
@@ -242,7 +242,7 @@ export function resolveFakerTypeUsage(
242
242
  dataType = getScalarType(node, typeName)
243
243
  }
244
244
 
245
- let returnType = canOverride ? typeName : undefined
245
+ let returnType = canOverride ? typeName : null
246
246
 
247
247
  if (isScalar) {
248
248
  returnType = getScalarType(node, typeName)
@@ -1 +0,0 @@
1
- {"version":3,"file":"Faker-AHTTvWZS.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.schema)\n\n if (!responses.length) {\n return null\n }\n\n if (responses.length === 1) {\n if (shouldInlineSingleResponseSchema(responses[0]!.schema)) {\n return responses[0]!.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 | undefined\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 : undefined\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 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}\n >\n {seed ? (\n <>\n {`faker.seed(${JSON.stringify(seed)})`}\n <br />\n </>\n ) : undefined}\n {`return ${fakerTextWithOverride}`}\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}(data?: Partial<${typeName}>): Required<${typeName}>`\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 Required<${typeName}>\n}`\n : `{\n ${seedCode}const defaultFakeData = ${fakerText}\n return {\n ...defaultFakeData,\n ...(data || {}),\n } as Required<${typeName}>\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 +0,0 @@
1
- {"version":3,"file":"Faker-BoPNqNfi.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.schema)\n\n if (!responses.length) {\n return null\n }\n\n if (responses.length === 1) {\n if (shouldInlineSingleResponseSchema(responses[0]!.schema)) {\n return responses[0]!.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 | undefined\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 : undefined\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 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}\n >\n {seed ? (\n <>\n {`faker.seed(${JSON.stringify(seed)})`}\n <br />\n </>\n ) : undefined}\n {`return ${fakerTextWithOverride}`}\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}(data?: Partial<${typeName}>): Required<${typeName}>`\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 Required<${typeName}>\n}`\n : `{\n ${seedCode}const defaultFakeData = ${fakerText}\n return {\n ...defaultFakeData,\n ...(data || {}),\n } as Required<${typeName}>\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,9 +0,0 @@
1
- import { t as __name } from "./chunk--u3MIqq1.js";
2
- import { o as PluginFaker } from "./printerFaker-W0pLunAj.js";
3
- import * as _$_kubb_core0 from "@kubb/core";
4
-
5
- //#region src/generators/fakerGenerator.d.ts
6
- declare const fakerGenerator: _$_kubb_core0.Generator<PluginFaker, unknown>;
7
- //#endregion
8
- export { fakerGenerator as t };
9
- //# sourceMappingURL=fakerGenerator-B-QnVz9o.d.ts.map