@nonsoo/prisma-mermaid 0.1.3 → 0.2.0

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 CHANGED
@@ -79,10 +79,7 @@ import {
79
79
  const config = {
80
80
  type: "mermaid-erd",
81
81
  config: {
82
- type: "mermaid-erd",
83
- config: {
84
- layout: "elk",
85
- },
82
+ layout: "elk",
86
83
  },
87
84
  } satisfies MermaidDiagramConfig;
88
85
 
package/build/index.cjs CHANGED
@@ -47,11 +47,12 @@ var mermaidERDiagramConfig = {
47
47
  theme: "neutral",
48
48
  layout: "dagre",
49
49
  look: "classic",
50
+ panZoom: true,
50
51
  themeVariables: {
51
52
  fontSize: "20px",
52
53
  fontFamily: "Arial",
53
54
  padding: "12px",
54
- lineHeight: "1.4"
55
+ lineHeight: 1.4
55
56
  },
56
57
  flowchart: {
57
58
  nodeSpacing: 80,
@@ -63,9 +64,10 @@ var mermaidClassDiagramConfig = {
63
64
  theme: "neutral",
64
65
  layout: "dagre",
65
66
  look: "classic",
67
+ panZoom: true,
66
68
  themeVariables: {
67
69
  fontFamily: "Arial",
68
- lineHeight: "1.4"
70
+ lineHeight: 1.4
69
71
  },
70
72
  flowchart: {
71
73
  nodeSpacing: 300,
@@ -78,6 +80,7 @@ var mermaidClassDiagramConfig = {
78
80
  };
79
81
 
80
82
  // src/utils/mermaid.ts
83
+ var import_js_yaml = require("js-yaml");
81
84
  var generateDiagramSpacing = ({
82
85
  baseEdge,
83
86
  baseNode,
@@ -106,8 +109,17 @@ var generateMermaidConfig = (config, models) => {
106
109
  nodeSpacing
107
110
  };
108
111
  }
109
- const json = JSON.stringify(config, null, 2);
110
- return `%%{init: ${json}}%%
112
+ const { title, ...rest } = config;
113
+ const diagramConfig = {
114
+ config: rest,
115
+ ...title ? { title } : {}
116
+ };
117
+ const yamlString = (0, import_js_yaml.dump)(diagramConfig, {
118
+ indent: 2,
119
+ lineWidth: 1e3
120
+ });
121
+ return `---
122
+ ${yamlString}---
111
123
  `;
112
124
  };
113
125
 
@@ -189,17 +201,17 @@ var generateDiagram = async ({
189
201
  ...userGeneratedConfig
190
202
  };
191
203
  const mermaidLines = [
204
+ generateMermaidConfig(diagramConfig, models),
192
205
  "%% --------------------------------------------",
193
206
  "%% Auto-generated Mermaid Class Diagram. Do Not Edit Directly.",
194
207
  "%% --------------------------------------------\n",
195
- generateMermaidConfig(diagramConfig, models),
196
208
  "classDiagram"
197
209
  ];
198
210
  const relationships = {};
199
211
  models.forEach((model) => {
200
- mermaidLines.push(`class ${model.name} {`);
212
+ mermaidLines.push(` class ${model.name} {`);
201
213
  model.fields.forEach((field) => {
202
- mermaidLines.push(` ${field.type} ${field.name}`);
214
+ mermaidLines.push(` ${field.type} ${field.name}`);
203
215
  if (field.relationName) {
204
216
  if (!relationships[field.relationName]) {
205
217
  relationships[field.relationName] = [];
@@ -212,21 +224,21 @@ var generateDiagram = async ({
212
224
  });
213
225
  }
214
226
  });
215
- mermaidLines.push("}");
227
+ mermaidLines.push(" }");
216
228
  });
217
229
  enums.forEach((enumDef) => {
218
- mermaidLines.push(`class ${enumDef.name} {`);
230
+ mermaidLines.push(` class ${enumDef.name} {`);
219
231
  enumDef.values.forEach((val) => {
220
- mermaidLines.push(` <<enumeration>> ${val.name}`);
232
+ mermaidLines.push(` <<enumeration>> ${val.name}`);
221
233
  });
222
- mermaidLines.push("}");
234
+ mermaidLines.push(" }");
223
235
  });
224
236
  const relationLines = generateRelationships({ relationships });
225
237
  const output = mermaidLines.concat(relationLines).join("\n");
226
238
  (0, import_node_fs.mkdirSync)(outputDir, { recursive: true });
227
239
  const outFile = import_node_path.default.join(outputDir, "mermaidClassDiagram.mmd");
228
240
  (0, import_node_fs.writeFileSync)(outFile, output, "utf-8");
229
- console.log(`Mermaid Class Diagram written to: ${outFile}`);
241
+ console.log(`Mermaid Class Diagram generated at: ${outFile}`);
230
242
  return outFile;
231
243
  } catch (e) {
232
244
  console.error("Failed to generate Mermaid Class Diagram.", e);
@@ -250,14 +262,8 @@ var generateCardinality2 = ({
250
262
  }
251
263
  return isRequired ? "||" : "o|";
252
264
  };
253
- var getKeyConstraints = (isId, fieldName, foreignKeys, nativeTypes) => {
265
+ var getKeyConstraints = (isId, fieldName, foreignKeys) => {
254
266
  if (isId) return "PK";
255
- if (nativeTypes) {
256
- const allNativeTypes = nativeTypes.flatMap((nativeType) => nativeType);
257
- if (!isId && allNativeTypes.includes("UniqueIdentifier")) {
258
- return "FK";
259
- }
260
- }
261
267
  if (!isId && foreignKeys.has(fieldName)) return "FK";
262
268
  return "";
263
269
  };
@@ -352,10 +358,10 @@ var generateDiagram2 = async ({
352
358
  ...userGeneratedConfig
353
359
  };
354
360
  const mermaidLines = [
361
+ generateMermaidConfig(diagramConfig, schemaModels),
355
362
  "%% --------------------------------------------",
356
363
  "%% Auto-generated Mermaid ER Diagram. Do Not Edit Directly.",
357
364
  "%% --------------------------------------------\n",
358
- generateMermaidConfig(diagramConfig, schemaModels),
359
365
  "erDiagram"
360
366
  ];
361
367
  const relationships = {};
@@ -373,8 +379,7 @@ var generateDiagram2 = async ({
373
379
  ` ${field.type} ${field.name} ${getKeyConstraints(
374
380
  field.isId,
375
381
  field.name,
376
- foreignKeys,
377
- field.nativeType
382
+ foreignKeys
378
383
  )} ${getOptionalitySymbol(field.isRequired)}`
379
384
  );
380
385
  foreignKeyLocation.set(field.name, mermaidLines.length - 1);
package/build/index.d.cts CHANGED
@@ -7,7 +7,7 @@ type ConfigThemeVariables = {
7
7
  fontSize: `${number}px`;
8
8
  fontFamily: string;
9
9
  padding: `${number}px`;
10
- lineHeight: string;
10
+ lineHeight: number;
11
11
  nodeSpacing: number;
12
12
  edgeSpacing: number;
13
13
  };
@@ -22,8 +22,10 @@ type MermaidERDiagramConfig = {
22
22
  theme: ConfigTheme;
23
23
  layout: ConfigLayout;
24
24
  look: ConfigLook;
25
+ panZoom: boolean;
25
26
  themeVariables: Partial<ConfigThemeVariables>;
26
27
  flowchart: Partial<ConfigFlowchart>;
28
+ title: string;
27
29
  }>;
28
30
  };
29
31
  type MermaidClassDiagramConfig = {
@@ -34,9 +36,11 @@ type MermaidClassDiagramConfig = {
34
36
  look: ConfigLook;
35
37
  themeVariables: Partial<ConfigThemeVariables>;
36
38
  flowchart: Partial<ConfigFlowchart>;
39
+ panZoom: boolean;
37
40
  class: Partial<{
38
41
  hideEmptyMembersBox: boolean;
39
42
  }>;
43
+ title: string;
40
44
  }>;
41
45
  };
42
46
  type MermaidDiagramConfig = MermaidERDiagramConfig | MermaidClassDiagramConfig;
package/build/index.d.ts CHANGED
@@ -7,7 +7,7 @@ type ConfigThemeVariables = {
7
7
  fontSize: `${number}px`;
8
8
  fontFamily: string;
9
9
  padding: `${number}px`;
10
- lineHeight: string;
10
+ lineHeight: number;
11
11
  nodeSpacing: number;
12
12
  edgeSpacing: number;
13
13
  };
@@ -22,8 +22,10 @@ type MermaidERDiagramConfig = {
22
22
  theme: ConfigTheme;
23
23
  layout: ConfigLayout;
24
24
  look: ConfigLook;
25
+ panZoom: boolean;
25
26
  themeVariables: Partial<ConfigThemeVariables>;
26
27
  flowchart: Partial<ConfigFlowchart>;
28
+ title: string;
27
29
  }>;
28
30
  };
29
31
  type MermaidClassDiagramConfig = {
@@ -34,9 +36,11 @@ type MermaidClassDiagramConfig = {
34
36
  look: ConfigLook;
35
37
  themeVariables: Partial<ConfigThemeVariables>;
36
38
  flowchart: Partial<ConfigFlowchart>;
39
+ panZoom: boolean;
37
40
  class: Partial<{
38
41
  hideEmptyMembersBox: boolean;
39
42
  }>;
43
+ title: string;
40
44
  }>;
41
45
  };
42
46
  type MermaidDiagramConfig = MermaidERDiagramConfig | MermaidClassDiagramConfig;
package/build/index.js CHANGED
@@ -10,11 +10,12 @@ var mermaidERDiagramConfig = {
10
10
  theme: "neutral",
11
11
  layout: "dagre",
12
12
  look: "classic",
13
+ panZoom: true,
13
14
  themeVariables: {
14
15
  fontSize: "20px",
15
16
  fontFamily: "Arial",
16
17
  padding: "12px",
17
- lineHeight: "1.4"
18
+ lineHeight: 1.4
18
19
  },
19
20
  flowchart: {
20
21
  nodeSpacing: 80,
@@ -26,9 +27,10 @@ var mermaidClassDiagramConfig = {
26
27
  theme: "neutral",
27
28
  layout: "dagre",
28
29
  look: "classic",
30
+ panZoom: true,
29
31
  themeVariables: {
30
32
  fontFamily: "Arial",
31
- lineHeight: "1.4"
33
+ lineHeight: 1.4
32
34
  },
33
35
  flowchart: {
34
36
  nodeSpacing: 300,
@@ -41,6 +43,7 @@ var mermaidClassDiagramConfig = {
41
43
  };
42
44
 
43
45
  // src/utils/mermaid.ts
46
+ import { dump } from "js-yaml";
44
47
  var generateDiagramSpacing = ({
45
48
  baseEdge,
46
49
  baseNode,
@@ -69,8 +72,17 @@ var generateMermaidConfig = (config, models) => {
69
72
  nodeSpacing
70
73
  };
71
74
  }
72
- const json = JSON.stringify(config, null, 2);
73
- return `%%{init: ${json}}%%
75
+ const { title, ...rest } = config;
76
+ const diagramConfig = {
77
+ config: rest,
78
+ ...title ? { title } : {}
79
+ };
80
+ const yamlString = dump(diagramConfig, {
81
+ indent: 2,
82
+ lineWidth: 1e3
83
+ });
84
+ return `---
85
+ ${yamlString}---
74
86
  `;
75
87
  };
76
88
 
@@ -152,17 +164,17 @@ var generateDiagram = async ({
152
164
  ...userGeneratedConfig
153
165
  };
154
166
  const mermaidLines = [
167
+ generateMermaidConfig(diagramConfig, models),
155
168
  "%% --------------------------------------------",
156
169
  "%% Auto-generated Mermaid Class Diagram. Do Not Edit Directly.",
157
170
  "%% --------------------------------------------\n",
158
- generateMermaidConfig(diagramConfig, models),
159
171
  "classDiagram"
160
172
  ];
161
173
  const relationships = {};
162
174
  models.forEach((model) => {
163
- mermaidLines.push(`class ${model.name} {`);
175
+ mermaidLines.push(` class ${model.name} {`);
164
176
  model.fields.forEach((field) => {
165
- mermaidLines.push(` ${field.type} ${field.name}`);
177
+ mermaidLines.push(` ${field.type} ${field.name}`);
166
178
  if (field.relationName) {
167
179
  if (!relationships[field.relationName]) {
168
180
  relationships[field.relationName] = [];
@@ -175,21 +187,21 @@ var generateDiagram = async ({
175
187
  });
176
188
  }
177
189
  });
178
- mermaidLines.push("}");
190
+ mermaidLines.push(" }");
179
191
  });
180
192
  enums.forEach((enumDef) => {
181
- mermaidLines.push(`class ${enumDef.name} {`);
193
+ mermaidLines.push(` class ${enumDef.name} {`);
182
194
  enumDef.values.forEach((val) => {
183
- mermaidLines.push(` <<enumeration>> ${val.name}`);
195
+ mermaidLines.push(` <<enumeration>> ${val.name}`);
184
196
  });
185
- mermaidLines.push("}");
197
+ mermaidLines.push(" }");
186
198
  });
187
199
  const relationLines = generateRelationships({ relationships });
188
200
  const output = mermaidLines.concat(relationLines).join("\n");
189
201
  mkdirSync(outputDir, { recursive: true });
190
202
  const outFile = path.join(outputDir, "mermaidClassDiagram.mmd");
191
203
  writeFileSync(outFile, output, "utf-8");
192
- console.log(`Mermaid Class Diagram written to: ${outFile}`);
204
+ console.log(`Mermaid Class Diagram generated at: ${outFile}`);
193
205
  return outFile;
194
206
  } catch (e) {
195
207
  console.error("Failed to generate Mermaid Class Diagram.", e);
@@ -213,14 +225,8 @@ var generateCardinality2 = ({
213
225
  }
214
226
  return isRequired ? "||" : "o|";
215
227
  };
216
- var getKeyConstraints = (isId, fieldName, foreignKeys, nativeTypes) => {
228
+ var getKeyConstraints = (isId, fieldName, foreignKeys) => {
217
229
  if (isId) return "PK";
218
- if (nativeTypes) {
219
- const allNativeTypes = nativeTypes.flatMap((nativeType) => nativeType);
220
- if (!isId && allNativeTypes.includes("UniqueIdentifier")) {
221
- return "FK";
222
- }
223
- }
224
230
  if (!isId && foreignKeys.has(fieldName)) return "FK";
225
231
  return "";
226
232
  };
@@ -315,10 +321,10 @@ var generateDiagram2 = async ({
315
321
  ...userGeneratedConfig
316
322
  };
317
323
  const mermaidLines = [
324
+ generateMermaidConfig(diagramConfig, schemaModels),
318
325
  "%% --------------------------------------------",
319
326
  "%% Auto-generated Mermaid ER Diagram. Do Not Edit Directly.",
320
327
  "%% --------------------------------------------\n",
321
- generateMermaidConfig(diagramConfig, schemaModels),
322
328
  "erDiagram"
323
329
  ];
324
330
  const relationships = {};
@@ -336,8 +342,7 @@ var generateDiagram2 = async ({
336
342
  ` ${field.type} ${field.name} ${getKeyConstraints(
337
343
  field.isId,
338
344
  field.name,
339
- foreignKeys,
340
- field.nativeType
345
+ foreignKeys
341
346
  )} ${getOptionalitySymbol(field.isRequired)}`
342
347
  );
343
348
  foreignKeyLocation.set(field.name, mermaidLines.length - 1);
@@ -1388,11 +1388,12 @@ var mermaidERDiagramConfig = {
1388
1388
  theme: "neutral",
1389
1389
  layout: "dagre",
1390
1390
  look: "classic",
1391
+ panZoom: true,
1391
1392
  themeVariables: {
1392
1393
  fontSize: "20px",
1393
1394
  fontFamily: "Arial",
1394
1395
  padding: "12px",
1395
- lineHeight: "1.4"
1396
+ lineHeight: 1.4
1396
1397
  },
1397
1398
  flowchart: {
1398
1399
  nodeSpacing: 80,
@@ -1404,9 +1405,10 @@ var mermaidClassDiagramConfig = {
1404
1405
  theme: "neutral",
1405
1406
  layout: "dagre",
1406
1407
  look: "classic",
1408
+ panZoom: true,
1407
1409
  themeVariables: {
1408
1410
  fontFamily: "Arial",
1409
- lineHeight: "1.4"
1411
+ lineHeight: 1.4
1410
1412
  },
1411
1413
  flowchart: {
1412
1414
  nodeSpacing: 300,
@@ -1419,6 +1421,7 @@ var mermaidClassDiagramConfig = {
1419
1421
  };
1420
1422
 
1421
1423
  // src/utils/mermaid.ts
1424
+ var import_js_yaml = require("js-yaml");
1422
1425
  var generateDiagramSpacing = ({
1423
1426
  baseEdge,
1424
1427
  baseNode,
@@ -1447,8 +1450,17 @@ var generateMermaidConfig = (config, models) => {
1447
1450
  nodeSpacing
1448
1451
  };
1449
1452
  }
1450
- const json = JSON.stringify(config, null, 2);
1451
- return `%%{init: ${json}}%%
1453
+ const { title, ...rest } = config;
1454
+ const diagramConfig = {
1455
+ config: rest,
1456
+ ...title ? { title } : {}
1457
+ };
1458
+ const yamlString = (0, import_js_yaml.dump)(diagramConfig, {
1459
+ indent: 2,
1460
+ lineWidth: 1e3
1461
+ });
1462
+ return `---
1463
+ ${yamlString}---
1452
1464
  `;
1453
1465
  };
1454
1466
 
@@ -1530,17 +1542,17 @@ var generateDiagram = async ({
1530
1542
  ...userGeneratedConfig
1531
1543
  };
1532
1544
  const mermaidLines = [
1545
+ generateMermaidConfig(diagramConfig, models),
1533
1546
  "%% --------------------------------------------",
1534
1547
  "%% Auto-generated Mermaid Class Diagram. Do Not Edit Directly.",
1535
1548
  "%% --------------------------------------------\n",
1536
- generateMermaidConfig(diagramConfig, models),
1537
1549
  "classDiagram"
1538
1550
  ];
1539
1551
  const relationships = {};
1540
1552
  models.forEach((model) => {
1541
- mermaidLines.push(`class ${model.name} {`);
1553
+ mermaidLines.push(` class ${model.name} {`);
1542
1554
  model.fields.forEach((field) => {
1543
- mermaidLines.push(` ${field.type} ${field.name}`);
1555
+ mermaidLines.push(` ${field.type} ${field.name}`);
1544
1556
  if (field.relationName) {
1545
1557
  if (!relationships[field.relationName]) {
1546
1558
  relationships[field.relationName] = [];
@@ -1553,21 +1565,21 @@ var generateDiagram = async ({
1553
1565
  });
1554
1566
  }
1555
1567
  });
1556
- mermaidLines.push("}");
1568
+ mermaidLines.push(" }");
1557
1569
  });
1558
1570
  enums.forEach((enumDef) => {
1559
- mermaidLines.push(`class ${enumDef.name} {`);
1571
+ mermaidLines.push(` class ${enumDef.name} {`);
1560
1572
  enumDef.values.forEach((val) => {
1561
- mermaidLines.push(` <<enumeration>> ${val.name}`);
1573
+ mermaidLines.push(` <<enumeration>> ${val.name}`);
1562
1574
  });
1563
- mermaidLines.push("}");
1575
+ mermaidLines.push(" }");
1564
1576
  });
1565
1577
  const relationLines = generateRelationships({ relationships });
1566
1578
  const output = mermaidLines.concat(relationLines).join("\n");
1567
1579
  (0, import_node_fs.mkdirSync)(outputDir, { recursive: true });
1568
1580
  const outFile = import_node_path.default.join(outputDir, "mermaidClassDiagram.mmd");
1569
1581
  (0, import_node_fs.writeFileSync)(outFile, output, "utf-8");
1570
- console.log(`Mermaid Class Diagram written to: ${outFile}`);
1582
+ console.log(`Mermaid Class Diagram generated at: ${outFile}`);
1571
1583
  return outFile;
1572
1584
  } catch (e) {
1573
1585
  console.error("Failed to generate Mermaid Class Diagram.", e);
@@ -1591,14 +1603,8 @@ var generateCardinality2 = ({
1591
1603
  }
1592
1604
  return isRequired ? "||" : "o|";
1593
1605
  };
1594
- var getKeyConstraints = (isId, fieldName, foreignKeys, nativeTypes) => {
1606
+ var getKeyConstraints = (isId, fieldName, foreignKeys) => {
1595
1607
  if (isId) return "PK";
1596
- if (nativeTypes) {
1597
- const allNativeTypes = nativeTypes.flatMap((nativeType) => nativeType);
1598
- if (!isId && allNativeTypes.includes("UniqueIdentifier")) {
1599
- return "FK";
1600
- }
1601
- }
1602
1608
  if (!isId && foreignKeys.has(fieldName)) return "FK";
1603
1609
  return "";
1604
1610
  };
@@ -1693,10 +1699,10 @@ var generateDiagram2 = async ({
1693
1699
  ...userGeneratedConfig
1694
1700
  };
1695
1701
  const mermaidLines = [
1702
+ generateMermaidConfig(diagramConfig, schemaModels),
1696
1703
  "%% --------------------------------------------",
1697
1704
  "%% Auto-generated Mermaid ER Diagram. Do Not Edit Directly.",
1698
1705
  "%% --------------------------------------------\n",
1699
- generateMermaidConfig(diagramConfig, schemaModels),
1700
1706
  "erDiagram"
1701
1707
  ];
1702
1708
  const relationships = {};
@@ -1714,8 +1720,7 @@ var generateDiagram2 = async ({
1714
1720
  ` ${field.type} ${field.name} ${getKeyConstraints(
1715
1721
  field.isId,
1716
1722
  field.name,
1717
- foreignKeys,
1718
- field.nativeType
1723
+ foreignKeys
1719
1724
  )} ${getOptionalitySymbol(field.isRequired)}`
1720
1725
  );
1721
1726
  foreignKeyLocation.set(field.name, mermaidLines.length - 1);
@@ -1767,7 +1772,7 @@ var prismaGenerators = /* @__PURE__ */ new Map([
1767
1772
  // package.json
1768
1773
  var package_default = {
1769
1774
  name: "@nonsoo/prisma-mermaid",
1770
- version: "0.1.3",
1775
+ version: "0.2.0",
1771
1776
  description: "A Prisma generator that generates Mermaid Class or ER diagrams from your Prisma schema.",
1772
1777
  main: "build/index.js",
1773
1778
  bin: {
@@ -1817,6 +1822,7 @@ var package_default = {
1817
1822
  devDependencies: {
1818
1823
  "@changesets/cli": "^2.29.7",
1819
1824
  "@eslint/js": "^9.39.1",
1825
+ "@types/js-yaml": "^4.0.9",
1820
1826
  "@types/node": "^24.10.1",
1821
1827
  eslint: "^9.39.1",
1822
1828
  "eslint-config-prettier": "^10.1.8",
@@ -1832,7 +1838,8 @@ var package_default = {
1832
1838
  "@prisma/client": "^6.0.0 || ^7.0.0"
1833
1839
  },
1834
1840
  dependencies: {
1835
- "@prisma/internals": "^7.0.0"
1841
+ "@prisma/internals": "^7.0.0",
1842
+ "js-yaml": "^4.1.1"
1836
1843
  }
1837
1844
  };
1838
1845
 
@@ -1854,12 +1861,12 @@ var package_default = {
1854
1861
  return;
1855
1862
  }
1856
1863
  if (Array.isArray(formats)) {
1857
- for (const format of formats) {
1864
+ for await (const format of formats) {
1858
1865
  const mermaidGenerator2 = prismaGenerators.get(
1859
1866
  format
1860
1867
  );
1861
1868
  if (!mermaidGenerator2) continue;
1862
- mermaidGenerator2({
1869
+ await mermaidGenerator2({
1863
1870
  schemaPath,
1864
1871
  outputPath: outputDir,
1865
1872
  generatorPrismaDocument
@@ -1871,7 +1878,7 @@ var package_default = {
1871
1878
  formats
1872
1879
  );
1873
1880
  if (!mermaidGenerator) return;
1874
- mermaidGenerator({
1881
+ await mermaidGenerator({
1875
1882
  schemaPath,
1876
1883
  outputPath: outputDir,
1877
1884
  generatorPrismaDocument
@@ -1393,11 +1393,12 @@ var mermaidERDiagramConfig = {
1393
1393
  theme: "neutral",
1394
1394
  layout: "dagre",
1395
1395
  look: "classic",
1396
+ panZoom: true,
1396
1397
  themeVariables: {
1397
1398
  fontSize: "20px",
1398
1399
  fontFamily: "Arial",
1399
1400
  padding: "12px",
1400
- lineHeight: "1.4"
1401
+ lineHeight: 1.4
1401
1402
  },
1402
1403
  flowchart: {
1403
1404
  nodeSpacing: 80,
@@ -1409,9 +1410,10 @@ var mermaidClassDiagramConfig = {
1409
1410
  theme: "neutral",
1410
1411
  layout: "dagre",
1411
1412
  look: "classic",
1413
+ panZoom: true,
1412
1414
  themeVariables: {
1413
1415
  fontFamily: "Arial",
1414
- lineHeight: "1.4"
1416
+ lineHeight: 1.4
1415
1417
  },
1416
1418
  flowchart: {
1417
1419
  nodeSpacing: 300,
@@ -1424,6 +1426,7 @@ var mermaidClassDiagramConfig = {
1424
1426
  };
1425
1427
 
1426
1428
  // src/utils/mermaid.ts
1429
+ import { dump } from "js-yaml";
1427
1430
  var generateDiagramSpacing = ({
1428
1431
  baseEdge,
1429
1432
  baseNode,
@@ -1452,8 +1455,17 @@ var generateMermaidConfig = (config, models) => {
1452
1455
  nodeSpacing
1453
1456
  };
1454
1457
  }
1455
- const json = JSON.stringify(config, null, 2);
1456
- return `%%{init: ${json}}%%
1458
+ const { title, ...rest } = config;
1459
+ const diagramConfig = {
1460
+ config: rest,
1461
+ ...title ? { title } : {}
1462
+ };
1463
+ const yamlString = dump(diagramConfig, {
1464
+ indent: 2,
1465
+ lineWidth: 1e3
1466
+ });
1467
+ return `---
1468
+ ${yamlString}---
1457
1469
  `;
1458
1470
  };
1459
1471
 
@@ -1535,17 +1547,17 @@ var generateDiagram = async ({
1535
1547
  ...userGeneratedConfig
1536
1548
  };
1537
1549
  const mermaidLines = [
1550
+ generateMermaidConfig(diagramConfig, models),
1538
1551
  "%% --------------------------------------------",
1539
1552
  "%% Auto-generated Mermaid Class Diagram. Do Not Edit Directly.",
1540
1553
  "%% --------------------------------------------\n",
1541
- generateMermaidConfig(diagramConfig, models),
1542
1554
  "classDiagram"
1543
1555
  ];
1544
1556
  const relationships = {};
1545
1557
  models.forEach((model) => {
1546
- mermaidLines.push(`class ${model.name} {`);
1558
+ mermaidLines.push(` class ${model.name} {`);
1547
1559
  model.fields.forEach((field) => {
1548
- mermaidLines.push(` ${field.type} ${field.name}`);
1560
+ mermaidLines.push(` ${field.type} ${field.name}`);
1549
1561
  if (field.relationName) {
1550
1562
  if (!relationships[field.relationName]) {
1551
1563
  relationships[field.relationName] = [];
@@ -1558,21 +1570,21 @@ var generateDiagram = async ({
1558
1570
  });
1559
1571
  }
1560
1572
  });
1561
- mermaidLines.push("}");
1573
+ mermaidLines.push(" }");
1562
1574
  });
1563
1575
  enums.forEach((enumDef) => {
1564
- mermaidLines.push(`class ${enumDef.name} {`);
1576
+ mermaidLines.push(` class ${enumDef.name} {`);
1565
1577
  enumDef.values.forEach((val) => {
1566
- mermaidLines.push(` <<enumeration>> ${val.name}`);
1578
+ mermaidLines.push(` <<enumeration>> ${val.name}`);
1567
1579
  });
1568
- mermaidLines.push("}");
1580
+ mermaidLines.push(" }");
1569
1581
  });
1570
1582
  const relationLines = generateRelationships({ relationships });
1571
1583
  const output = mermaidLines.concat(relationLines).join("\n");
1572
1584
  mkdirSync(outputDir, { recursive: true });
1573
1585
  const outFile = path.join(outputDir, "mermaidClassDiagram.mmd");
1574
1586
  writeFileSync(outFile, output, "utf-8");
1575
- console.log(`Mermaid Class Diagram written to: ${outFile}`);
1587
+ console.log(`Mermaid Class Diagram generated at: ${outFile}`);
1576
1588
  return outFile;
1577
1589
  } catch (e) {
1578
1590
  console.error("Failed to generate Mermaid Class Diagram.", e);
@@ -1596,14 +1608,8 @@ var generateCardinality2 = ({
1596
1608
  }
1597
1609
  return isRequired ? "||" : "o|";
1598
1610
  };
1599
- var getKeyConstraints = (isId, fieldName, foreignKeys, nativeTypes) => {
1611
+ var getKeyConstraints = (isId, fieldName, foreignKeys) => {
1600
1612
  if (isId) return "PK";
1601
- if (nativeTypes) {
1602
- const allNativeTypes = nativeTypes.flatMap((nativeType) => nativeType);
1603
- if (!isId && allNativeTypes.includes("UniqueIdentifier")) {
1604
- return "FK";
1605
- }
1606
- }
1607
1613
  if (!isId && foreignKeys.has(fieldName)) return "FK";
1608
1614
  return "";
1609
1615
  };
@@ -1698,10 +1704,10 @@ var generateDiagram2 = async ({
1698
1704
  ...userGeneratedConfig
1699
1705
  };
1700
1706
  const mermaidLines = [
1707
+ generateMermaidConfig(diagramConfig, schemaModels),
1701
1708
  "%% --------------------------------------------",
1702
1709
  "%% Auto-generated Mermaid ER Diagram. Do Not Edit Directly.",
1703
1710
  "%% --------------------------------------------\n",
1704
- generateMermaidConfig(diagramConfig, schemaModels),
1705
1711
  "erDiagram"
1706
1712
  ];
1707
1713
  const relationships = {};
@@ -1719,8 +1725,7 @@ var generateDiagram2 = async ({
1719
1725
  ` ${field.type} ${field.name} ${getKeyConstraints(
1720
1726
  field.isId,
1721
1727
  field.name,
1722
- foreignKeys,
1723
- field.nativeType
1728
+ foreignKeys
1724
1729
  )} ${getOptionalitySymbol(field.isRequired)}`
1725
1730
  );
1726
1731
  foreignKeyLocation.set(field.name, mermaidLines.length - 1);
@@ -1772,7 +1777,7 @@ var prismaGenerators = /* @__PURE__ */ new Map([
1772
1777
  // package.json
1773
1778
  var package_default = {
1774
1779
  name: "@nonsoo/prisma-mermaid",
1775
- version: "0.1.3",
1780
+ version: "0.2.0",
1776
1781
  description: "A Prisma generator that generates Mermaid Class or ER diagrams from your Prisma schema.",
1777
1782
  main: "build/index.js",
1778
1783
  bin: {
@@ -1822,6 +1827,7 @@ var package_default = {
1822
1827
  devDependencies: {
1823
1828
  "@changesets/cli": "^2.29.7",
1824
1829
  "@eslint/js": "^9.39.1",
1830
+ "@types/js-yaml": "^4.0.9",
1825
1831
  "@types/node": "^24.10.1",
1826
1832
  eslint: "^9.39.1",
1827
1833
  "eslint-config-prettier": "^10.1.8",
@@ -1837,7 +1843,8 @@ var package_default = {
1837
1843
  "@prisma/client": "^6.0.0 || ^7.0.0"
1838
1844
  },
1839
1845
  dependencies: {
1840
- "@prisma/internals": "^7.0.0"
1846
+ "@prisma/internals": "^7.0.0",
1847
+ "js-yaml": "^4.1.1"
1841
1848
  }
1842
1849
  };
1843
1850
 
@@ -1859,12 +1866,12 @@ var package_default = {
1859
1866
  return;
1860
1867
  }
1861
1868
  if (Array.isArray(formats)) {
1862
- for (const format of formats) {
1869
+ for await (const format of formats) {
1863
1870
  const mermaidGenerator2 = prismaGenerators.get(
1864
1871
  format
1865
1872
  );
1866
1873
  if (!mermaidGenerator2) continue;
1867
- mermaidGenerator2({
1874
+ await mermaidGenerator2({
1868
1875
  schemaPath,
1869
1876
  outputPath: outputDir,
1870
1877
  generatorPrismaDocument
@@ -1876,7 +1883,7 @@ var package_default = {
1876
1883
  formats
1877
1884
  );
1878
1885
  if (!mermaidGenerator) return;
1879
- mermaidGenerator({
1886
+ await mermaidGenerator({
1880
1887
  schemaPath,
1881
1888
  outputPath: outputDir,
1882
1889
  generatorPrismaDocument
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@nonsoo/prisma-mermaid",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "A Prisma generator that generates Mermaid Class or ER diagrams from your Prisma schema.",
5
5
  "main": "build/index.js",
6
6
  "bin": {
7
- "prisma-mermaid": "./build/lib/PrismaMermaidGenerators/bin.cjs"
7
+ "prisma-mermaid": "build/lib/PrismaMermaidGenerators/bin.cjs"
8
8
  },
9
9
  "types": "build/lib/PrismaMermaidGenerators/index.d.js",
10
10
  "files": [
@@ -34,7 +34,7 @@
34
34
  "type": "module",
35
35
  "repository": {
36
36
  "type": "git",
37
- "url": "https://github.com/nonsoo/prisma-mermaid.git"
37
+ "url": "git+https://github.com/nonsoo/prisma-mermaid.git"
38
38
  },
39
39
  "engines": {
40
40
  "node": ">=22.0.0"
@@ -50,6 +50,7 @@
50
50
  "devDependencies": {
51
51
  "@changesets/cli": "^2.29.7",
52
52
  "@eslint/js": "^9.39.1",
53
+ "@types/js-yaml": "^4.0.9",
53
54
  "@types/node": "^24.10.1",
54
55
  "eslint": "^9.39.1",
55
56
  "eslint-config-prettier": "^10.1.8",
@@ -65,6 +66,7 @@
65
66
  "@prisma/client": "^6.0.0 || ^7.0.0"
66
67
  },
67
68
  "dependencies": {
68
- "@prisma/internals": "^7.0.0"
69
+ "@prisma/internals": "^7.0.0",
70
+ "js-yaml": "^4.1.1"
69
71
  }
70
72
  }