@kubb/plugin-faker 5.0.0-alpha.9 → 5.0.0-beta.3

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 (43) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +1 -4
  3. package/dist/Faker-BgleOzVN.cjs +486 -0
  4. package/dist/Faker-BgleOzVN.cjs.map +1 -0
  5. package/dist/Faker-CdyPfOPg.d.ts +27 -0
  6. package/dist/Faker-fcQEB9i5.js +384 -0
  7. package/dist/Faker-fcQEB9i5.js.map +1 -0
  8. package/dist/components.cjs +2 -2
  9. package/dist/components.d.ts +2 -31
  10. package/dist/components.js +1 -1
  11. package/dist/fakerGenerator-C3Ho3BaI.d.ts +9 -0
  12. package/dist/fakerGenerator-D7daHCh6.js +516 -0
  13. package/dist/fakerGenerator-D7daHCh6.js.map +1 -0
  14. package/dist/fakerGenerator-VJEVzLjc.cjs +526 -0
  15. package/dist/fakerGenerator-VJEVzLjc.cjs.map +1 -0
  16. package/dist/generators.cjs +1 -1
  17. package/dist/generators.d.ts +2 -505
  18. package/dist/generators.js +1 -1
  19. package/dist/index.cjs +136 -84
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.ts +28 -4
  22. package/dist/index.js +128 -83
  23. package/dist/index.js.map +1 -1
  24. package/dist/printerFaker-CJiwzoto.d.ts +206 -0
  25. package/package.json +52 -50
  26. package/src/components/Faker.tsx +124 -78
  27. package/src/generators/fakerGenerator.tsx +235 -134
  28. package/src/index.ts +7 -2
  29. package/src/plugin.ts +60 -121
  30. package/src/printers/printerFaker.ts +341 -0
  31. package/src/resolvers/resolverFaker.ts +92 -0
  32. package/src/types.ts +127 -81
  33. package/src/utils.ts +356 -0
  34. package/dist/components-BkBIov4R.js +0 -419
  35. package/dist/components-BkBIov4R.js.map +0 -1
  36. package/dist/components-IdP8GXXX.cjs +0 -461
  37. package/dist/components-IdP8GXXX.cjs.map +0 -1
  38. package/dist/fakerGenerator-CYUCNH3Q.cjs +0 -204
  39. package/dist/fakerGenerator-CYUCNH3Q.cjs.map +0 -1
  40. package/dist/fakerGenerator-M5oCrPmy.js +0 -200
  41. package/dist/fakerGenerator-M5oCrPmy.js.map +0 -1
  42. package/dist/types-r7BubMLO.d.ts +0 -132
  43. package/src/parser.ts +0 -453
