single-source-of-truth
Version:
Use Zod schemas to your generate Prisma schema
60 lines (48 loc) • 1.58 kB
text/typescript
import Cursor from 'code-block-writer';
import type { Standard } from '~/standard.js';
export function buildFieldLine(field: Standard.Model.Field) {
const cursor = new Cursor({});
cursor.write(field.name).space();
cursor.write(resolvePrismaType(field));
if (field.attributes.list) cursor.write('[]');
if (field.attributes.nullable) cursor.write('?');
if (field.attributes.id) cursor.space().write('@id');
if (field.attributes.unique) cursor.space().write('@unique');
const relation = buildFieldRelationAttribute(field.attributes);
if (relation) cursor.space().write(relation);
return cursor.toString();
}
function resolvePrismaType(field: Standard.Model.Field) {
switch (field.type) {
case 'string':
return 'String';
case 'integer':
return 'Int';
case 'float':
return 'Float';
case 'boolean':
return 'Boolean';
case 'date':
return 'DateTime';
case 'bigint':
return 'BigInt';
case 'object':
return 'Json';
default:
return field.type;
}
}
function buildFieldRelationAttribute(
attributes: NonNullable<Standard.Model.Field.Attributes>,
) {
const parts = [];
if (attributes.name) parts.push(`name:"${attributes.name}"`);
if (attributes.references) {
const fields = attributes.references.map((r) => r[0]);
parts.push(`fields:[${fields.join(',')}]`);
const references = attributes.references.map((r) => r[1]);
parts.push(`references:[${references.join(',')}]`);
}
if (parts.length === 0) return null;
return `@relation(${parts.join(',')})`;
}