hekireki 0.8.4 → 0.8.6
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/README.md +20 -0
- 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-5xZho8bJ.js → bin-DLQOqGdU.js} +100 -60
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -530,6 +530,26 @@ export const postRelations = relations(post, ({ one }) => ({
|
|
|
530
530
|
}))
|
|
531
531
|
```
|
|
532
532
|
|
|
533
|
+
#### ID default functions
|
|
534
|
+
|
|
535
|
+
For Drizzle, Prisma `@default(...)` ID generators are emitted as client-side `$defaultFn` calls. Some require an extra package — install it in your project:
|
|
536
|
+
|
|
537
|
+
| Prisma default | Generated call | Package to install |
|
|
538
|
+
| ---------------------------------------- | --------------------- | ---------------------------------------------- |
|
|
539
|
+
| `@default(uuid())` / `@default(uuid(4))` | `crypto.randomUUID()` | — (Node/Web built-in) |
|
|
540
|
+
| `@default(cuid())` / `@default(cuid(1))` | `cuid()` | `npm i cuid` |
|
|
541
|
+
| `@default(cuid(2))` | `createId()` | `npm i @paralleldrive/cuid2` |
|
|
542
|
+
| `@default(nanoid())` | `nanoid()` | `npm i nanoid` (>= 5.0.9, or >= 3.3.8 for CJS) |
|
|
543
|
+
| `@default(ulid())` | `ulid()` | `npm i ulidx` |
|
|
544
|
+
|
|
545
|
+
Notes:
|
|
546
|
+
|
|
547
|
+
- **`cuid()` uses cuid v1**, which its author has deprecated in favor of cuid v2 ([npm `cuid`](https://www.npmjs.com/package/cuid)). It is emitted only when you explicitly write `@default(cuid())`; for new schemas prefer `@default(cuid(2))`.
|
|
548
|
+
- **`ulid()` maps to [`ulidx`](https://www.npmjs.com/package/ulidx)** (an actively maintained, crypto-backed drop-in for `ulid`).
|
|
549
|
+
- `@default(uuid(7))` is currently emitted as `crypto.randomUUID()` (UUID v4); native v7 support is planned.
|
|
550
|
+
- `@default(nanoid(n))` length argument is not yet applied — the default length is used.
|
|
551
|
+
- Inserts that bypass the ORM (raw SQL, bulk load) won't run `$defaultFn`; add a database-level `DEFAULT` for those paths.
|
|
552
|
+
|
|
533
553
|
### Mermaid
|
|
534
554
|
|
|
535
555
|
```mermaid
|
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
|
@@ -163,7 +163,7 @@ function parseDocumentWithoutAnnotations(documentation) {
|
|
|
163
163
|
"@t.",
|
|
164
164
|
"@j."
|
|
165
165
|
];
|
|
166
|
-
const annotationExact = new Set([
|
|
166
|
+
const annotationExact = /* @__PURE__ */ new Set([
|
|
167
167
|
"@z",
|
|
168
168
|
"@v",
|
|
169
169
|
"@a",
|
|
@@ -183,7 +183,7 @@ function stripAnnotations(doc) {
|
|
|
183
183
|
"@t.",
|
|
184
184
|
"@j."
|
|
185
185
|
];
|
|
186
|
-
const annotationExact = new Set([
|
|
186
|
+
const annotationExact = /* @__PURE__ */ new Set([
|
|
187
187
|
"@z",
|
|
188
188
|
"@v",
|
|
189
189
|
"@a",
|
|
@@ -1067,7 +1067,7 @@ const ModelAction = {
|
|
|
1067
1067
|
function isFieldDefault$1(v) {
|
|
1068
1068
|
return typeof v === "object" && v !== null && "name" in v && "args" in v;
|
|
1069
1069
|
}
|
|
1070
|
-
const fieldDirectiveMap = new Map([
|
|
1070
|
+
const fieldDirectiveMap = /* @__PURE__ */ new Map([
|
|
1071
1071
|
["isUnique", "@unique"],
|
|
1072
1072
|
["isId", "@id"],
|
|
1073
1073
|
["hasDefaultValue", "@default"],
|
|
@@ -1761,21 +1761,43 @@ function createImports() {
|
|
|
1761
1761
|
ext: /* @__PURE__ */ new Map()
|
|
1762
1762
|
};
|
|
1763
1763
|
}
|
|
1764
|
-
function
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1764
|
+
function applyImport(imports, req) {
|
|
1765
|
+
if (req.pkg === "drizzle-orm") {
|
|
1766
|
+
imports.orm.add(req.name);
|
|
1767
|
+
return;
|
|
1768
|
+
}
|
|
1769
|
+
const entry = imports.ext.get(req.pkg) ?? { named: /* @__PURE__ */ new Set() };
|
|
1770
|
+
const next = req.kind === "default" ? {
|
|
1771
|
+
named: entry.named,
|
|
1772
|
+
default: req.name
|
|
1773
|
+
} : {
|
|
1774
|
+
named: entry.named.add(req.name),
|
|
1775
|
+
default: entry.default
|
|
1776
|
+
};
|
|
1777
|
+
imports.ext.set(req.pkg, next);
|
|
1768
1778
|
}
|
|
1769
1779
|
function generateImports(imports, provider) {
|
|
1770
1780
|
const mod = provider === "postgresql" ? "drizzle-orm/pg-core" : provider === "mysql" ? "drizzle-orm/mysql-core" : "drizzle-orm/sqlite-core";
|
|
1771
1781
|
return [
|
|
1772
1782
|
imports.core.size > 0 ? `import { ${[...imports.core].sort().join(", ")} } from '${mod}'` : "",
|
|
1773
1783
|
imports.orm.size > 0 ? `import { ${[...imports.orm].sort().join(", ")} } from 'drizzle-orm'` : "",
|
|
1774
|
-
...[...imports.ext.entries()].map(([pkg,
|
|
1784
|
+
...[...imports.ext.entries()].map(([pkg, entry]) => {
|
|
1785
|
+
return `import ${[entry.default, entry.named.size > 0 ? `{ ${[...entry.named].sort().join(", ")} }` : void 0].filter((c) => c !== void 0).join(", ")} from '${pkg}'`;
|
|
1786
|
+
})
|
|
1775
1787
|
].filter(Boolean).join("\n");
|
|
1776
1788
|
}
|
|
1777
|
-
function
|
|
1778
|
-
return name.
|
|
1789
|
+
function snakeToCamel(name) {
|
|
1790
|
+
return name.replace(/_+([a-zA-Z0-9])/g, (_, c) => c.toUpperCase());
|
|
1791
|
+
}
|
|
1792
|
+
function resolveTableName(model) {
|
|
1793
|
+
return model.dbName ?? makeSnakeCase(model.name);
|
|
1794
|
+
}
|
|
1795
|
+
function resolveVarName(model) {
|
|
1796
|
+
return snakeToCamel(resolveTableName(model));
|
|
1797
|
+
}
|
|
1798
|
+
function resolveVarNameByType(type, models) {
|
|
1799
|
+
const target = models.find((m) => m.name === type);
|
|
1800
|
+
return snakeToCamel(target ? resolveTableName(target) : makeSnakeCase(type));
|
|
1779
1801
|
}
|
|
1780
1802
|
function isFieldDefault(v) {
|
|
1781
1803
|
return typeof v === "object" && v !== null && "name" in v;
|
|
@@ -1818,80 +1840,98 @@ function makeColumnExpr(field, provider, imports, enums) {
|
|
|
1818
1840
|
const rest = baseExpr.slice(parenIdx + 1);
|
|
1819
1841
|
return rest === ")" ? `${baseFnName}('${colName}')` : `${baseFnName}('${colName}', ${rest}`;
|
|
1820
1842
|
}
|
|
1843
|
+
const SQL_IMPORT = {
|
|
1844
|
+
pkg: "drizzle-orm",
|
|
1845
|
+
kind: "named",
|
|
1846
|
+
name: "sql"
|
|
1847
|
+
};
|
|
1821
1848
|
function resolveDefaultValue(dflt, fieldType, provider) {
|
|
1822
1849
|
if (dflt === void 0 || dflt === null) return {
|
|
1823
1850
|
chain: "",
|
|
1824
|
-
|
|
1825
|
-
needsCuid: false
|
|
1851
|
+
imports: []
|
|
1826
1852
|
};
|
|
1827
1853
|
if (isFieldDefault(dflt)) switch (dflt.name) {
|
|
1828
1854
|
case "autoincrement": return {
|
|
1829
1855
|
chain: "",
|
|
1830
|
-
|
|
1831
|
-
needsCuid: false
|
|
1856
|
+
imports: []
|
|
1832
1857
|
};
|
|
1833
1858
|
case "now":
|
|
1834
1859
|
if (provider === "sqlite") return {
|
|
1835
1860
|
chain: ".default(sql`(unixepoch() * 1000)`)",
|
|
1836
|
-
|
|
1837
|
-
needsCuid: false
|
|
1861
|
+
imports: [SQL_IMPORT]
|
|
1838
1862
|
};
|
|
1839
1863
|
if (provider === "mysql") return {
|
|
1840
1864
|
chain: ".default(sql`CURRENT_TIMESTAMP(3)`)",
|
|
1841
|
-
|
|
1842
|
-
needsCuid: false
|
|
1865
|
+
imports: [SQL_IMPORT]
|
|
1843
1866
|
};
|
|
1844
1867
|
return {
|
|
1845
1868
|
chain: ".defaultNow()",
|
|
1846
|
-
|
|
1847
|
-
needsCuid: false
|
|
1869
|
+
imports: []
|
|
1848
1870
|
};
|
|
1849
1871
|
case "uuid": return {
|
|
1850
1872
|
chain: ".$defaultFn(() => crypto.randomUUID())",
|
|
1851
|
-
|
|
1852
|
-
needsCuid: false
|
|
1873
|
+
imports: []
|
|
1853
1874
|
};
|
|
1854
|
-
case "cuid": return {
|
|
1875
|
+
case "cuid": return dflt.args[0] === 2 ? {
|
|
1855
1876
|
chain: ".$defaultFn(() => createId())",
|
|
1856
|
-
|
|
1857
|
-
|
|
1877
|
+
imports: [{
|
|
1878
|
+
pkg: "@paralleldrive/cuid2",
|
|
1879
|
+
kind: "named",
|
|
1880
|
+
name: "createId"
|
|
1881
|
+
}]
|
|
1882
|
+
} : {
|
|
1883
|
+
chain: ".$defaultFn(() => cuid())",
|
|
1884
|
+
imports: [{
|
|
1885
|
+
pkg: "cuid",
|
|
1886
|
+
kind: "default",
|
|
1887
|
+
name: "cuid"
|
|
1888
|
+
}]
|
|
1889
|
+
};
|
|
1890
|
+
case "nanoid": return {
|
|
1891
|
+
chain: ".$defaultFn(() => nanoid())",
|
|
1892
|
+
imports: [{
|
|
1893
|
+
pkg: "nanoid",
|
|
1894
|
+
kind: "named",
|
|
1895
|
+
name: "nanoid"
|
|
1896
|
+
}]
|
|
1897
|
+
};
|
|
1898
|
+
case "ulid": return {
|
|
1899
|
+
chain: ".$defaultFn(() => ulid())",
|
|
1900
|
+
imports: [{
|
|
1901
|
+
pkg: "ulidx",
|
|
1902
|
+
kind: "named",
|
|
1903
|
+
name: "ulid"
|
|
1904
|
+
}]
|
|
1858
1905
|
};
|
|
1859
1906
|
case "dbgenerated":
|
|
1860
1907
|
if (typeof dflt.args[0] === "string") return {
|
|
1861
1908
|
chain: `.default(sql\`${dflt.args[0]}\`)`,
|
|
1862
|
-
|
|
1863
|
-
needsCuid: false
|
|
1909
|
+
imports: [SQL_IMPORT]
|
|
1864
1910
|
};
|
|
1865
1911
|
return {
|
|
1866
1912
|
chain: "",
|
|
1867
|
-
|
|
1868
|
-
needsCuid: false
|
|
1913
|
+
imports: []
|
|
1869
1914
|
};
|
|
1870
1915
|
default: return {
|
|
1871
1916
|
chain: "",
|
|
1872
|
-
|
|
1873
|
-
needsCuid: false
|
|
1917
|
+
imports: []
|
|
1874
1918
|
};
|
|
1875
1919
|
}
|
|
1876
1920
|
if (typeof dflt === "string") return {
|
|
1877
1921
|
chain: `.default('${dflt}')`,
|
|
1878
|
-
|
|
1879
|
-
needsCuid: false
|
|
1922
|
+
imports: []
|
|
1880
1923
|
};
|
|
1881
1924
|
if (typeof dflt === "number") return {
|
|
1882
1925
|
chain: fieldType === "Decimal" ? `.default('${dflt}')` : `.default(${dflt})`,
|
|
1883
|
-
|
|
1884
|
-
needsCuid: false
|
|
1926
|
+
imports: []
|
|
1885
1927
|
};
|
|
1886
1928
|
if (typeof dflt === "boolean") return {
|
|
1887
1929
|
chain: `.default(${dflt})`,
|
|
1888
|
-
|
|
1889
|
-
needsCuid: false
|
|
1930
|
+
imports: []
|
|
1890
1931
|
};
|
|
1891
1932
|
return {
|
|
1892
1933
|
chain: "",
|
|
1893
|
-
|
|
1894
|
-
needsCuid: false
|
|
1934
|
+
imports: []
|
|
1895
1935
|
};
|
|
1896
1936
|
}
|
|
1897
1937
|
function resolveUpdatedAtDefault(provider) {
|
|
@@ -1910,8 +1950,7 @@ function resolveUpdatedAtDefault(provider) {
|
|
|
1910
1950
|
}
|
|
1911
1951
|
function makeDefaultChain(dflt, fieldType, provider, imports) {
|
|
1912
1952
|
const result = resolveDefaultValue(dflt, fieldType, provider);
|
|
1913
|
-
|
|
1914
|
-
if (result.needsCuid) addExternal(imports, "@paralleldrive/cuid2", "createId");
|
|
1953
|
+
for (const req of result.imports) applyImport(imports, req);
|
|
1915
1954
|
return result.chain;
|
|
1916
1955
|
}
|
|
1917
1956
|
const PRISMA_ACTION_MAP = {
|
|
@@ -1921,17 +1960,17 @@ const PRISMA_ACTION_MAP = {
|
|
|
1921
1960
|
NoAction: "no action",
|
|
1922
1961
|
SetDefault: "set default"
|
|
1923
1962
|
};
|
|
1924
|
-
function makeFkReference(field, model) {
|
|
1963
|
+
function makeFkReference(field, model, models) {
|
|
1925
1964
|
const relField = model.fields.find((f) => f.kind === "object" && f.relationFromFields && f.relationFromFields.includes(field.name));
|
|
1926
1965
|
if (!(relField?.relationFromFields && relField.relationToFields)) return "";
|
|
1927
1966
|
if (relField.type === model.name) return "";
|
|
1928
|
-
const targetVar =
|
|
1967
|
+
const targetVar = resolveVarNameByType(relField.type, models);
|
|
1929
1968
|
const toCol = relField.relationToFields[0] ?? "id";
|
|
1930
1969
|
const onDelete = relField.relationOnDelete;
|
|
1931
1970
|
const drizzleAction = onDelete ? PRISMA_ACTION_MAP[onDelete] : void 0;
|
|
1932
1971
|
return `.references(() => ${targetVar}.${toCol}${drizzleAction ? `, { onDelete: '${drizzleAction}' }` : ""})`;
|
|
1933
1972
|
}
|
|
1934
|
-
function makeColumn(field, model, provider, imports, enums) {
|
|
1973
|
+
function makeColumn(field, model, models, provider, imports, enums) {
|
|
1935
1974
|
if (field.kind === "object") return null;
|
|
1936
1975
|
if (field.kind === "unsupported") return `// unsupported type: ${field.name}`;
|
|
1937
1976
|
const isAutoincrement = isFieldDefault(field.default) && field.default.name === "autoincrement";
|
|
@@ -1941,7 +1980,7 @@ function makeColumn(field, model, provider, imports, enums) {
|
|
|
1941
1980
|
field.isId && !hasCompositePK ? isAutoincrement && provider === "sqlite" ? ".primaryKey({ autoIncrement: true })" : ".primaryKey()" : "",
|
|
1942
1981
|
field.isRequired && !field.isId && !(isAutoincrement && provider === "postgresql") ? ".notNull()" : "",
|
|
1943
1982
|
field.isUnique ? ".unique()" : "",
|
|
1944
|
-
makeFkReference(field, model),
|
|
1983
|
+
makeFkReference(field, model, models),
|
|
1945
1984
|
isAutoincrement ? provider === "mysql" ? ".autoincrement()" : "" : field.isUpdatedAt && (field.default === void 0 || field.default === null) ? (() => {
|
|
1946
1985
|
const r = resolveUpdatedAtDefault(provider);
|
|
1947
1986
|
if (r.needsSql) imports.orm.add("sql");
|
|
@@ -1972,18 +2011,18 @@ function makeCompositeConstraints(model, imports, indexes, tableName) {
|
|
|
1972
2011
|
].filter((l) => l !== null);
|
|
1973
2012
|
return all.length > 0 ? all.join(", ") : null;
|
|
1974
2013
|
}
|
|
1975
|
-
function makeTable(model, provider, imports, enums, indexes) {
|
|
2014
|
+
function makeTable(model, models, provider, imports, enums, indexes) {
|
|
1976
2015
|
const tableFunc = provider === "postgresql" ? "pgTable" : provider === "mysql" ? "mysqlTable" : "sqliteTable";
|
|
1977
2016
|
imports.core.add(tableFunc);
|
|
1978
|
-
const varName =
|
|
1979
|
-
const tableName =
|
|
1980
|
-
const columns = model.fields.map((field) => makeColumn(field, model, provider, imports, enums)).filter((c) => c !== null).join(", ");
|
|
2017
|
+
const varName = resolveVarName(model);
|
|
2018
|
+
const tableName = resolveTableName(model);
|
|
2019
|
+
const columns = model.fields.map((field) => makeColumn(field, model, models, provider, imports, enums)).filter((c) => c !== null).join(", ");
|
|
1981
2020
|
const constraints = makeCompositeConstraints(model, imports, indexes, tableName);
|
|
1982
2021
|
return constraints ? `export const ${varName} = ${tableFunc}('${tableName}', { ${columns} }, (table) => [${constraints}])` : `export const ${varName} = ${tableFunc}('${tableName}', { ${columns} })`;
|
|
1983
2022
|
}
|
|
1984
|
-
function makeRelationField(field, model,
|
|
1985
|
-
const targetVar =
|
|
1986
|
-
const modelVar =
|
|
2023
|
+
function makeRelationField(field, model, models, relFields) {
|
|
2024
|
+
const targetVar = resolveVarNameByType(field.type, models);
|
|
2025
|
+
const modelVar = resolveVarName(model);
|
|
1987
2026
|
const needsAlias = relFields.filter((f) => f.type === field.type).length > 1 && field.relationName;
|
|
1988
2027
|
if (field.relationFromFields && field.relationFromFields.length > 0) {
|
|
1989
2028
|
const fromCol = field.relationFromFields[0];
|
|
@@ -2005,7 +2044,7 @@ function makeRelations(models, imports) {
|
|
|
2005
2044
|
return modelsWithRels.map((model) => {
|
|
2006
2045
|
const relFields = model.fields.filter((f) => f.kind === "object");
|
|
2007
2046
|
const fieldLines = relFields.map((field) => makeRelationField(field, model, models, relFields)).join(", ");
|
|
2008
|
-
const modelVar =
|
|
2047
|
+
const modelVar = resolveVarName(model);
|
|
2009
2048
|
const needsOne = relFields.some((f) => f.relationFromFields && f.relationFromFields.length > 0 || !f.isList);
|
|
2010
2049
|
const needsMany = relFields.some((f) => f.isList && !(f.relationFromFields && f.relationFromFields.length > 0));
|
|
2011
2050
|
return `export const ${modelVar}Relations = relations(${modelVar}, ({ ${[needsOne ? "one" : "", needsMany ? "many" : ""].filter(Boolean).join(", ")} }) => ({ ${fieldLines} }))`;
|
|
@@ -2016,7 +2055,7 @@ function makeRelations(models, imports) {
|
|
|
2016
2055
|
function drizzleSchema(datamodel, provider, indexes) {
|
|
2017
2056
|
const db = resolveDbProvider(provider);
|
|
2018
2057
|
const imports = createImports();
|
|
2019
|
-
const tableLines = datamodel.models.map((model) => makeTable(model, db, imports, datamodel.enums, indexes));
|
|
2058
|
+
const tableLines = datamodel.models.map((model) => makeTable(model, datamodel.models, db, imports, datamodel.enums, indexes));
|
|
2020
2059
|
const relationsLines = makeRelations(datamodel.models, imports);
|
|
2021
2060
|
const tableLinesWithGap = tableLines.flatMap((line, i) => i < tableLines.length - 1 ? [line, ""] : [line]);
|
|
2022
2061
|
const relationsLinesWithGap = relationsLines.flatMap((line, i) => i < relationsLines.length - 1 ? [line, ""] : [line]);
|
|
@@ -2564,7 +2603,7 @@ function collectCompositeIndexTags(model, indexes) {
|
|
|
2564
2603
|
return map;
|
|
2565
2604
|
}, /* @__PURE__ */ new Map());
|
|
2566
2605
|
}
|
|
2567
|
-
const GO_INITIALISMS = new Set([
|
|
2606
|
+
const GO_INITIALISMS = /* @__PURE__ */ new Set([
|
|
2568
2607
|
"acl",
|
|
2569
2608
|
"api",
|
|
2570
2609
|
"ascii",
|
|
@@ -2735,8 +2774,8 @@ const RELATIONSHIPS = {
|
|
|
2735
2774
|
"zero-many": "}o",
|
|
2736
2775
|
many: "}|"
|
|
2737
2776
|
};
|
|
2738
|
-
function erRelationLine(relation) {
|
|
2739
|
-
return ` ${relation.from.model} ${RELATIONSHIPS[relation.from.cardinality]}--${RELATIONSHIPS[relation.to.cardinality]} ${relation.to.model} : "(${relation.from.field}) - (${relation.to.field})"`;
|
|
2777
|
+
function erRelationLine(relation, resolveName = (model) => model) {
|
|
2778
|
+
return ` ${resolveName(relation.from.model)} ${RELATIONSHIPS[relation.from.cardinality]}--${RELATIONSHIPS[relation.to.cardinality]} ${resolveName(relation.to.model)} : "(${relation.from.field}) - (${relation.to.field})"`;
|
|
2740
2779
|
}
|
|
2741
2780
|
function modelFields(model) {
|
|
2742
2781
|
const fkFields = new Set(model.fields.filter((f) => f.relationFromFields && f.relationFromFields.length > 0).flatMap((f) => f.relationFromFields ?? []));
|
|
@@ -2750,7 +2789,7 @@ function modelFields(model) {
|
|
|
2750
2789
|
}
|
|
2751
2790
|
function modelInfo(model) {
|
|
2752
2791
|
return [
|
|
2753
|
-
` ${model.name} {`,
|
|
2792
|
+
` ${model.dbName ?? model.name} {`,
|
|
2754
2793
|
...modelFields(model),
|
|
2755
2794
|
" }"
|
|
2756
2795
|
];
|
|
@@ -2760,7 +2799,8 @@ function modelInfo(model) {
|
|
|
2760
2799
|
const ER_HEADER = ["```mermaid", "erDiagram"];
|
|
2761
2800
|
const ER_FOOTER = ["```"];
|
|
2762
2801
|
function erContent(models) {
|
|
2763
|
-
const
|
|
2802
|
+
const resolveName = (model) => models.find((m) => m.name === model)?.dbName ?? model;
|
|
2803
|
+
const relations = mergeERRelations(models).map((relation) => erRelationLine(relation, resolveName));
|
|
2764
2804
|
const modelInfos = models.flatMap(modelInfo);
|
|
2765
2805
|
return [
|
|
2766
2806
|
...ER_HEADER,
|
|
@@ -2932,7 +2972,7 @@ function toPascalCase(name) {
|
|
|
2932
2972
|
function toModuleName(modelName) {
|
|
2933
2973
|
return toSnakeCase(modelName);
|
|
2934
2974
|
}
|
|
2935
|
-
const NON_EQ_PRISMA_TYPES = new Set(["Float"]);
|
|
2975
|
+
const NON_EQ_PRISMA_TYPES = /* @__PURE__ */ new Set(["Float"]);
|
|
2936
2976
|
function canDeriveEq(fields) {
|
|
2937
2977
|
return fields.filter((f) => f.kind !== "object").every((f) => !NON_EQ_PRISMA_TYPES.has(f.type));
|
|
2938
2978
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hekireki",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.6",
|
|
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",
|
|
@@ -55,28 +55,28 @@
|
|
|
55
55
|
"access": "public"
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@hono/node-server": "^2.0.
|
|
58
|
+
"@hono/node-server": "^2.0.6",
|
|
59
59
|
"@prisma/generator-helper": "^7.8.0",
|
|
60
60
|
"@resvg/resvg-js": "^2.6.2",
|
|
61
61
|
"@softwaretechnik/dbml-renderer": "^1.0.31",
|
|
62
|
-
"hono": "^4.12.
|
|
63
|
-
"oxfmt": "^0.
|
|
62
|
+
"hono": "^4.12.27",
|
|
63
|
+
"oxfmt": "^0.56.0"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@paralleldrive/cuid2": "^3.3.0",
|
|
67
67
|
"@prisma/client": "^7.8.0",
|
|
68
68
|
"@sinclair/typebox": "^0.34.49",
|
|
69
|
-
"@types/node": "^
|
|
70
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
69
|
+
"@types/node": "^26.0.1",
|
|
70
|
+
"@typescript/native-preview": "7.0.0-dev.20260624.1",
|
|
71
71
|
"ajv": "^8.20.0",
|
|
72
|
-
"arktype": "^2.2.
|
|
73
|
-
"better-auth": "^1.6.
|
|
72
|
+
"arktype": "^2.2.1",
|
|
73
|
+
"better-auth": "^1.6.20",
|
|
74
74
|
"drizzle-kit": "^0.31.10",
|
|
75
75
|
"drizzle-orm": "^0.45.2",
|
|
76
|
-
"effect": "^3.21.
|
|
76
|
+
"effect": "^3.21.4",
|
|
77
77
|
"json-schema-to-ts": "^3.1.1",
|
|
78
78
|
"prisma": "^7.8.0",
|
|
79
|
-
"tsdown": "^0.22.
|
|
79
|
+
"tsdown": "^0.22.3",
|
|
80
80
|
"tsx": "^4.22.4",
|
|
81
81
|
"typescript": "^6.0.3",
|
|
82
82
|
"valibot": "1.4.1",
|