@@ -1,461 +0,0 @@
1
- //#region \0rolldown/runtime.js
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __name = (target, value) => __defProp(target, "name", {
5
- value,
6
- configurable: true
7
- });
8
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
- var __getOwnPropNames = Object.getOwnPropertyNames;
10
- var __getProtoOf = Object.getPrototypeOf;
11
- var __hasOwnProp = Object.prototype.hasOwnProperty;
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
14
- key = keys[i];
15
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
- get: ((k) => from[k]).bind(null, key),
17
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
- });
19
- }
20
- return to;
21
- };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
- value: mod,
24
- enumerable: true
25
- }) : target, mod));
26
- //#endregion
27
- let _kubb_plugin_oas = require("@kubb/plugin-oas");
28
- let _kubb_react_fabric = require("@kubb/react-fabric");
29
- let _kubb_react_fabric_jsx_runtime = require("@kubb/react-fabric/jsx-runtime");
30
- //#region ../../internals/utils/src/string.ts
31
- /**
32
- * Strips a single matching pair of `"..."`, `'...'`, or `` `...` `` from both ends of `text`.
33
- * Returns the string unchanged when no balanced quote pair is found.
34
- *
35
- * @example
36
- * trimQuotes('"hello"') // 'hello'
37
- * trimQuotes('hello') // 'hello'
38
- */
39
- function trimQuotes(text) {
40
- if (text.length >= 2) {
41
- const first = text[0];
42
- const last = text[text.length - 1];
43
- if (first === "\"" && last === "\"" || first === "'" && last === "'" || first === "`" && last === "`") return text.slice(1, -1);
44
- }
45
- return text;
46
- }
47
- /**
48
- * Escapes characters that are not allowed inside JS string literals.
49
- * Handles quotes, backslashes, and Unicode line terminators (U+2028 / U+2029).
50
- *
51
- * @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
52
- */
53
- function jsStringEscape(input) {
54
- return `${input}`.replace(/["'\\\n\r\u2028\u2029]/g, (character) => {
55
- switch (character) {
56
- case "\"":
57
- case "'":
58
- case "\\": return `\\${character}`;
59
- case "\n": return "\\n";
60
- case "\r": return "\\r";
61
- case "\u2028": return "\\u2028";
62
- case "\u2029": return "\\u2029";
63
- default: return "";
64
- }
65
- });
66
- }
67
- //#endregion
68
- //#region ../../internals/utils/src/object.ts
69
- /**
70
- * Serializes a primitive value to a JSON string literal, stripping any surrounding quote characters first.
71
- *
72
- * @example
73
- * stringify('hello') // '"hello"'
74
- * stringify('"hello"') // '"hello"'
75
- */
76
- function stringify(value) {
77
- if (value === void 0 || value === null) return "\"\"";
78
- return JSON.stringify(trimQuotes(value.toString()));
79
- }
80
- //#endregion
81
- //#region ../../internals/utils/src/regexp.ts
82
- /**
83
- * Converts a pattern string into a `new RegExp(...)` constructor call or a regex literal string.
84
- * Inline flags expressed as `^(?im)` prefixes are extracted and applied to the resulting expression.
85
- * Pass `null` as the second argument to emit a `/pattern/flags` literal instead.
86
- *
87
- * @example
88
- * toRegExpString('^(?im)foo') // → 'new RegExp("foo", "im")'
89
- * toRegExpString('^(?im)foo', null) // → '/foo/im'
90
- */
91
- function toRegExpString(text, func = "RegExp") {
92
- const raw = trimQuotes(text);
93
- const match = raw.match(/^\^(\(\?([igmsuy]+)\))/i);
94
- const replacementTarget = match?.[1] ?? "";
95
- const matchedFlags = match?.[2];
96
- const cleaned = raw.replace(/^\\?\//, "").replace(/\\?\/$/, "").replace(replacementTarget, "");
97
- const { source, flags } = new RegExp(cleaned, matchedFlags);
98
- if (func === null) return `/${source}/${flags}`;
99
- return `new ${func}(${JSON.stringify(source)}${flags ? `, ${JSON.stringify(flags)}` : ""})`;
100
- }
101
- //#endregion
102
- //#region src/parser.ts
103
- const fakerKeywordMapper = {
104
- any: () => "undefined",
105
- unknown: () => "undefined",
106
- void: () => "undefined",
107
- number: (min, max) => {
108
- if (max !== void 0 && min !== void 0) return `faker.number.float({ min: ${min}, max: ${max} })`;
109
- if (max !== void 0) return `faker.number.float({ max: ${max} })`;
110
- if (min !== void 0) return `faker.number.float({ min: ${min} })`;
111
- return "faker.number.float()";
112
- },
113
- integer: (min, max) => {
114
- if (max !== void 0 && min !== void 0) return `faker.number.int({ min: ${min}, max: ${max} })`;
115
- if (max !== void 0) return `faker.number.int({ max: ${max} })`;
116
- if (min !== void 0) return `faker.number.int({ min: ${min} })`;
117
- return "faker.number.int()";
118
- },
119
- bigint: () => "faker.number.bigInt()",
120
- string: (min, max) => {
121
- if (max !== void 0 && min !== void 0) return `faker.string.alpha({ length: { min: ${min}, max: ${max} } })`;
122
- if (max !== void 0) return `faker.string.alpha({ length: ${max} })`;
123
- if (min !== void 0) return `faker.string.alpha({ length: ${min} })`;
124
- return "faker.string.alpha()";
125
- },
126
- boolean: () => "faker.datatype.boolean()",
127
- undefined: () => "undefined",
128
- null: () => "null",
129
- array: (items = [], min, max) => {
130
- if (items.length > 1) return `faker.helpers.arrayElements([${items.join(", ")}])`;
131
- const item = items.at(0);
132
- if (min !== void 0 && max !== void 0) return `faker.helpers.multiple(() => (${item}), { count: { min: ${min}, max: ${max} }})`;
133
- if (min !== void 0) return `faker.helpers.multiple(() => (${item}), { count: ${min} })`;
134
- if (max !== void 0) return `faker.helpers.multiple(() => (${item}), { count: { min: 0, max: ${max} }})`;
135
- return `faker.helpers.multiple(() => (${item}))`;
136
- },
137
- tuple: (items = []) => `[${items.join(", ")}]`,
138
- enum: (items = [], type = "any") => `faker.helpers.arrayElement<${type}>([${items.join(", ")}])`,
139
- union: (items = []) => `faker.helpers.arrayElement<any>([${items.join(", ")}])`,
140
- datetime: () => "faker.date.anytime().toISOString()",
141
- date: (type = "string", parser = "faker") => {
142
- if (type === "string") {
143
- if (parser !== "faker") return `${parser}(faker.date.anytime()).format("YYYY-MM-DD")`;
144
- return "faker.date.anytime().toISOString().substring(0, 10)";
145
- }
146
- if (parser !== "faker") throw new Error(`type '${type}' and parser '${parser}' can not work together`);
147
- return "faker.date.anytime()";
148
- },
149
- time: (type = "string", parser = "faker") => {
150
- if (type === "string") {
151
- if (parser !== "faker") return `${parser}(faker.date.anytime()).format("HH:mm:ss")`;
152
- return "faker.date.anytime().toISOString().substring(11, 19)";
153
- }
154
- if (parser !== "faker") throw new Error(`type '${type}' and parser '${parser}' can not work together`);
155
- return "faker.date.anytime()";
156
- },
157
- uuid: () => "faker.string.uuid()",
158
- url: () => "faker.internet.url()",
159
- and: (items = []) => {
160
- if (items.length === 0) return "{}";
161
- if (items.length === 1) return items[0] ?? "{}";
162
- return `{...${items.join(", ...")}}`;
163
- },
164
- object: () => "object",
165
- ref: () => "ref",
166
- matches: (value = "", regexGenerator = "faker") => {
167
- if (regexGenerator === "randexp") return `${toRegExpString(value, "RandExp")}.gen()`;
168
- return `faker.helpers.fromRegExp("${value}")`;
169
- },
170
- email: () => "faker.internet.email()",
171
- firstName: () => "faker.person.firstName()",
172
- lastName: () => "faker.person.lastName()",
173
- password: () => "faker.internet.password()",
174
- phone: () => "faker.phone.number()",
175
- blob: () => "faker.image.url() as unknown as Blob",
176
- default: void 0,
177
- describe: void 0,
178
- const: (value) => value ?? "",
179
- max: void 0,
180
- min: void 0,
181
- nullable: void 0,
182
- nullish: void 0,
183
- optional: void 0,
184
- readOnly: void 0,
185
- writeOnly: void 0,
186
- deprecated: void 0,
187
- example: void 0,
188
- schema: void 0,
189
- catchall: void 0,
190
- name: void 0,
191
- interface: void 0,
192
- exclusiveMaximum: void 0,
193
- exclusiveMinimum: void 0
194
- };
195
- /**
196
- * @link based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398
197
- */
198
- function schemaKeywordSorter(_a, b) {
199
- if (b.keyword === "null") return -1;
200
- return 0;
201
- }
202
- function joinItems(items) {
203
- switch (items.length) {
204
- case 0: return "undefined";
205
- case 1: return items[0];
206
- default: return fakerKeywordMapper.union(items);
207
- }
208
- }
209
- const parse = (0, _kubb_plugin_oas.createParser)({
210
- mapper: fakerKeywordMapper,
211
- handlers: {
212
- union(tree, options) {
213
- const { current, schema, name, siblings } = tree;
214
- if (Array.isArray(current.args) && !current.args.length) return "";
215
- return fakerKeywordMapper.union(current.args.map((it) => this.parse({
216
- schema,
217
- parent: current,
218
- name,
219
- current: it,
220
- siblings
221
- }, {
222
- ...options,
223
- canOverride: false
224
- })).filter((x) => Boolean(x)));
225
- },
226
- and(tree, options) {
227
- const { current, schema, siblings } = tree;
228
- return fakerKeywordMapper.and(current.args.map((it) => this.parse({
229
- schema,
230
- parent: current,
231
- current: it,
232
- siblings
233
- }, {
234
- ...options,
235
- canOverride: false
236
- })).filter((x) => Boolean(x)));
237
- },
238
- array(tree, options) {
239
- const { current, schema } = tree;
240
- return fakerKeywordMapper.array(current.args.items.map((it) => this.parse({
241
- schema,
242
- parent: current,
243
- current: it,
244
- siblings: current.args.items
245
- }, {
246
- ...options,
247
- typeName: `NonNullable<${options.typeName}>[number]`,
248
- canOverride: false
249
- })).filter((x) => Boolean(x)), current.args.min, current.args.max);
250
- },
251
- enum(tree, options) {
252
- const { current, parent, name } = tree;
253
- if (parent ? (0, _kubb_plugin_oas.isKeyword)(parent, _kubb_plugin_oas.schemaKeywords.tuple) : false) return fakerKeywordMapper.enum(current.args.items.map((schema) => {
254
- if (schema.format === "number") return schema.value;
255
- if (schema.format === "boolean") return schema.value;
256
- return stringify(schema.value);
257
- }));
258
- return fakerKeywordMapper.enum(current.args.items.map((schema) => {
259
- if (schema.format === "number") return schema.value;
260
- if (schema.format === "boolean") return schema.value;
261
- return stringify(schema.value);
262
- }), name ? options.typeName : void 0);
263
- },
264
- ref(tree, options) {
265
- const { current, parent } = tree;
266
- if (!current.args?.name) throw new Error(`Name not defined for keyword ${current.keyword}`);
267
- if (options.rootTypeName && current.args.name === options.rootTypeName) return "undefined as any";
268
- const isNestedInObjectOrAnd = parent && ((0, _kubb_plugin_oas.isKeyword)(parent, _kubb_plugin_oas.schemaKeywords.object) || (0, _kubb_plugin_oas.isKeyword)(parent, _kubb_plugin_oas.schemaKeywords.and));
269
- if (options.canOverride && !isNestedInObjectOrAnd) return `${current.args.name}(data)`;
270
- return `${current.args.name}()`;
271
- },
272
- object(tree, options) {
273
- const { current, schema } = tree;
274
- return `{${Object.entries(current.args?.properties || {}).filter((item) => {
275
- const schema = item[1];
276
- return schema && typeof schema.map === "function";
277
- }).map(([name, schemas]) => {
278
- const mappedName = schemas.find((schema) => schema.keyword === _kubb_plugin_oas.schemaKeywords.name)?.args || name;
279
- if (options.mapper && Object.hasOwn(options.mapper, mappedName)) return `"${name}": ${options.mapper?.[mappedName]}`;
280
- return `"${name}": ${joinItems(schemas.sort(schemaKeywordSorter).map((it) => this.parse({
281
- schema,
282
- name,
283
- parent: current,
284
- current: it,
285
- siblings: schemas
286
- }, {
287
- ...options,
288
- typeName: `NonNullable<${options.typeName}>[${JSON.stringify(name)}]`,
289
- canOverride: false
290
- })).filter((x) => Boolean(x)))}`;
291
- }).join(",")}}`;
292
- },
293
- tuple(tree, options) {
294
- const { current, schema, siblings } = tree;
295
- if (Array.isArray(current.args.items)) return fakerKeywordMapper.tuple(current.args.items.map((it) => this.parse({
296
- schema,
297
- parent: current,
298
- current: it,
299
- siblings
300
- }, {
301
- ...options,
302
- canOverride: false
303
- })).filter((x) => Boolean(x)));
304
- return this.parse({
305
- schema,
306
- parent: current,
307
- current: current.args.items,
308
- siblings
309
- }, {
310
- ...options,
311
- canOverride: false
312
- });
313
- },
314
- const(tree, _options) {
315
- const { current } = tree;
316
- if (current.args.format === "number" && current.args.name !== void 0) return fakerKeywordMapper.const(current.args.name?.toString());
317
- return fakerKeywordMapper.const(stringify(current.args.value));
318
- },
319
- matches(tree, options) {
320
- const { current } = tree;
321
- if (current.args) return fakerKeywordMapper.matches(current.args, options.regexGenerator);
322
- },
323
- null() {
324
- return fakerKeywordMapper.null();
325
- },
326
- undefined() {
327
- return fakerKeywordMapper.undefined();
328
- },
329
- any() {
330
- return fakerKeywordMapper.any();
331
- },
332
- string(tree, _options) {
333
- const { siblings } = tree;
334
- if (siblings) {
335
- const minSchema = (0, _kubb_plugin_oas.findSchemaKeyword)(siblings, "min");
336
- const maxSchema = (0, _kubb_plugin_oas.findSchemaKeyword)(siblings, "max");
337
- return fakerKeywordMapper.string(minSchema?.args, maxSchema?.args);
338
- }
339
- return fakerKeywordMapper.string();
340
- },
341
- number(tree, _options) {
342
- const { siblings } = tree;
343
- if (siblings) {
344
- const minSchema = (0, _kubb_plugin_oas.findSchemaKeyword)(siblings, "min");
345
- const maxSchema = (0, _kubb_plugin_oas.findSchemaKeyword)(siblings, "max");
346
- return fakerKeywordMapper.number(minSchema?.args, maxSchema?.args);
347
- }
348
- return fakerKeywordMapper.number();
349
- },
350
- integer(tree, _options) {
351
- const { siblings } = tree;
352
- if (siblings) {
353
- const minSchema = (0, _kubb_plugin_oas.findSchemaKeyword)(siblings, "min");
354
- const maxSchema = (0, _kubb_plugin_oas.findSchemaKeyword)(siblings, "max");
355
- return fakerKeywordMapper.integer(minSchema?.args, maxSchema?.args);
356
- }
357
- return fakerKeywordMapper.integer();
358
- },
359
- bigint(_tree, _options) {
360
- return fakerKeywordMapper.bigint();
361
- },
362
- datetime() {
363
- return fakerKeywordMapper.datetime();
364
- },
365
- date(tree, options) {
366
- const { current } = tree;
367
- return fakerKeywordMapper.date(current.args.type, options.dateParser);
368
- },
369
- time(tree, options) {
370
- const { current } = tree;
371
- return fakerKeywordMapper.time(current.args.type, options.dateParser);
372
- }
373
- }
374
- });
375
- //#endregion
376
- //#region src/components/Faker.tsx
377
- function Faker({ tree, description, name, typeName, seed, regexGenerator, canOverride, mapper, dateParser }) {
378
- const fakerText = joinItems(tree.map((schema, _index, siblings) => parse({
379
- name,
380
- schema,
381
- parent: void 0,
382
- current: schema,
383
- siblings
384
- }, {
385
- typeName,
386
- rootTypeName: name,
387
- regexGenerator,
388
- mapper,
389
- canOverride,
390
- dateParser
391
- })).filter((x) => Boolean(x)));
392
- const isArray = fakerText.startsWith("faker.helpers.arrayElements") || fakerText.startsWith("faker.helpers.multiple");
393
- const isRefToArray = tree.some((s) => (0, _kubb_plugin_oas.isKeyword)(s, _kubb_plugin_oas.schemaKeywords.schema) && s.args.type === "array");
394
- const isObject = fakerText.startsWith("{");
395
- const isTuple = fakerText.startsWith("faker.helpers.arrayElement");
396
- const isSimpleString = name === "string";
397
- const isSimpleInt = name === "integer";
398
- const isSimpleFloat = name === "float";
399
- let fakerTextWithOverride = fakerText;
400
- if (canOverride && isObject) fakerTextWithOverride = `{
401
- ...${fakerText},
402
- ...data || {}
403
- }`;
404
- if (canOverride && isTuple) fakerTextWithOverride = `data || ${fakerText}`;
405
- if (canOverride && isArray) fakerTextWithOverride = `[
406
- ...${fakerText},
407
- ...data || []
408
- ]`;
409
- if (canOverride && isSimpleString) fakerTextWithOverride = "data ?? faker.string.alpha()";
410
- if (canOverride && isSimpleInt) fakerTextWithOverride = "data ?? faker.number.int()";
411
- if (canOverride && isSimpleFloat) fakerTextWithOverride = "data ?? faker.number.float()";
412
- let type = `Partial<${typeName}>`;
413
- if (isArray) type = typeName;
414
- if (isRefToArray) type = typeName;
415
- if (isSimpleString) type = name;
416
- if (isSimpleInt || isSimpleFloat) type = "number";
417
- const params = _kubb_react_fabric.FunctionParams.factory({ data: {
418
- type,
419
- optional: true
420
- } });
421
- let returnType = canOverride ? typeName : void 0;
422
- if (isSimpleString || isSimpleInt || isSimpleFloat) returnType = type;
423
- return /* @__PURE__ */ (0, _kubb_react_fabric_jsx_runtime.jsx)(_kubb_react_fabric.File.Source, {
424
- name,
425
- isExportable: true,
426
- isIndexable: true,
427
- children: /* @__PURE__ */ (0, _kubb_react_fabric_jsx_runtime.jsxs)(_kubb_react_fabric.Function, {
428
- export: true,
429
- name,
430
- JSDoc: { comments: [description ? `@description ${jsStringEscape(description)}` : void 0].filter(Boolean) },
431
- params: canOverride ? params.toConstructor() : void 0,
432
- returnType,
433
- children: [
434
- seed ? `faker.seed(${JSON.stringify(seed)})` : void 0,
435
- /* @__PURE__ */ (0, _kubb_react_fabric_jsx_runtime.jsx)("br", {}),
436
- `return ${fakerTextWithOverride}`
437
- ]
438
- })
439
- });
440
- }
441
- //#endregion
442
- Object.defineProperty(exports, "Faker", {
443
- enumerable: true,
444
- get: function() {
445
- return Faker;
446
- }
447
- });
448
- Object.defineProperty(exports, "__name", {
449
- enumerable: true,
450
- get: function() {
451
- return __name;
452
- }
453
- });
454
- Object.defineProperty(exports, "__toESM", {
455
- enumerable: true,
456
- get: function() {
457
- return __toESM;
458
- }
459
- });
460
-
461
- //# sourceMappingURL=components-IdP8GXXX.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"components-IdP8GXXX.cjs","names":["schemaKeywords","parserFaker.joinItems","parserFaker.parse","schemaKeywords","FunctionParams","File","Function"],"sources":["../../../internals/utils/src/string.ts","../../../internals/utils/src/object.ts","../../../internals/utils/src/regexp.ts","../src/parser.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 */\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 * Returns a masked version of a string, showing only the first and last few characters.\n * Useful for logging sensitive values (tokens, keys) without exposing the full value.\n *\n * @example\n * maskString('KUBB_STUDIO-abc123-xyz789') // 'KUBB_STUDIO-…789'\n */\nexport function maskString(value: string, start = 8, end = 4): string {\n if (value.length <= start + end) return value\n return `${value.slice(0, start)}…${value.slice(-end)}`\n}\n","import { trimQuotes } from './string.ts'\n\n/**\n * Serializes a primitive value to a JSON string literal, stripping any surrounding quote characters first.\n *\n * @example\n * stringify('hello') // '\"hello\"'\n * stringify('\"hello\"') // '\"hello\"'\n */\nexport function stringify(value: string | number | boolean | undefined): string {\n if (value === undefined || value === null) return '\"\"'\n return JSON.stringify(trimQuotes(value.toString()))\n}\n\n/**\n * Converts a plain object into a multiline key-value string suitable for embedding in generated code.\n * Nested objects are recursively stringified with indentation.\n *\n * @example\n * stringifyObject({ foo: 'bar', nested: { a: 1 } })\n * // 'foo: bar,\\nnested: {\\n a: 1\\n }'\n */\nexport function stringifyObject(value: Record<string, unknown>): string {\n const items = Object.entries(value)\n .map(([key, val]) => {\n if (val !== null && typeof val === 'object') {\n return `${key}: {\\n ${stringifyObject(val as Record<string, unknown>)}\\n }`\n }\n return `${key}: ${val}`\n })\n .filter(Boolean)\n return items.join(',\\n')\n}\n\n/**\n * Serializes plugin options for safe JSON transport.\n * Strips functions, symbols, and `undefined` values recursively.\n */\nexport function serializePluginOptions<TOptions extends object>(options: TOptions): TOptions {\n if (options === null || options === undefined) return {} as TOptions\n if (typeof options !== 'object') return options\n if (Array.isArray(options)) return options.map(serializePluginOptions) as unknown as TOptions\n\n const serialized: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(options)) {\n if (typeof value === 'function' || typeof value === 'symbol' || value === undefined) continue\n serialized[key] = value !== null && typeof value === 'object' ? serializePluginOptions(value as object) : value\n }\n return serialized as TOptions\n}\n\n/**\n * Converts a dot-notation path or string array into an optional-chaining accessor expression.\n *\n * @example\n * getNestedAccessor('pagination.next.id', 'lastPage')\n * // → \"lastPage?.['pagination']?.['next']?.['id']\"\n */\nexport function getNestedAccessor(param: string | string[], accessor: string): string | undefined {\n const parts = Array.isArray(param) ? param : param.split('.')\n if (parts.length === 0 || (parts.length === 1 && parts[0] === '')) return undefined\n return `${accessor}?.['${`${parts.join(\"']?.['\")}']`}`\n}\n","import { trimQuotes } from './string.ts'\n\n/**\n * Converts a pattern string into a `new RegExp(...)` constructor call or a regex literal string.\n * Inline flags expressed as `^(?im)` prefixes are extracted and applied to the resulting expression.\n * Pass `null` as the second argument to emit a `/pattern/flags` literal instead.\n *\n * @example\n * toRegExpString('^(?im)foo') // → 'new RegExp(\"foo\", \"im\")'\n * toRegExpString('^(?im)foo', null) // → '/foo/im'\n */\nexport function toRegExpString(text: string, func: string | null = 'RegExp'): string {\n const raw = trimQuotes(text)\n\n const match = raw.match(/^\\^(\\(\\?([igmsuy]+)\\))/i)\n const replacementTarget = match?.[1] ?? ''\n const matchedFlags = match?.[2]\n const cleaned = raw\n .replace(/^\\\\?\\//, '')\n .replace(/\\\\?\\/$/, '')\n .replace(replacementTarget, '')\n\n const { source, flags } = new RegExp(cleaned, matchedFlags)\n\n if (func === null) return `/${source}/${flags}`\n\n return `new ${func}(${JSON.stringify(source)}${flags ? `, ${JSON.stringify(flags)}` : ''})`\n}\n","import { stringify, toRegExpString } from '@internals/utils'\nimport type { Schema, SchemaKeywordMapper, SchemaMapper } from '@kubb/plugin-oas'\nimport { createParser, findSchemaKeyword, isKeyword, schemaKeywords } from '@kubb/plugin-oas'\nimport type { Options } from './types.ts'\n\nconst fakerKeywordMapper = {\n any: () => 'undefined',\n unknown: () => 'undefined',\n void: () => 'undefined',\n number: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.number.float({ min: ${min}, max: ${max} })`\n }\n\n if (max !== undefined) {\n return `faker.number.float({ max: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.number.float({ min: ${min} })`\n }\n\n return 'faker.number.float()'\n },\n integer: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.number.int({ min: ${min}, max: ${max} })`\n }\n\n if (max !== undefined) {\n return `faker.number.int({ max: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.number.int({ min: ${min} })`\n }\n\n return 'faker.number.int()'\n },\n bigint: () => 'faker.number.bigInt()',\n string: (min?: number, max?: number) => {\n if (max !== undefined && min !== undefined) {\n return `faker.string.alpha({ length: { min: ${min}, max: ${max} } })`\n }\n\n if (max !== undefined) {\n return `faker.string.alpha({ length: ${max} })`\n }\n\n if (min !== undefined) {\n return `faker.string.alpha({ length: ${min} })`\n }\n\n return 'faker.string.alpha()'\n },\n boolean: () => 'faker.datatype.boolean()',\n undefined: () => 'undefined',\n null: () => 'null',\n array: (items: string[] = [], min?: number, max?: number) => {\n if (items.length > 1) {\n return `faker.helpers.arrayElements([${items.join(', ')}])`\n }\n const item = items.at(0)\n\n if (min !== undefined && max !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: { min: ${min}, max: ${max} }})`\n }\n if (min !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: ${min} })`\n }\n if (max !== undefined) {\n return `faker.helpers.multiple(() => (${item}), { count: { min: 0, max: ${max} }})`\n }\n\n return `faker.helpers.multiple(() => (${item}))`\n },\n tuple: (items: string[] = []) => `[${items.join(', ')}]`,\n enum: (items: Array<string | number | boolean | undefined> = [], type = 'any') => `faker.helpers.arrayElement<${type}>([${items.join(', ')}])`,\n union: (items: string[] = []) => `faker.helpers.arrayElement<any>([${items.join(', ')}])`,\n /**\n * ISO 8601\n */\n datetime: () => 'faker.date.anytime().toISOString()',\n /**\n * Type `'date'` Date\n * Type `'string'` ISO date format (YYYY-MM-DD)\n * @default ISO date format (YYYY-MM-DD)\n */\n date: (type: 'date' | 'string' = 'string', parser: Options['dateParser'] = 'faker') => {\n if (type === 'string') {\n if (parser !== 'faker') {\n return `${parser}(faker.date.anytime()).format(\"YYYY-MM-DD\")`\n }\n return 'faker.date.anytime().toISOString().substring(0, 10)'\n }\n\n if (parser !== 'faker') {\n throw new Error(`type '${type}' and parser '${parser}' can not work together`)\n }\n\n return 'faker.date.anytime()'\n },\n /**\n * Type `'date'` Date\n * Type `'string'` ISO time format (HH:mm:ss[.SSSSSS])\n * @default ISO time format (HH:mm:ss[.SSSSSS])\n */\n time: (type: 'date' | 'string' = 'string', parser: Options['dateParser'] = 'faker') => {\n if (type === 'string') {\n if (parser !== 'faker') {\n return `${parser}(faker.date.anytime()).format(\"HH:mm:ss\")`\n }\n return 'faker.date.anytime().toISOString().substring(11, 19)'\n }\n\n if (parser !== 'faker') {\n throw new Error(`type '${type}' and parser '${parser}' can not work together`)\n }\n\n return 'faker.date.anytime()'\n },\n uuid: () => 'faker.string.uuid()',\n url: () => 'faker.internet.url()',\n and: (items: string[] = []) => {\n // Handle empty array case\n if (items.length === 0) {\n return '{}'\n }\n\n // If only one item, return it as-is (no need to spread)\n // This fixes the issue with single refs to primitives like enums\n if (items.length === 1) {\n return items[0] ?? '{}'\n }\n\n // If multiple items, spread them together\n // This handles both object literals and multiple refs to objects\n return `{...${items.join(', ...')}}`\n },\n object: () => 'object',\n ref: () => 'ref',\n matches: (value = '', regexGenerator: 'faker' | 'randexp' = 'faker') => {\n if (regexGenerator === 'randexp') {\n return `${toRegExpString(value, 'RandExp')}.gen()`\n }\n return `faker.helpers.fromRegExp(\"${value}\")`\n },\n email: () => 'faker.internet.email()',\n firstName: () => 'faker.person.firstName()',\n lastName: () => 'faker.person.lastName()',\n password: () => 'faker.internet.password()',\n phone: () => 'faker.phone.number()',\n blob: () => 'faker.image.url() as unknown as Blob',\n default: undefined,\n describe: undefined,\n const: (value?: string | number) => (value as string) ?? '',\n max: undefined,\n min: undefined,\n nullable: undefined,\n nullish: undefined,\n optional: undefined,\n readOnly: undefined,\n writeOnly: undefined,\n deprecated: undefined,\n example: undefined,\n schema: undefined,\n catchall: undefined,\n name: undefined,\n interface: undefined,\n exclusiveMaximum: undefined,\n exclusiveMinimum: undefined,\n} satisfies SchemaMapper<string | null | undefined>\n\n/**\n * @link based on https://github.com/cellular/oazapfts/blob/7ba226ebb15374e8483cc53e7532f1663179a22c/src/codegen/generate.ts#L398\n */\n\nfunction schemaKeywordSorter(_a: Schema, b: Schema) {\n if (b.keyword === 'null') {\n return -1\n }\n\n return 0\n}\n\nexport function joinItems(items: string[]): string {\n switch (items.length) {\n case 0:\n return 'undefined'\n case 1:\n return items[0]!\n default:\n return fakerKeywordMapper.union(items)\n }\n}\n\ntype ParserOptions = {\n typeName?: string\n rootTypeName?: string\n regexGenerator?: 'faker' | 'randexp'\n canOverride?: boolean\n dateParser?: Options['dateParser']\n mapper?: Record<string, string>\n}\n\nexport const parse = createParser<string, ParserOptions>({\n mapper: fakerKeywordMapper,\n handlers: {\n union(tree, options) {\n const { current, schema, name, siblings } = tree\n\n if (Array.isArray(current.args) && !current.args.length) {\n return ''\n }\n\n return fakerKeywordMapper.union(\n current.args\n .map((it) => this.parse({ schema, parent: current, name, current: it, siblings }, { ...options, canOverride: false }))\n .filter((x): x is string => Boolean(x)),\n )\n },\n and(tree, options) {\n const { current, schema, siblings } = tree\n\n return fakerKeywordMapper.and(\n current.args\n .map((it) => this.parse({ schema, parent: current, current: it, siblings }, { ...options, canOverride: false }))\n .filter((x): x is string => Boolean(x)),\n )\n },\n array(tree, options) {\n const { current, schema } = tree\n\n return fakerKeywordMapper.array(\n current.args.items\n .map((it) =>\n this.parse(\n {\n schema,\n parent: current,\n current: it,\n siblings: current.args.items,\n },\n {\n ...options,\n typeName: `NonNullable<${options.typeName}>[number]`,\n canOverride: false,\n },\n ),\n )\n .filter((x): x is string => Boolean(x)),\n current.args.min,\n current.args.max,\n )\n },\n enum(tree, options) {\n const { current, parent, name } = tree\n\n const isParentTuple = parent ? isKeyword(parent, schemaKeywords.tuple) : false\n\n if (isParentTuple) {\n return fakerKeywordMapper.enum(\n current.args.items.map((schema) => {\n if (schema.format === 'number') {\n return schema.value\n }\n\n if (schema.format === 'boolean') {\n return schema.value\n }\n return stringify(schema.value)\n }),\n )\n }\n\n return fakerKeywordMapper.enum(\n current.args.items.map((schema) => {\n if (schema.format === 'number') {\n return schema.value\n }\n if (schema.format === 'boolean') {\n return schema.value\n }\n return stringify(schema.value)\n }),\n // TODO replace this with getEnumNameFromSchema\n name ? options.typeName : undefined,\n )\n },\n ref(tree, options) {\n const { current, parent } = tree\n\n if (!current.args?.name) {\n throw new Error(`Name not defined for keyword ${current.keyword}`)\n }\n\n // Check if this is a self-referencing type (prevents infinite recursion)\n // The rootTypeName is the function name being generated (e.g., \"createNode\")\n // The current.args.name is the ref function name (e.g., \"createNode\")\n const isSelfReferencing = options.rootTypeName && current.args.name === options.rootTypeName\n\n if (isSelfReferencing) {\n // For self-referencing types, return undefined to prevent infinite recursion\n // This will result in empty arrays/objects by default\n return 'undefined as any'\n }\n\n // Check if the parent is an object or and keyword - in these cases, we don't want to pass data\n // because it would incorrectly forward the parent's data to a nested ref\n const isNestedInObjectOrAnd = parent && (isKeyword(parent, schemaKeywords.object) || isKeyword(parent, schemaKeywords.and))\n\n if (options.canOverride && !isNestedInObjectOrAnd) {\n return `${current.args.name}(data)`\n }\n\n return `${current.args.name}()`\n },\n object(tree, options) {\n const { current, schema } = tree\n\n const argsObject = Object.entries(current.args?.properties || {})\n .filter((item) => {\n const schema = item[1]\n return schema && typeof schema.map === 'function'\n })\n .map(([name, schemas]) => {\n const nameSchema = schemas.find((schema) => schema.keyword === schemaKeywords.name) as SchemaKeywordMapper['name']\n const mappedName = nameSchema?.args || name\n\n // custom mapper(pluginOptions)\n // Use Object.hasOwn to avoid matching inherited properties like 'toString', 'valueOf', etc.\n if (options.mapper && Object.hasOwn(options.mapper, mappedName)) {\n return `\"${name}\": ${options.mapper?.[mappedName]}`\n }\n\n return `\"${name}\": ${joinItems(\n schemas\n .sort(schemaKeywordSorter)\n .map((it) =>\n this.parse(\n {\n schema,\n name,\n parent: current,\n current: it,\n siblings: schemas,\n },\n {\n ...options,\n typeName: `NonNullable<${options.typeName}>[${JSON.stringify(name)}]`,\n canOverride: false,\n },\n ),\n )\n .filter((x): x is string => Boolean(x)),\n )}`\n })\n .join(',')\n\n return `{${argsObject}}`\n },\n tuple(tree, options) {\n const { current, schema, siblings } = tree\n\n if (Array.isArray(current.args.items)) {\n return fakerKeywordMapper.tuple(\n current.args.items\n .map((it) => this.parse({ schema, parent: current, current: it, siblings }, { ...options, canOverride: false }))\n .filter((x): x is string => Boolean(x)),\n )\n }\n\n return this.parse({ schema, parent: current, current: current.args.items, siblings }, { ...options, canOverride: false })\n },\n const(tree, _options) {\n const { current } = tree\n\n if (current.args.format === 'number' && current.args.name !== undefined) {\n return fakerKeywordMapper.const(current.args.name?.toString())\n }\n return fakerKeywordMapper.const(stringify(current.args.value))\n },\n matches(tree, options) {\n const { current } = tree\n\n if (current.args) {\n return fakerKeywordMapper.matches(current.args, options.regexGenerator)\n }\n return undefined\n },\n null() {\n return fakerKeywordMapper.null()\n },\n undefined() {\n return fakerKeywordMapper.undefined()\n },\n any() {\n return fakerKeywordMapper.any()\n },\n string(tree, _options) {\n const { siblings } = tree\n\n if (siblings) {\n const minSchema = findSchemaKeyword(siblings, 'min')\n const maxSchema = findSchemaKeyword(siblings, 'max')\n\n return fakerKeywordMapper.string(minSchema?.args, maxSchema?.args)\n }\n\n return fakerKeywordMapper.string()\n },\n number(tree, _options) {\n const { siblings } = tree\n\n if (siblings) {\n const minSchema = findSchemaKeyword(siblings, 'min')\n const maxSchema = findSchemaKeyword(siblings, 'max')\n\n return fakerKeywordMapper.number(minSchema?.args, maxSchema?.args)\n }\n\n return fakerKeywordMapper.number()\n },\n integer(tree, _options) {\n const { siblings } = tree\n\n if (siblings) {\n const minSchema = findSchemaKeyword(siblings, 'min')\n const maxSchema = findSchemaKeyword(siblings, 'max')\n\n return fakerKeywordMapper.integer(minSchema?.args, maxSchema?.args)\n }\n\n return fakerKeywordMapper.integer()\n },\n bigint(_tree, _options) {\n return fakerKeywordMapper.bigint()\n },\n datetime() {\n return fakerKeywordMapper.datetime()\n },\n date(tree, options) {\n const { current } = tree\n\n return fakerKeywordMapper.date(current.args.type, options.dateParser)\n },\n time(tree, options) {\n const { current } = tree\n\n return fakerKeywordMapper.time(current.args.type, options.dateParser)\n },\n },\n})\n","import { jsStringEscape } from '@internals/utils'\nimport type { Schema } from '@kubb/plugin-oas'\nimport { isKeyword, schemaKeywords } from '@kubb/plugin-oas'\nimport { File, Function, FunctionParams } from '@kubb/react-fabric'\nimport type { FabricReactNode } from '@kubb/react-fabric/types'\nimport * as parserFaker from '../parser.ts'\nimport type { PluginFaker } from '../types.ts'\n\ntype Props = {\n name: string\n typeName: string\n tree: Array<Schema>\n seed?: PluginFaker['options']['seed']\n description?: string\n regexGenerator?: PluginFaker['options']['regexGenerator']\n mapper?: PluginFaker['options']['mapper']\n dateParser?: PluginFaker['options']['dateParser']\n canOverride: boolean\n}\n\nexport function Faker({ tree, description, name, typeName, seed, regexGenerator, canOverride, mapper, dateParser }: Props): FabricReactNode {\n const fakerText = parserFaker.joinItems(\n tree\n .map((schema, _index, siblings) =>\n parserFaker.parse(\n { name, schema, parent: undefined, current: schema, siblings },\n {\n typeName,\n rootTypeName: name,\n regexGenerator,\n mapper,\n canOverride,\n dateParser,\n },\n ),\n )\n .filter((x): x is string => Boolean(x)),\n )\n\n const isArray = fakerText.startsWith('faker.helpers.arrayElements') || fakerText.startsWith('faker.helpers.multiple')\n const isRefToArray = tree.some((s) => isKeyword(s, schemaKeywords.schema) && s.args.type === 'array')\n const isObject = fakerText.startsWith('{')\n const isTuple = fakerText.startsWith('faker.helpers.arrayElement')\n\n const isSimpleString = name === 'string'\n const isSimpleInt = name === 'integer'\n const isSimpleFloat = name === 'float'\n\n let fakerTextWithOverride = fakerText\n\n if (canOverride && isObject) {\n fakerTextWithOverride = `{\n ...${fakerText},\n ...data || {}\n}`\n }\n\n if (canOverride && isTuple) fakerTextWithOverride = `data || ${fakerText}`\n\n if (canOverride && isArray) {\n fakerTextWithOverride = `[\n ...${fakerText},\n ...data || []\n ]`\n }\n\n if (canOverride && isSimpleString) fakerTextWithOverride = 'data ?? faker.string.alpha()'\n\n if (canOverride && isSimpleInt) fakerTextWithOverride = 'data ?? faker.number.int()'\n\n if (canOverride && isSimpleFloat) fakerTextWithOverride = 'data ?? faker.number.float()'\n\n let type = `Partial<${typeName}>`\n\n if (isArray) type = typeName\n if (isRefToArray) type = typeName\n if (isSimpleString) type = name\n if (isSimpleInt || isSimpleFloat) type = 'number'\n\n const params = FunctionParams.factory({\n data: {\n // making a partial out of an array does not make sense\n type,\n optional: true,\n },\n })\n\n let returnType = canOverride ? typeName : undefined\n\n if (isSimpleString || isSimpleInt || isSimpleFloat) returnType = type\n\n return (\n <File.Source name={name} isExportable isIndexable>\n <Function\n export\n name={name}\n JSDoc={{ comments: [description ? `@description ${jsStringEscape(description)}` : undefined].filter(Boolean) }}\n params={canOverride ? params.toConstructor() : undefined}\n returnType={returnType}\n >\n {seed ? `faker.seed(${JSON.stringify(seed)})` : undefined}\n <br />\n {`return ${fakerTextWithOverride}`}\n </Function>\n </File.Source>\n )\n}\n"],"mappings":"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"}