@kubb/plugin-faker
Version:
Generator plugin-faker
367 lines (365 loc) • 12.7 kB
JavaScript
import { FunctionParams, File, Function } from '@kubb/react';
import transformers from '@kubb/core/transformers';
import { isKeyword, schemaKeywords, SchemaGenerator } from '@kubb/plugin-oas';
import { jsx, jsxs } from '@kubb/react/jsx-runtime';
// src/components/Faker.tsx
var fakerKeywordMapper = {
any: () => "undefined",
unknown: () => "unknown",
void: () => "void",
number: (min, max) => {
if (max !== void 0 && min !== void 0) {
return `faker.number.float({ min: ${min}, max: ${max} })`;
}
if (max !== void 0) {
return `faker.number.float({ max: ${max} })`;
}
if (min !== void 0) {
return `faker.number.float({ min: ${min} })`;
}
return "faker.number.float()";
},
integer: (min, max) => {
if (max !== void 0 && min !== void 0) {
return `faker.number.int({ min: ${min}, max: ${max} })`;
}
if (max !== void 0) {
return `faker.number.int({ max: ${max} })`;
}
if (min !== void 0) {
return `faker.number.int({ min: ${min} })`;
}
return "faker.number.int()";
},
string: (min, max) => {
if (max !== void 0 && min !== void 0) {
return `faker.string.alpha({ length: { min: ${min}, max: ${max} } })`;
}
if (max !== void 0) {
return `faker.string.alpha({ length: ${max} })`;
}
if (min !== void 0) {
return `faker.string.alpha({ length: ${min} })`;
}
return "faker.string.alpha()";
},
boolean: () => "faker.datatype.boolean()",
undefined: () => "undefined",
null: () => "null",
array: (items = [], min, max) => {
if (items.length > 1) {
return `faker.helpers.arrayElements([${items.join(", ")}])`;
}
const item = items.at(0);
if (min !== void 0 && max !== void 0) {
return `faker.helpers.multiple(() => (${item}), { count: { min: ${min}, max: ${max} }})`;
}
if (min !== void 0) {
return `faker.helpers.multiple(() => (${item}), { count: ${min} })`;
}
if (max !== void 0) {
return `faker.helpers.multiple(() => (${item}), { count: { min: 0, max: ${max} }})`;
}
return `faker.helpers.multiple(() => (${item}))`;
},
tuple: (items = []) => `[${items.join(", ")}]`,
enum: (items = [], type = "any") => `faker.helpers.arrayElement<${type}>([${items.join(", ")}])`,
union: (items = []) => `faker.helpers.arrayElement<any>([${items.join(", ")}])`,
/**
* ISO 8601
*/
datetime: () => "faker.date.anytime().toISOString()",
/**
* Type `'date'` Date
* Type `'string'` ISO date format (YYYY-MM-DD)
* @default ISO date format (YYYY-MM-DD)
*/
date: (type = "string", parser = "faker") => {
if (type === "string") {
if (parser !== "faker") {
return `${parser}(faker.date.anytime()).format("YYYY-MM-DD")`;
}
return "faker.date.anytime().toISOString().substring(0, 10)";
}
if (parser !== "faker") {
throw new Error(`type '${type}' and parser '${parser}' can not work together`);
}
return "faker.date.anytime()";
},
/**
* Type `'date'` Date
* Type `'string'` ISO time format (HH:mm:ss[.SSSSSS])
* @default ISO time format (HH:mm:ss[.SSSSSS])
*/
time: (type = "string", parser = "faker") => {
if (type === "string") {
if (parser !== "faker") {
return `${parser}(faker.date.anytime()).format("HH:mm:ss")`;
}
return "faker.date.anytime().toISOString().substring(11, 19)";
}
if (parser !== "faker") {
throw new Error(`type '${type}' and parser '${parser}' can not work together`);
}
return "faker.date.anytime()";
},
uuid: () => "faker.string.uuid()",
url: () => "faker.internet.url()",
and: (items = []) => `Object.assign({}, ${items.join(", ")})`,
object: () => "object",
ref: () => "ref",
matches: (value = "", regexGenerator = "faker") => {
if (regexGenerator === "randexp") {
return `${transformers.toRegExpString(value, "RandExp")}.gen()`;
}
return `faker.helpers.fromRegExp(${transformers.toRegExpString(value)})`;
},
email: () => "faker.internet.email()",
firstName: () => "faker.person.firstName()",
lastName: () => "faker.person.lastName()",
password: () => "faker.internet.password()",
phone: () => "faker.phone.number()",
blob: () => "faker.image.url() as unknown as Blob",
default: void 0,
describe: void 0,
const: (value) => value ?? "",
max: void 0,
min: void 0,
nullable: void 0,
nullish: void 0,
optional: void 0,
readOnly: void 0,
writeOnly: void 0,
deprecated: void 0,
example: void 0,
schema: void 0,
catchall: void 0,
name: void 0,
interface: void 0
};
function schemaKeywordSorter(_a, b) {
if (b.keyword === "null") {
return -1;
}
return 0;
}
function joinItems(items) {
switch (items.length) {
case 0:
return "undefined";
case 1:
return items[0];
default:
return fakerKeywordMapper.union(items);
}
}
function parse({ current, parent, name, siblings }, options) {
const value = fakerKeywordMapper[current.keyword];
if (!value) {
return void 0;
}
if (isKeyword(current, schemaKeywords.union)) {
return fakerKeywordMapper.union(
current.args.map((schema) => parse({ parent: current, current: schema, siblings }, { ...options, canOverride: false })).filter(Boolean)
);
}
if (isKeyword(current, schemaKeywords.and)) {
return fakerKeywordMapper.and(
current.args.map((schema) => parse({ parent: current, current: schema, siblings }, { ...options, canOverride: false })).filter(Boolean)
);
}
if (isKeyword(current, schemaKeywords.array)) {
return fakerKeywordMapper.array(
current.args.items.map(
(schema) => parse(
{ parent: current, current: schema, siblings },
{
...options,
typeName: `${options.typeName}["${name}"][number]`,
canOverride: false
}
)
).filter(Boolean),
current.args.min,
current.args.max
);
}
if (isKeyword(current, schemaKeywords.enum)) {
const isParentTuple = parent ? isKeyword(parent, schemaKeywords.tuple) : false;
if (isParentTuple) {
return fakerKeywordMapper.enum(
current.args.items.map((schema) => {
if (schema.format === "number") {
return schema.value;
}
if (schema.format === "boolean") {
return schema.value;
}
return transformers.stringify(schema.value);
})
);
}
return fakerKeywordMapper.enum(
current.args.items.map((schema) => {
if (schema.format === "number") {
return schema.value;
}
if (schema.format === "boolean") {
return schema.value;
}
return transformers.stringify(schema.value);
}),
// TODO replace this with getEnumNameFromSchema
name ? `NonNullable<${options.typeName}>['${name}']` : void 0
);
}
if (isKeyword(current, schemaKeywords.ref)) {
if (!current.args?.name) {
throw new Error(`Name not defined for keyword ${current.keyword}`);
}
if (options.canOverride) {
return `${current.args.name}(data)`;
}
return `${current.args.name}()`;
}
if (isKeyword(current, schemaKeywords.object)) {
const argsObject = Object.entries(current.args?.properties || {}).filter((item) => {
const schema = item[1];
return schema && typeof schema.map === "function";
}).map(([name2, schemas]) => {
const nameSchema = schemas.find((schema) => schema.keyword === schemaKeywords.name);
const mappedName = nameSchema?.args || name2;
if (options.mapper?.[mappedName]) {
return `"${name2}": ${options.mapper?.[mappedName]}`;
}
return `"${name2}": ${joinItems(
schemas.sort(schemaKeywordSorter).map((schema) => parse({ name: name2, parent: current, current: schema, siblings: schemas }, { ...options, canOverride: false })).filter(Boolean)
)}`;
}).join(",");
return `{${argsObject}}`;
}
if (isKeyword(current, schemaKeywords.tuple)) {
if (Array.isArray(current.args.items)) {
return fakerKeywordMapper.tuple(
current.args.items.map((schema) => parse({ parent: current, current: schema, siblings }, { ...options, canOverride: false })).filter(Boolean)
);
}
return parse({ parent: current, current: current.args.items, siblings }, { ...options, canOverride: false });
}
if (isKeyword(current, schemaKeywords.const)) {
if (current.args.format === "number" && current.args.name !== void 0) {
return fakerKeywordMapper.const(current.args.name?.toString());
}
return fakerKeywordMapper.const(transformers.stringify(current.args.value));
}
if (isKeyword(current, schemaKeywords.matches) && current.args) {
return fakerKeywordMapper.matches(current.args, options.regexGenerator);
}
if (isKeyword(current, schemaKeywords.null) || isKeyword(current, schemaKeywords.undefined) || isKeyword(current, schemaKeywords.any)) {
return value() || "";
}
if (isKeyword(current, schemaKeywords.string)) {
if (siblings) {
const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min);
const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max);
return fakerKeywordMapper.string(minSchema?.args, maxSchema?.args);
}
return fakerKeywordMapper.string();
}
if (isKeyword(current, schemaKeywords.number)) {
if (siblings) {
const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min);
const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max);
return fakerKeywordMapper.number(minSchema?.args, maxSchema?.args);
}
return fakerKeywordMapper.number();
}
if (isKeyword(current, schemaKeywords.integer)) {
if (siblings) {
const minSchema = SchemaGenerator.find(siblings, schemaKeywords.min);
const maxSchema = SchemaGenerator.find(siblings, schemaKeywords.max);
return fakerKeywordMapper.integer(minSchema?.args, maxSchema?.args);
}
return fakerKeywordMapper.integer();
}
if (isKeyword(current, schemaKeywords.datetime)) {
return fakerKeywordMapper.datetime();
}
if (isKeyword(current, schemaKeywords.date)) {
return fakerKeywordMapper.date(current.args.type, options.dateParser);
}
if (isKeyword(current, schemaKeywords.time)) {
return fakerKeywordMapper.time(current.args.type, options.dateParser);
}
if (current.keyword in fakerKeywordMapper && "args" in current) {
const value2 = fakerKeywordMapper[current.keyword];
const options2 = JSON.stringify(current.args);
return value2(options2);
}
if (current.keyword in fakerKeywordMapper) {
return value();
}
return void 0;
}
function Faker({ tree, description, name, typeName, seed, regexGenerator, canOverride, mapper, dateParser }) {
const fakerText = joinItems(
tree.map(
(schema, _index, siblings) => parse(
{ parent: void 0, current: schema, siblings },
{
name,
typeName,
seed,
regexGenerator,
mapper,
canOverride,
dateParser
}
)
).filter(Boolean)
);
const isArray = fakerText.startsWith("faker.helpers.arrayElements") || fakerText.startsWith("faker.helpers.multiple");
const isObject = fakerText.startsWith("{");
const isTuple = fakerText.startsWith("faker.helpers.arrayElement");
let fakerTextWithOverride = fakerText;
if (canOverride && isObject) {
fakerTextWithOverride = `{
...${fakerText},
...data || {}
}`;
}
if (canOverride && isTuple) {
fakerTextWithOverride = `data || ${fakerText}`;
}
if (canOverride && isArray) {
fakerTextWithOverride = `[
...${fakerText},
...data || []
]`;
}
const params = FunctionParams.factory({
data: {
// making a partial out of an array does not make sense
type: isArray ? typeName : `Partial<${typeName}>`,
optional: true
}
});
return /* @__PURE__ */ jsx(File.Source, { name, isExportable: true, isIndexable: true, children: /* @__PURE__ */ jsxs(
Function,
{
export: true,
name,
JSDoc: { comments: [description ? `@description ${transformers.jsStringEscape(description)}` : void 0].filter(Boolean) },
params: canOverride ? params.toConstructor() : void 0,
returnType: canOverride ? typeName : void 0,
children: [
seed ? `faker.seed(${JSON.stringify(seed)})` : void 0,
/* @__PURE__ */ jsx("br", {}),
`return ${fakerTextWithOverride}`
]
}
) });
}
export { Faker };
//# sourceMappingURL=chunk-R6YJBMLT.js.map
//# sourceMappingURL=chunk-R6YJBMLT.js.map