@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 +1 -4
- package/build/index.cjs +27 -22
- package/build/index.d.cts +5 -1
- package/build/index.d.ts +5 -1
- package/build/index.js +27 -22
- package/build/lib/PrismaMermaidGenerators/bin.cjs +34 -27
- package/build/lib/PrismaMermaidGenerators/bin.js +34 -27
- package/package.json +6 -4
package/README.md
CHANGED
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:
|
|
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:
|
|
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
|
|
110
|
-
|
|
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(`
|
|
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(`
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
73
|
-
|
|
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(`
|
|
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(`
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
1451
|
-
|
|
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(`
|
|
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(`
|
|
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
|
|
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
|
|
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.
|
|
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:
|
|
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:
|
|
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
|
|
1456
|
-
|
|
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(`
|
|
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(`
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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": "
|
|
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
|
}
|