UNPKG

@hexys/prismix

Version:

Create multiple Prisma schema files with shared model relations.

210 lines (207 loc) 7.9 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // lib/deserializer.ts var deserializer_exports = {}; __export(deserializer_exports, { deserializeDatasources: () => deserializeDatasources, deserializeEnums: () => deserializeEnums, deserializeGenerators: () => deserializeGenerators, deserializeModels: () => deserializeModels }); module.exports = __toCommonJS(deserializer_exports); // lib/utils.ts function valueIs(value, types) { return types.map((type) => type.name.toLowerCase() == typeof value).includes(true); } // lib/deserializer.ts var renderAttribute = (field) => { const { kind, type } = field; return { default: (value) => { if (value == null || value == void 0) return ""; if (kind === "scalar" && type !== "BigInt" && typeof value == "string") value = `"${value}"`; if (valueIs(value, [Number, String, Boolean]) || kind === "enum") return `@default(${value})`; if (typeof value === "object") { if (value.name === "dbgenerated") return `@default(${value.name}("${value.args}"))`; return `@default(${value.name}(${value.args}))`; } throw new Error(`Prismix: Unsupported field attribute ${value}`); }, isId: (value) => value ? "@id" : "", isUnique: (value) => value ? "@unique" : "", isUpdatedAt: (value) => value ? "@updatedAt" : "", columnName: (value) => value ? `@map("${value}")` : "", dbType: (value) => value != null ? value : "" }; }; function renderAttributes(field) { const { relationFromFields, relationToFields, relationName, kind, relationOnDelete, relationOnUpdate } = field; if (kind == "scalar" || kind == "enum") { return `${Object.keys(field).map( (property) => renderAttribute(field)[property] && renderAttribute(field)[property](field[property]) ).filter((x) => !!x).join(" ")}`; } if (relationFromFields && kind === "object") { return relationFromFields.length > 0 ? `@relation(name: "${relationName}", fields: [${relationFromFields}], references: [${relationToFields}]${relationOnDelete ? `, onDelete: ${relationOnDelete}` : ""}${relationOnUpdate ? `, onUpdate: ${relationOnUpdate}` : ""})` : `@relation(name: "${relationName}")`; } return ""; } function renderDocumentation(documentation, tab) { if (!documentation) return ""; const documentationLines = documentation.split("\n"); return documentationLines.length == 1 ? `/// ${documentationLines[0]} ${tab ? " " : ""}` : documentationLines.map((text, idx) => idx == 0 ? `/// ${text}` : ` /// ${text}`).join("\n") + (tab ? "\n " : "\n"); } function renderModelFields(fields) { return fields.map((field) => { const { name, kind, type, documentation, isRequired, isList } = field; if (kind == "scalar") return `${renderDocumentation(documentation, true)}${name} ${type}${isList ? "[]" : isRequired ? "" : "?"} ${renderAttributes(field)}`; if (kind == "object" || kind == "enum") return `${renderDocumentation(documentation, true)}${name} ${type}${isList ? "[]" : isRequired ? "" : "?"} ${renderAttributes(field)}`; throw new Error(`Prismix: Unsupported field kind "${kind}"`); }); } function renderIdFieldsOrPrimaryKey(idFields) { if (!idFields) return ""; return idFields.length > 0 ? `@@id([${idFields.join(", ")}])` : ""; } function renderUniqueIndexes(uniqueIndexes) { return uniqueIndexes.length > 0 ? uniqueIndexes.map( ({ name, fields }) => `@@unique([${fields.join(", ")}]${name ? `, name: "${name}"` : ""})` ) : []; } function renderDbName(dbName) { return dbName ? `@@map("${dbName}")` : ""; } function renderUrl(envValue) { const value = envValue.fromEnvVar ? `env("${envValue.fromEnvVar}")` : `"${envValue.value}"`; return `url = ${value}`; } function renderProvider(provider) { return `provider = "${provider}"`; } function renderOutput(path) { return path ? `output = "${path}"` : ""; } function renderPreviewFeatures(previewFeatures) { return previewFeatures.length ? `previewFeatures = ${JSON.stringify(previewFeatures)}` : ""; } function renderBlock(type, name, things, documentation) { return `${renderDocumentation(documentation)}${type} ${name} { ${things.filter((thing) => thing.length > 1).map((thing) => ` ${thing}`).join("\n")} }`; } function deserializeModel(model) { const { name, fields, dbName, idFields, primaryKey, doubleAtIndexes, uniqueIndexes, documentation } = model; return renderBlock( "model", name, [ ...renderModelFields(fields), ...renderUniqueIndexes(uniqueIndexes), ...doubleAtIndexes != null ? doubleAtIndexes : [], renderDbName(dbName), renderIdFieldsOrPrimaryKey(idFields || (primaryKey == null ? void 0 : primaryKey.fields)) ], documentation ); } function deserializeDatasource(datasource) { const { activeProvider: provider, name, url } = datasource; return renderBlock("datasource", name, [renderProvider(provider), renderUrl(url)]); } function deserializeGenerator(generator) { const { binaryTargets, name, output, provider, previewFeatures } = generator; return renderBlock("generator", name, [ renderProvider(provider.value), renderOutput((output == null ? void 0 : output.value) || null), renderPreviewFeatures(previewFeatures) ]); } function deserializeEnum({ name, values, dbName, documentation }) { const outputValues = values.map(({ name: name2, dbName: dbName2 }) => { let result = name2; if (name2 !== dbName2 && dbName2) result += `@map("${dbName2}")`; return result; }); return renderBlock("enum", name, [...outputValues, renderDbName(dbName || null)], documentation); } function deserializeModels(models) { return __async(this, null, function* () { return models.map((model) => deserializeModel(model)).join("\n"); }); } function deserializeDatasources(datasources) { return __async(this, null, function* () { return datasources.map((datasource) => deserializeDatasource(datasource)).join("\n"); }); } function deserializeGenerators(generators) { return __async(this, null, function* () { return generators.map((generator) => deserializeGenerator(generator)).join("\n"); }); } function deserializeEnums(enums) { return __async(this, null, function* () { return Array.from(new Set(enums.map((each) => deserializeEnum(each)))).join("\n"); }); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { deserializeDatasources, deserializeEnums, deserializeGenerators, deserializeModels }); //# sourceMappingURL=deserializer.js.map