hekireki 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/ajv.js +1 -1
- package/dist/bin/arktype.js +1 -1
- package/dist/bin/dbml.js +1 -1
- package/dist/bin/docs.js +1 -1
- package/dist/bin/drizzle.js +1 -1
- package/dist/bin/ecto.js +1 -1
- package/dist/bin/effect.js +1 -1
- package/dist/bin/gorm.js +1 -1
- package/dist/bin/mermaid-er.js +1 -1
- package/dist/bin/sea-orm.js +1 -1
- package/dist/bin/sqlalchemy.js +1 -1
- package/dist/bin/typebox.js +1 -1
- package/dist/bin/valibot.js +1 -1
- package/dist/bin/zod.js +1 -1
- package/dist/{bin-Brdok3Yj.js → bin-Dcg9ZO7c.js} +37 -23
- package/package.json +1 -1
package/dist/bin/ajv.js
CHANGED
package/dist/bin/arktype.js
CHANGED
package/dist/bin/dbml.js
CHANGED
package/dist/bin/docs.js
CHANGED
package/dist/bin/drizzle.js
CHANGED
package/dist/bin/ecto.js
CHANGED
package/dist/bin/effect.js
CHANGED
package/dist/bin/gorm.js
CHANGED
package/dist/bin/mermaid-er.js
CHANGED
package/dist/bin/sea-orm.js
CHANGED
package/dist/bin/sqlalchemy.js
CHANGED
package/dist/bin/typebox.js
CHANGED
package/dist/bin/valibot.js
CHANGED
package/dist/bin/zod.js
CHANGED
|
@@ -530,8 +530,11 @@ function makeRefName(ref) {
|
|
|
530
530
|
function combineKeys(keys) {
|
|
531
531
|
return keys.length > 1 ? `(${keys.join(", ")})` : keys[0];
|
|
532
532
|
}
|
|
533
|
-
function
|
|
534
|
-
return
|
|
533
|
+
function escapeTriple(str) {
|
|
534
|
+
return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
535
|
+
}
|
|
536
|
+
function noteLiteral(value) {
|
|
537
|
+
return value.includes("\n") ? `'''${escapeTriple(value)}'''` : `'${escapeNote(value)}'`;
|
|
535
538
|
}
|
|
536
539
|
function makeIndex(index) {
|
|
537
540
|
return ` ${index.columns.length > 1 ? `(${index.columns.join(", ")})` : index.columns[0]}${formatConstraints([
|
|
@@ -562,7 +565,7 @@ function makePrismaColumn(column) {
|
|
|
562
565
|
column.defaultValue !== void 0 && `default: ${column.defaultValue}`,
|
|
563
566
|
column.isUnique && "unique",
|
|
564
567
|
column.isNotNull && "not null",
|
|
565
|
-
column.note && `note: ${
|
|
568
|
+
column.note && `note: ${noteLiteral(column.note)}`
|
|
566
569
|
].filter((c) => Boolean(c));
|
|
567
570
|
return ` ${column.name} ${column.type}${formatConstraints(constraints)}`;
|
|
568
571
|
}
|
|
@@ -602,7 +605,7 @@ function makeTables(models, mapToDbSchema = false) {
|
|
|
602
605
|
}))];
|
|
603
606
|
const indexBlock = indexes.length > 0 ? `\n\n indexes {\n${indexes.map(makeIndex).join("\n")}\n }` : "";
|
|
604
607
|
const strippedNote = stripAnnotations(model.documentation);
|
|
605
|
-
return `Table ${modelName} {\n${columnLines}${indexBlock}${strippedNote ? `\n\n Note: ${
|
|
608
|
+
return `Table ${modelName} {\n${columnLines}${indexBlock}${strippedNote ? `\n\n Note: ${noteLiteral(strippedNote)}` : ""}\n}`;
|
|
606
609
|
});
|
|
607
610
|
}
|
|
608
611
|
function makeEnums(enums) {
|
|
@@ -1771,8 +1774,18 @@ function generateImports(imports, provider) {
|
|
|
1771
1774
|
...[...imports.ext.entries()].map(([pkg, fns]) => `import { ${[...fns].sort().join(", ")} } from '${pkg}'`)
|
|
1772
1775
|
].filter(Boolean).join("\n");
|
|
1773
1776
|
}
|
|
1774
|
-
function
|
|
1775
|
-
return name.
|
|
1777
|
+
function snakeToCamel(name) {
|
|
1778
|
+
return name.replace(/_+([a-zA-Z0-9])/g, (_, c) => c.toUpperCase());
|
|
1779
|
+
}
|
|
1780
|
+
function resolveTableName(model) {
|
|
1781
|
+
return model.dbName ?? makeSnakeCase(model.name);
|
|
1782
|
+
}
|
|
1783
|
+
function resolveVarName(model) {
|
|
1784
|
+
return snakeToCamel(resolveTableName(model));
|
|
1785
|
+
}
|
|
1786
|
+
function resolveVarNameByType(type, models) {
|
|
1787
|
+
const target = models.find((m) => m.name === type);
|
|
1788
|
+
return snakeToCamel(target ? resolveTableName(target) : makeSnakeCase(type));
|
|
1776
1789
|
}
|
|
1777
1790
|
function isFieldDefault(v) {
|
|
1778
1791
|
return typeof v === "object" && v !== null && "name" in v;
|
|
@@ -1918,17 +1931,17 @@ const PRISMA_ACTION_MAP = {
|
|
|
1918
1931
|
NoAction: "no action",
|
|
1919
1932
|
SetDefault: "set default"
|
|
1920
1933
|
};
|
|
1921
|
-
function makeFkReference(field, model) {
|
|
1934
|
+
function makeFkReference(field, model, models) {
|
|
1922
1935
|
const relField = model.fields.find((f) => f.kind === "object" && f.relationFromFields && f.relationFromFields.includes(field.name));
|
|
1923
1936
|
if (!(relField?.relationFromFields && relField.relationToFields)) return "";
|
|
1924
1937
|
if (relField.type === model.name) return "";
|
|
1925
|
-
const targetVar =
|
|
1938
|
+
const targetVar = resolveVarNameByType(relField.type, models);
|
|
1926
1939
|
const toCol = relField.relationToFields[0] ?? "id";
|
|
1927
1940
|
const onDelete = relField.relationOnDelete;
|
|
1928
1941
|
const drizzleAction = onDelete ? PRISMA_ACTION_MAP[onDelete] : void 0;
|
|
1929
1942
|
return `.references(() => ${targetVar}.${toCol}${drizzleAction ? `, { onDelete: '${drizzleAction}' }` : ""})`;
|
|
1930
1943
|
}
|
|
1931
|
-
function makeColumn(field, model, provider, imports, enums) {
|
|
1944
|
+
function makeColumn(field, model, models, provider, imports, enums) {
|
|
1932
1945
|
if (field.kind === "object") return null;
|
|
1933
1946
|
if (field.kind === "unsupported") return `// unsupported type: ${field.name}`;
|
|
1934
1947
|
const isAutoincrement = isFieldDefault(field.default) && field.default.name === "autoincrement";
|
|
@@ -1938,7 +1951,7 @@ function makeColumn(field, model, provider, imports, enums) {
|
|
|
1938
1951
|
field.isId && !hasCompositePK ? isAutoincrement && provider === "sqlite" ? ".primaryKey({ autoIncrement: true })" : ".primaryKey()" : "",
|
|
1939
1952
|
field.isRequired && !field.isId && !(isAutoincrement && provider === "postgresql") ? ".notNull()" : "",
|
|
1940
1953
|
field.isUnique ? ".unique()" : "",
|
|
1941
|
-
makeFkReference(field, model),
|
|
1954
|
+
makeFkReference(field, model, models),
|
|
1942
1955
|
isAutoincrement ? provider === "mysql" ? ".autoincrement()" : "" : field.isUpdatedAt && (field.default === void 0 || field.default === null) ? (() => {
|
|
1943
1956
|
const r = resolveUpdatedAtDefault(provider);
|
|
1944
1957
|
if (r.needsSql) imports.orm.add("sql");
|
|
@@ -1969,18 +1982,18 @@ function makeCompositeConstraints(model, imports, indexes, tableName) {
|
|
|
1969
1982
|
].filter((l) => l !== null);
|
|
1970
1983
|
return all.length > 0 ? all.join(", ") : null;
|
|
1971
1984
|
}
|
|
1972
|
-
function makeTable(model, provider, imports, enums, indexes) {
|
|
1985
|
+
function makeTable(model, models, provider, imports, enums, indexes) {
|
|
1973
1986
|
const tableFunc = provider === "postgresql" ? "pgTable" : provider === "mysql" ? "mysqlTable" : "sqliteTable";
|
|
1974
1987
|
imports.core.add(tableFunc);
|
|
1975
|
-
const varName =
|
|
1976
|
-
const tableName =
|
|
1977
|
-
const columns = model.fields.map((field) => makeColumn(field, model, provider, imports, enums)).filter((c) => c !== null).join(", ");
|
|
1988
|
+
const varName = resolveVarName(model);
|
|
1989
|
+
const tableName = resolveTableName(model);
|
|
1990
|
+
const columns = model.fields.map((field) => makeColumn(field, model, models, provider, imports, enums)).filter((c) => c !== null).join(", ");
|
|
1978
1991
|
const constraints = makeCompositeConstraints(model, imports, indexes, tableName);
|
|
1979
1992
|
return constraints ? `export const ${varName} = ${tableFunc}('${tableName}', { ${columns} }, (table) => [${constraints}])` : `export const ${varName} = ${tableFunc}('${tableName}', { ${columns} })`;
|
|
1980
1993
|
}
|
|
1981
|
-
function makeRelationField(field, model,
|
|
1982
|
-
const targetVar =
|
|
1983
|
-
const modelVar =
|
|
1994
|
+
function makeRelationField(field, model, models, relFields) {
|
|
1995
|
+
const targetVar = resolveVarNameByType(field.type, models);
|
|
1996
|
+
const modelVar = resolveVarName(model);
|
|
1984
1997
|
const needsAlias = relFields.filter((f) => f.type === field.type).length > 1 && field.relationName;
|
|
1985
1998
|
if (field.relationFromFields && field.relationFromFields.length > 0) {
|
|
1986
1999
|
const fromCol = field.relationFromFields[0];
|
|
@@ -2002,7 +2015,7 @@ function makeRelations(models, imports) {
|
|
|
2002
2015
|
return modelsWithRels.map((model) => {
|
|
2003
2016
|
const relFields = model.fields.filter((f) => f.kind === "object");
|
|
2004
2017
|
const fieldLines = relFields.map((field) => makeRelationField(field, model, models, relFields)).join(", ");
|
|
2005
|
-
const modelVar =
|
|
2018
|
+
const modelVar = resolveVarName(model);
|
|
2006
2019
|
const needsOne = relFields.some((f) => f.relationFromFields && f.relationFromFields.length > 0 || !f.isList);
|
|
2007
2020
|
const needsMany = relFields.some((f) => f.isList && !(f.relationFromFields && f.relationFromFields.length > 0));
|
|
2008
2021
|
return `export const ${modelVar}Relations = relations(${modelVar}, ({ ${[needsOne ? "one" : "", needsMany ? "many" : ""].filter(Boolean).join(", ")} }) => ({ ${fieldLines} }))`;
|
|
@@ -2013,7 +2026,7 @@ function makeRelations(models, imports) {
|
|
|
2013
2026
|
function drizzleSchema(datamodel, provider, indexes) {
|
|
2014
2027
|
const db = resolveDbProvider(provider);
|
|
2015
2028
|
const imports = createImports();
|
|
2016
|
-
const tableLines = datamodel.models.map((model) => makeTable(model, db, imports, datamodel.enums, indexes));
|
|
2029
|
+
const tableLines = datamodel.models.map((model) => makeTable(model, datamodel.models, db, imports, datamodel.enums, indexes));
|
|
2017
2030
|
const relationsLines = makeRelations(datamodel.models, imports);
|
|
2018
2031
|
const tableLinesWithGap = tableLines.flatMap((line, i) => i < tableLines.length - 1 ? [line, ""] : [line]);
|
|
2019
2032
|
const relationsLinesWithGap = relationsLines.flatMap((line, i) => i < relationsLines.length - 1 ? [line, ""] : [line]);
|
|
@@ -2732,8 +2745,8 @@ const RELATIONSHIPS = {
|
|
|
2732
2745
|
"zero-many": "}o",
|
|
2733
2746
|
many: "}|"
|
|
2734
2747
|
};
|
|
2735
|
-
function erRelationLine(relation) {
|
|
2736
|
-
return ` ${relation.from.model} ${RELATIONSHIPS[relation.from.cardinality]}--${RELATIONSHIPS[relation.to.cardinality]} ${relation.to.model} : "(${relation.from.field}) - (${relation.to.field})"`;
|
|
2748
|
+
function erRelationLine(relation, resolveName = (model) => model) {
|
|
2749
|
+
return ` ${resolveName(relation.from.model)} ${RELATIONSHIPS[relation.from.cardinality]}--${RELATIONSHIPS[relation.to.cardinality]} ${resolveName(relation.to.model)} : "(${relation.from.field}) - (${relation.to.field})"`;
|
|
2737
2750
|
}
|
|
2738
2751
|
function modelFields(model) {
|
|
2739
2752
|
const fkFields = new Set(model.fields.filter((f) => f.relationFromFields && f.relationFromFields.length > 0).flatMap((f) => f.relationFromFields ?? []));
|
|
@@ -2747,7 +2760,7 @@ function modelFields(model) {
|
|
|
2747
2760
|
}
|
|
2748
2761
|
function modelInfo(model) {
|
|
2749
2762
|
return [
|
|
2750
|
-
` ${model.name} {`,
|
|
2763
|
+
` ${model.dbName ?? model.name} {`,
|
|
2751
2764
|
...modelFields(model),
|
|
2752
2765
|
" }"
|
|
2753
2766
|
];
|
|
@@ -2757,7 +2770,8 @@ function modelInfo(model) {
|
|
|
2757
2770
|
const ER_HEADER = ["```mermaid", "erDiagram"];
|
|
2758
2771
|
const ER_FOOTER = ["```"];
|
|
2759
2772
|
function erContent(models) {
|
|
2760
|
-
const
|
|
2773
|
+
const resolveName = (model) => models.find((m) => m.name === model)?.dbName ?? model;
|
|
2774
|
+
const relations = mergeERRelations(models).map((relation) => erRelationLine(relation, resolveName));
|
|
2761
2775
|
const modelInfos = models.flatMap(modelInfo);
|
|
2762
2776
|
return [
|
|
2763
2777
|
...ER_HEADER,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hekireki",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"description": "Hekireki is a tool that generates validation schemas for Zod, Valibot, ArkType, and Effect Schema, as well as ER diagrams and DBML, from Prisma schemas annotated with comments.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ajv",
|