prisma-generator-fake-data
Version:
The easiest way to generate mock data based on your Prisma models!
211 lines (210 loc) • 9.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createMethods = void 0;
const internals_1 = require("@prisma/internals");
const faker_1 = require("@faker-js/faker");
const MAX_INT = 2147483647;
function getFieldDefinition(models, model, field, enums, emptyValueAs) {
var _a, _b, _c, _d, _e, _f;
const docLines = ((_a = field.documentation) === null || _a === void 0 ? void 0 : _a.split('\n')) || [];
const fakeLine = docLines.find((line) => line.startsWith('FAKE:'));
const fakeValue = fakeLine === null || fakeLine === void 0 ? void 0 : fakeLine.replace('FAKE:', '');
if (fakeLine && !fakeValue) {
internals_1.logger.warn(`${model.name}.${field.name} appears to have a '///FAKE:' comment but is missing a method or JSON after it.`);
}
if (fakeValue) {
return `${field.name}: ${fakeValue}`;
}
if (field.isId) {
return `${field.name}: ${field.type === 'String'
? 'faker.string.uuid()'
: `faker.number.int({ max: ${MAX_INT} })`}`;
}
if (field.hasDefaultValue) {
if (field.isList && field.kind === 'enum') {
const enumName = field.type;
const enumValues = ((_b = enums.find((it) => it.name === enumName)) === null || _b === void 0 ? void 0 : _b.values) || [];
if (enumValues.length === 0) {
internals_1.logger.warn(`Enum ${enumName} has no enum values. Field ${field.name} won't be generated.`);
}
else {
const defaults = (_c = field.default) === null || _c === void 0 ? void 0 : _c.map((d) => `${enumName}.${d}`).join(', ');
return `${field.name}: [${defaults}]`;
}
}
if (field.isList) {
return `${field.name}: ${((_d = field.default) === null || _d === void 0 ? void 0 : _d.toString()) || '[]'}`;
}
if (['Json'].includes(field.type)) {
return `${field.name}: ${fakeValue || ((_e = field.default) === null || _e === void 0 ? void 0 : _e.toString()) || '{}'}`;
}
if (field.kind === 'enum') {
return `${field.name}: ${field.type}.${field.default}`;
}
if (['Int', 'Float', 'Boolean'].includes(field.type)) {
return `${field.name}: ${field.default}`;
}
if (['Decimal'].includes(field.type)) {
return `${field.name}: new Decimal(${field.default})`;
}
if (['BigInt'].includes(field.type)) {
return `${field.name}: BigInt(${field.default})`;
}
if (['String'].includes(field.type)) {
return `${field.name}: '${field.default}'`;
}
if (field.type === 'DateTime') {
return `${field.name}: new Date()`;
}
}
if (!field.isRequired) {
return `${field.name}: ${emptyValueAs}`;
}
if (field.kind === 'enum') {
const enumName = field.type;
const enumValues = ((_f = enums.find((it) => it.name === enumName)) === null || _f === void 0 ? void 0 : _f.values) || [];
if (enumValues.length === 0) {
internals_1.logger.warn(`Enum ${enumName} has no enum values. Field ${field.name} won't be generated.`);
}
else {
const enumValuesAsString = enumValues
.map((v) => `${enumName}.${v.name}`)
.join(', ');
return `${field.name}: faker.helpers.arrayElement([${enumValuesAsString}] as const)`;
}
}
if (model.fields.some((it) => { var _a; return (_a = it.relationFromFields) === null || _a === void 0 ? void 0 : _a.includes(field.name); })) {
return `${field.name}: ${field.type === 'String' ? 'faker.string.uuid()' : 'faker.number.int()'}`;
}
if (field.type === 'String') {
if (field.isList) {
return `${field.name}: faker.lorem.words(5).split(' ')`;
}
if (field.name === 'email') {
return `${field.name}: faker.internet.email()`;
}
if (field.name === 'image' || field.name === 'avatar') {
return `${field.name}: faker.image.avatar()`;
}
if (field.name === 'username') {
return `${field.name}: faker.internet.userName()`;
}
if (field.name === 'name') {
return `${field.name}: faker.person.fullName()`;
}
if (field.name === 'firstName') {
return `${field.name}: faker.person.firstName()`;
}
if (field.name === 'lastName') {
return `${field.name}: faker.person.lastName()`;
}
return `${field.name}: faker.lorem.words(5)`;
}
if (field.type === 'Int') {
if (field.isList) {
return `${field.name}: [faker.number.int({ max: ${MAX_INT} }),faker.number.int({ max: ${MAX_INT} }),faker.number.int({ max: ${MAX_INT} }),faker.number.int({ max: ${MAX_INT} }),faker.number.int({ max: ${MAX_INT} })]`;
}
if (field.name === 'age') {
return `${field.name}: faker.number.int({min: 0, max: 99})`;
}
return `${field.name}: faker.number.int()`;
}
if (field.type === 'BigInt') {
if (field.isList) {
return `${field.name}: [BigInt(faker.number.int()),BigInt(faker.number.int()),BigInt(faker.number.int()),BigInt(faker.number.int()),BigInt(faker.number.int())]`;
}
return `${field.name}: BigInt(faker.number.int())`;
}
if (field.type === 'Float') {
if (field.isList) {
return `${field.name}: [faker.number.float(),faker.number.float(),faker.number.float(),faker.number.float(),faker.number.float()]`;
}
return `${field.name}: faker.number.float()`;
}
if (field.type === 'Boolean') {
if (field.isList) {
return `${field.name}: [faker.datatype.boolean(),faker.datatype.boolean(),faker.datatype.boolean(),faker.datatype.boolean(),faker.datatype.boolean()]`;
}
return `${field.name}: faker.datatype.boolean()`;
}
if (field.type === 'Decimal') {
if (field.isList) {
return `${field.name}: [new Decimal(faker.number.float()),new Decimal(faker.number.float()),new Decimal(faker.number.float()),new Decimal(faker.number.float()),new Decimal(faker.number.float())]`;
}
return `${field.name}: new Decimal(faker.number.float())`;
}
if (field.type === 'DateTime') {
if (field.isList) {
return `${field.name}: [faker.date.anytime(),faker.date.anytime(),faker.date.anytime(),faker.date.anytime(),faker.date.anytime()]`;
}
return `${field.name}: faker.date.anytime()`;
}
if (field.type === 'Json') {
return `${field.name}: JSON.stringify(${generateRandomJson()})`;
}
internals_1.logger.warn(`Type ${field.type}${field.isList ? '[]' : ''} (${field.kind}) is not supported. Field ${field.name} won't be generated.`);
return null;
}
async function createMethods({ enums, models }, extraImport, extraExport, emptyValueAs = 'undefined', clientImportPath = '@prisma/client') {
const functions = [];
models.forEach((m) => {
createFakeFunctionsWithoutFKs(models, m, enums, functions, emptyValueAs);
createFakeFunctionsWithFKs(models, m, enums, functions, emptyValueAs);
});
const enumNames = enums.map((it) => it.name).join(', ');
return await `import { ${enumNames} } from '${clientImportPath}';
import { faker } from '@faker-js/faker';
import Decimal from 'decimal.js';
${extraImport || ''}
${extraExport || ''}
${functions.join('\n')}
`;
}
exports.createMethods = createMethods;
function createFakeFunctionsWithoutFKs(models, model, enums, functions, emptyValueAs) {
const validFields = model.fields
.filter((field) => !field.isId)
.filter((field) => field.kind === 'scalar' || field.kind === 'enum')
.filter((field) => {
return !model.fields.find((it) => {
var _a;
return (_a = it.relationFromFields) === null || _a === void 0 ? void 0 : _a.includes(field.name);
});
})
.filter((field) => !field.hasDefaultValue)
.map((f) => getFieldDefinition(models, model, f, enums, emptyValueAs))
.filter(Boolean);
if (validFields.length > 0) {
functions.push(`export function fake${model.name}() {
return {
${validFields.join(',\n ')},
};
}`);
}
}
function createFakeFunctionsWithFKs(models, model, enums, functions, emptyValueAs) {
const validFields = model.fields
.filter((field) => field.kind === 'scalar' || field.kind === 'enum')
.map((f) => getFieldDefinition(models, model, f, enums, emptyValueAs))
.filter(Boolean);
if (validFields.length > 0) {
functions.push(`export function fake${model.name}Complete() {
return {
${validFields.join(',\n ')},
};
}`);
}
}
function generateRandomJson() {
const obj = {
foo: faker_1.faker.string.uuid(),
bar: faker_1.faker.number.int(),
bike: faker_1.faker.number.hex(),
a: faker_1.faker.string.alphanumeric(),
b: faker_1.faker.number.float(),
name: faker_1.faker.person.firstName(),
prop: faker_1.faker.string.binary(),
};
return JSON.stringify(obj);
}
//# sourceMappingURL=createMethods.js.map