UNPKG

@vegardit/prisma-generator-nestjs-dto

Version:

Generates DTO and Entity classes from Prisma Schema for NestJS

118 lines (117 loc) 5.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeHelpers = exports.importStatements = exports.importStatement = exports.each = exports.unless = exports.when = exports.echo = exports.scalarToTS = void 0; const PrismaScalarToTypeScript = { String: 'string', Boolean: 'boolean', Int: 'number', BigInt: 'bigint', Float: 'number', Decimal: 'Prisma.Decimal', DateTime: 'Date', Json: 'Prisma.JsonValue', Bytes: 'Buffer', }; const knownPrismaScalarTypes = Object.keys(PrismaScalarToTypeScript); const scalarToTS = (scalar, useInputTypes = false) => { if (!knownPrismaScalarTypes.includes(scalar)) { throw new Error(`Unrecognized scalar type: ${scalar}`); } if (useInputTypes && scalar === 'Json') { return 'Prisma.InputJsonValue'; } return PrismaScalarToTypeScript[scalar]; }; exports.scalarToTS = scalarToTS; const echo = (input) => input; exports.echo = echo; const when = (condition, thenTemplate, elseTemplate = '') => condition ? thenTemplate : elseTemplate; exports.when = when; const unless = (condition, thenTemplate, elseTemplate = '') => (!condition ? thenTemplate : elseTemplate); exports.unless = unless; const each = (arr, fn, joinWith = '') => arr.map(fn).join(joinWith); exports.each = each; const importStatement = (input) => { const { from, destruct = [], default: defaultExport } = input; const fragments = ['import']; if (defaultExport) { if (typeof defaultExport === 'string') { fragments.push(defaultExport); } else { fragments.push(`* as ${defaultExport['*']}`); } } if (destruct.length) { if (defaultExport) { fragments.push(','); } fragments.push(`{${destruct.flatMap((item) => { if (typeof item === 'string') return item; return Object.entries(item).map(([key, value]) => `${key} as ${value}`); })}}`); } fragments.push(`from '${from}'`); return fragments.join(' '); }; exports.importStatement = importStatement; const importStatements = (items) => `${(0, exports.each)(items, exports.importStatement, '\n')}`; exports.importStatements = importStatements; const makeHelpers = ({ connectDtoPrefix, createDtoPrefix, updateDtoPrefix, dtoSuffix, entityPrefix, entitySuffix, transformClassNameCase = exports.echo, transformFileNameCase = exports.echo, }) => { const className = (name, prefix = '', suffix = '') => `${prefix}${transformClassNameCase(name)}${suffix}`; const fileName = (name, prefix = '', suffix = '', withExtension = false) => `${prefix}${transformFileNameCase(name)}${suffix}${(0, exports.when)(withExtension, '.ts')}`; const entityName = (name) => className(name, entityPrefix, entitySuffix); const connectDtoName = (name) => className(name, connectDtoPrefix, dtoSuffix); const createDtoName = (name) => className(name, createDtoPrefix, dtoSuffix); const updateDtoName = (name) => className(name, updateDtoPrefix, dtoSuffix); const connectDtoFilename = (name, withExtension = false) => fileName(name, 'connect-', '.dto', withExtension); const createDtoFilename = (name, withExtension = false) => fileName(name, 'create-', '.dto', withExtension); const updateDtoFilename = (name, withExtension = false) => fileName(name, 'update-', '.dto', withExtension); const entityFilename = (name, withExtension = false) => fileName(name, undefined, '.entity', withExtension); const fieldType = (field, toInputType = false) => `${field.kind === 'scalar' ? (0, exports.scalarToTS)(field.type, toInputType) : field.kind === 'enum' || field.kind === 'relation-input' ? field.type : entityName(field.type)}${(0, exports.when)(field.isList, '[]')}`; const fieldToDtoProp = (field, useInputTypes = false, forceOptional = false) => `${(0, exports.when)(field.kind === 'enum', `@ApiProperty({ enum: ${fieldType(field, useInputTypes)}})\n`)}${field.name}${(0, exports.unless)(field.isRequired && !forceOptional, '?')}: ${fieldType(field, useInputTypes)};`; const fieldsToDtoProps = (fields, useInputTypes = false, forceOptional = false) => `${(0, exports.each)(fields, (field) => fieldToDtoProp(field, useInputTypes, forceOptional), '\n')}`; const fieldToEntityProp = (field) => `${field.name}${(0, exports.unless)(field.isRequired, '?')}: ${fieldType(field)} ${(0, exports.when)(field.isNullable, ' | null')};`; const fieldsToEntityProps = (fields) => `${(0, exports.each)(fields, (field) => fieldToEntityProp(field), '\n')}`; const apiExtraModels = (names) => `@ApiExtraModels(${names.map(entityName)})`; return { config: { connectDtoPrefix, createDtoPrefix, updateDtoPrefix, dtoSuffix, entityPrefix, entitySuffix, }, apiExtraModels, entityName, connectDtoName, createDtoName, updateDtoName, connectDtoFilename, createDtoFilename, updateDtoFilename, entityFilename, each: exports.each, echo: exports.echo, fieldsToDtoProps, fieldToDtoProp, fieldToEntityProp, fieldsToEntityProps, fieldType, for: exports.each, if: exports.when, importStatement: exports.importStatement, importStatements: exports.importStatements, transformClassNameCase, transformFileNameCase, unless: exports.unless, when: exports.when, }; }; exports.makeHelpers = makeHelpers;