UNPKG

single-source-of-truth

Version:

<div align='center'> <h1><strong>single-source-of-truth</strong></h1> <i>Use ArkType schemas to generate your Prisma schema</i><br> <code>pnpm add truth@npm:single-source-of-truth arktype</code> </div>

88 lines (82 loc) 3.29 kB
import { t as logger_default } from "./logger-BkjnZ0T9.js"; import { mkdir, writeFile } from "node:fs/promises"; import { dirname } from "node:path"; import Cursor from "code-block-writer"; //#region src/prisma/builders/enum.ts function buildEnumBlock(ēnum) { const cursor = new Cursor({ indentNumberOfSpaces: 2 }); cursor.write(`enum ${ēnum.name}`).block(() => { for (const value of ēnum.values) cursor.writeLine(value.name); }); return cursor.toString(); } //#endregion //#region src/prisma/builders/field.ts function buildFieldLine(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"); if (field.attributes.updatedAt) cursor.space().write("@updatedAt"); const relation = buildFieldRelationAttribute(field.attributes); if (relation) cursor.space().write(relation); return cursor.toString(); } function resolvePrismaType(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) { 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(",")})`; } //#endregion //#region src/prisma/builders/model.ts function buildModelBlock(model) { const cursor = new Cursor({ indentNumberOfSpaces: 2 }); cursor.write(`model ${model.name}`).block(() => { for (const field of model.fields) cursor.writeLine(buildFieldLine(field)); if (model.attributes.id?.length) cursor.writeLine(`@@id([${model.attributes.id.join(", ")}])`); if (model.attributes.unique?.length) for (const unique of model.attributes.unique) cursor.writeLine(`@@unique([${unique.join(", ")}])`); }); return cursor.toString(); } //#endregion //#region src/prisma/builders/schema.ts function buildSchema(schema) { const cursor = new Cursor({ indentNumberOfSpaces: 2 }); for (const enum_ of schema.enums) cursor.writeLine(buildEnumBlock(enum_)).newLine(); for (const model of schema.models) cursor.writeLine(buildModelBlock(model)).newLine(); return cursor.toString(); } //#endregion //#region src/prisma/config.ts async function export_(registry, path) { const schema = buildSchema(registry.toTruth()); const count = (c, w) => `${c} ${w}${c !== 1 ? "s" : ""}`; logger_default.info(`Writing prisma schema with ${count(registry.enums.size, "enum")} and ${count(registry.models.size, "model")} to '${path}'...`); await mkdir(dirname(path), { recursive: true }); await writeFile(path, schema); } //#endregion export { export_ as export }; //# sourceMappingURL=config-B7yG3nBX.js.map