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
JavaScript
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