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 CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/ajv.ts
4
4
  registerGenerator("ajv");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/arktype.ts
4
4
  registerGenerator("arktype");
5
5
  //#endregion
package/dist/bin/dbml.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/dbml.ts
4
4
  registerGenerator("dbml");
5
5
  //#endregion
package/dist/bin/docs.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/docs.ts
4
4
  registerGenerator("docs");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/drizzle.ts
4
4
  registerGenerator("drizzle");
5
5
  //#endregion
package/dist/bin/ecto.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/ecto.ts
4
4
  registerGenerator("ecto");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/effect.ts
4
4
  registerGenerator("effect");
5
5
  //#endregion
package/dist/bin/gorm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/gorm.ts
4
4
  registerGenerator("gorm");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/mermaid-er.ts
4
4
  registerGenerator("mermaid-er");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/sea-orm.ts
4
4
  registerGenerator("sea-orm");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/sqlalchemy.ts
4
4
  registerGenerator("sqlalchemy");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/typebox.ts
4
4
  registerGenerator("typebox");
5
5
  //#endregion
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/valibot.ts
4
4
  registerGenerator("valibot");
5
5
  //#endregion
package/dist/bin/zod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as registerGenerator } from "../bin-Brdok3Yj.js";
2
+ import { t as registerGenerator } from "../bin-Dcg9ZO7c.js";
3
3
  //#region src/bin/zod.ts
4
4
  registerGenerator("zod");
5
5
  //#endregion
@@ -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 quote(value) {
534
- return `'${escapeNote(value)}'`;
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: ${quote(column.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: ${quote(escapeNote(strippedNote))}` : ""}\n}`;
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 toCamelCase(name) {
1775
- return name.charAt(0).toLowerCase() + name.slice(1);
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 = toCamelCase(relField.type);
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 = toCamelCase(model.name);
1976
- const tableName = model.dbName ?? makeSnakeCase(model.name);
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, _models, relFields) {
1982
- const targetVar = toCamelCase(field.type);
1983
- const modelVar = toCamelCase(model.name);
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 = toCamelCase(model.name);
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 relations = mergeERRelations(models).map(erRelationLine);
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",
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",