ts-prorm-orm 1.2.2 → 2.0.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/CHANGELOG.md +209 -0
- package/README.md +32 -24
- package/dist/compliance/index.d.ts +2 -0
- package/dist/compliance/index.js +13 -1
- package/dist/connection-manager.js +13 -1
- package/dist/core/expressions.d.ts +58 -0
- package/dist/core/expressions.js +83 -0
- package/dist/core/hooks-manager.d.ts +179 -0
- package/dist/core/hooks-manager.js +291 -0
- package/dist/core/types.d.ts +235 -0
- package/dist/core/types.js +9 -0
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.js +11 -1
- package/dist/diagrams/chen-diagram.d.ts +15 -12
- package/dist/diagrams/chen-diagram.js +76 -85
- package/dist/diagrams/class-diagram.d.ts +9 -8
- package/dist/diagrams/class-diagram.js +60 -82
- package/dist/diagrams/core/index.d.ts +13 -0
- package/dist/diagrams/core/index.js +33 -0
- package/dist/diagrams/core/layout.d.ts +104 -0
- package/dist/diagrams/core/layout.js +223 -0
- package/dist/diagrams/{svg-dom.d.ts → core/svg.d.ts} +8 -20
- package/dist/diagrams/{svg-dom.js → core/svg.js} +21 -29
- package/dist/diagrams/core/theme.d.ts +84 -0
- package/dist/diagrams/core/theme.js +62 -0
- package/dist/diagrams/dependency-diagram.d.ts +15 -14
- package/dist/diagrams/dependency-diagram.js +71 -105
- package/dist/diagrams/er-diagram.d.ts +13 -26
- package/dist/diagrams/er-diagram.js +180 -259
- package/dist/diagrams/flow-diagram.d.ts +16 -11
- package/dist/diagrams/flow-diagram.js +96 -91
- package/dist/diagrams/gantt-diagram.d.ts +10 -5
- package/dist/diagrams/gantt-diagram.js +77 -103
- package/dist/diagrams/index-diagram.d.ts +10 -10
- package/dist/diagrams/index-diagram.js +106 -116
- package/dist/diagrams/index.d.ts +6 -9
- package/dist/diagrams/index.js +9 -24
- package/dist/diagrams/migration-diagram.d.ts +8 -4
- package/dist/diagrams/migration-diagram.js +189 -161
- package/dist/diagrams/model-diagram.d.ts +34 -34
- package/dist/diagrams/model-diagram.js +106 -485
- package/dist/diagrams/package-diagram.d.ts +9 -6
- package/dist/diagrams/package-diagram.js +64 -101
- package/dist/diagrams/relational-diagram.d.ts +12 -10
- package/dist/diagrams/relational-diagram.js +87 -114
- package/dist/diagrams/schemadoc-diagram.d.ts +8 -8
- package/dist/diagrams/schemadoc-diagram.js +71 -93
- package/dist/diagrams/sequence-diagram.d.ts +10 -10
- package/dist/diagrams/sequence-diagram.js +64 -89
- package/dist/diagrams/state-diagram.d.ts +10 -9
- package/dist/diagrams/state-diagram.js +69 -92
- package/dist/diagrams/tree-diagram.d.ts +11 -5
- package/dist/diagrams/tree-diagram.js +41 -65
- package/dist/dialects/clickhouse/index.js +15 -0
- package/dist/dialects/cockroachdb/index.d.ts +1 -1
- package/dist/dialects/cockroachdb/index.js +32 -63
- package/dist/dialects/db2/index.js +23 -8
- package/dist/dialects/dialect.d.ts +29 -5
- package/dist/dialects/duckdb/index.js +9 -2
- package/dist/dialects/hana/index.js +22 -5
- package/dist/dialects/lock-clause-helper.d.ts +167 -0
- package/dist/dialects/lock-clause-helper.js +316 -0
- package/dist/dialects/mariadb/index.d.ts +7 -4
- package/dist/dialects/mariadb/index.js +36 -60
- package/dist/dialects/mssql/index.js +34 -3
- package/dist/dialects/mysql/index.d.ts +1 -1
- package/dist/dialects/mysql/index.js +17 -45
- package/dist/dialects/oracle/index.d.ts +14 -3
- package/dist/dialects/oracle/index.js +66 -36
- package/dist/dialects/order-expression-helper.d.ts +72 -0
- package/dist/dialects/order-expression-helper.js +154 -0
- package/dist/dialects/partial-index.d.ts +52 -0
- package/dist/dialects/partial-index.js +251 -0
- package/dist/dialects/postgres/index.d.ts +1 -1
- package/dist/dialects/postgres/index.js +43 -68
- package/dist/dialects/redshift/index.js +9 -2
- package/dist/dialects/snowflake/index.js +17 -0
- package/dist/dialects/spanner/index.js +7 -2
- package/dist/dialects/sqlite/driver.d.ts +55 -0
- package/dist/dialects/sqlite/driver.js +102 -0
- package/dist/dialects/sqlite/index.d.ts +1 -1
- package/dist/dialects/sqlite/index.js +49 -27
- package/dist/graph/base-graph-dialect.d.ts +24 -3
- package/dist/graph/base-graph-dialect.js +43 -2
- package/dist/graph/dgraph/index.js +6 -0
- package/dist/graph/gremlin/index.d.ts +6 -0
- package/dist/graph/gremlin/index.js +12 -1
- package/dist/graph/index.d.ts +1 -1
- package/dist/graph/neo4j/index.d.ts +2 -0
- package/dist/graph/neo4j/index.js +6 -1
- package/dist/graph/types.d.ts +12 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.js +54 -7
- package/dist/logging/index.d.ts +10 -0
- package/dist/logging/index.js +23 -0
- package/dist/logging/query-logging.d.ts +82 -0
- package/dist/logging/query-logging.js +102 -0
- package/dist/models/decorators.d.ts +39 -3
- package/dist/models/decorators.js +74 -0
- package/dist/models/eager-load.d.ts +99 -0
- package/dist/models/eager-load.js +348 -5
- package/dist/models/indexes.d.ts +3 -2
- package/dist/models/indexes.js +7 -1
- package/dist/models/model.js +69 -43
- package/dist/prorm.d.ts +175 -409
- package/dist/prorm.js +1142 -557
- package/dist/query-builders/order-limit-builder.js +12 -10
- package/dist/query-builders/sql-compiler.d.ts +10 -3
- package/dist/query-builders/sql-compiler.js +14 -43
- package/dist/query-interface.d.ts +2 -1
- package/dist/sql-constants.d.ts +44 -0
- package/dist/sql-constants.js +138 -1
- package/dist/types/index.d.ts +53 -17
- package/dist/types/index.js +10 -15
- package/dist/types/query-types.d.ts +26 -0
- package/dist/types/query-types.js +30 -0
- package/package.json +32 -5
- package/dist/decorators/belongs-to-many.js +0 -115
- package/dist/decorators/belongs-to.js +0 -115
- package/dist/decorators/has-many.js +0 -127
- package/dist/decorators/has-one.js +0 -116
- package/dist/diagrams/palette.d.ts +0 -138
- package/dist/diagrams/palette.js +0 -194
- package/dist/hooks/hooks-manager.d.ts +0 -189
- package/dist/hooks/hooks-manager.js +0 -350
- package/dist/hooks/index.d.ts +0 -8
- package/dist/hooks/index.js +0 -37
- /package/dist/{logging.d.ts → logging/logger.d.ts} +0 -0
- /package/dist/{logging.js → logging/logger.js} +0 -0
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* PackageDiagram
|
|
3
|
+
* PackageDiagram - a UML package / namespace grouping diagram.
|
|
4
4
|
*
|
|
5
5
|
* Groups models/tables into packages (schemas, modules, bounded-contexts).
|
|
6
6
|
* Each package is drawn as the classic UML "folder" shape: a small tab rect
|
|
7
7
|
* on the top-left plus a body rect beneath it. Package members are laid out
|
|
8
8
|
* as small labeled boxes in a grid inside the body. Dashed dependency arrows
|
|
9
|
-
* (e.g.
|
|
9
|
+
* (e.g. <<import>>) connect packages.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* drives the canvas/text colors. Both `color` and `theme` options genuinely
|
|
13
|
-
* change fill/stroke values in the produced SVG, and the viewBox is auto-sized.
|
|
11
|
+
* The viewBox is auto-sized to the laid-out geometry.
|
|
14
12
|
*
|
|
15
13
|
* Usage:
|
|
16
14
|
* const diag = new PackageDiagram({ packages: [...], dependencies: [...] });
|
|
@@ -55,18 +53,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
55
53
|
exports.PackageDiagram = void 0;
|
|
56
54
|
const fs = __importStar(require("fs"));
|
|
57
55
|
const path = __importStar(require("path"));
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
// Barlow / JetBrains Mono typography, hairline borders and square "blueprint"
|
|
62
|
-
// corners are fixed by the Industry spec; accent + surface colours still route
|
|
63
|
-
// through resolveAccent / resolveTheme so --color / --theme keep working.
|
|
64
|
-
const IND_FONT_HEAD = '"Barlow Condensed", system-ui, sans-serif';
|
|
65
|
-
const IND_FONT_BODY = '"Barlow", system-ui, sans-serif';
|
|
66
|
-
const IND_FONT_MONO = 'ui-monospace, "JetBrains Mono", "SF Mono", Menlo, monospace';
|
|
67
|
-
const IND_HAIRLINE = 'rgba(29,31,32,0.16)';
|
|
68
|
-
const IND_FONT_IMPORT = "@import url('https://fonts.googleapis.com/css2?family=Barlow:wght@400;500;700&family=Barlow+Condensed:wght@400;600&family=JetBrains+Mono&display=swap');";
|
|
69
|
-
// ─── Main class ─────────────────────────────────────────────────────────────
|
|
56
|
+
const svg_1 = require("./core/svg");
|
|
57
|
+
const theme_1 = require("./core/theme");
|
|
58
|
+
const layout_1 = require("./core/layout");
|
|
70
59
|
class PackageDiagram {
|
|
71
60
|
constructor(options) {
|
|
72
61
|
this.opts = {
|
|
@@ -90,12 +79,10 @@ class PackageDiagram {
|
|
|
90
79
|
const h = P.HDR_H + innerH + 2 * P.BODY_PAD;
|
|
91
80
|
return { w, h };
|
|
92
81
|
}
|
|
93
|
-
|
|
82
|
+
build() {
|
|
94
83
|
const P = PackageDiagram;
|
|
95
|
-
const { packages, dependencies, title,
|
|
96
|
-
|
|
97
|
-
const palettes = (0, palette_1.rotatedPalettes)(color);
|
|
98
|
-
// ── Grid layout of package folders ───────────────────────────────────
|
|
84
|
+
const { packages, dependencies, title, columns } = this.opts;
|
|
85
|
+
// Grid layout of package folders.
|
|
99
86
|
const gridCols = columns > 0 ? columns : Math.ceil(Math.sqrt(Math.max(packages.length, 1)));
|
|
100
87
|
// Measure every package first.
|
|
101
88
|
const sizes = packages.map((p) => this.packageSize(p));
|
|
@@ -123,7 +110,7 @@ class PackageDiagram {
|
|
|
123
110
|
rowY[r] = accY;
|
|
124
111
|
accY += rowHeights[r] + P.GAP_Y;
|
|
125
112
|
}
|
|
126
|
-
// Place packages
|
|
113
|
+
// Place packages.
|
|
127
114
|
const placed = packages.map((pkg, i) => {
|
|
128
115
|
const c = i % gridCols;
|
|
129
116
|
const r = Math.floor(i / gridCols);
|
|
@@ -135,51 +122,32 @@ class PackageDiagram {
|
|
|
135
122
|
w,
|
|
136
123
|
h,
|
|
137
124
|
bodyY: rowY[r] + P.TAB_H,
|
|
138
|
-
accent: palettes[i % palettes.length],
|
|
139
125
|
};
|
|
140
126
|
});
|
|
141
127
|
const byName = new Map();
|
|
142
128
|
for (const pl of placed)
|
|
143
129
|
byName.set(pl.pkg.name, pl);
|
|
144
|
-
//
|
|
130
|
+
// Canvas size.
|
|
145
131
|
const totalW = colX[gridCols - 1] + colWidths[gridCols - 1] + P.PAD;
|
|
146
132
|
const totalH = rowY[rowCount - 1] + rowHeights[rowCount - 1] + P.PAD;
|
|
147
|
-
const doc = new
|
|
133
|
+
const doc = new svg_1.SvgDocument(totalW, totalH);
|
|
148
134
|
const svg = doc.root;
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
svg.child('style').text(IND_FONT_IMPORT);
|
|
152
|
-
// ── Arrow marker (in defs) ───────────────────────────────────────────
|
|
153
|
-
const marker = doc.defs().child('marker', {
|
|
154
|
-
id: 'pkgArrow',
|
|
155
|
-
markerWidth: 12,
|
|
156
|
-
markerHeight: 12,
|
|
157
|
-
refX: 9,
|
|
158
|
-
refY: 4,
|
|
159
|
-
orient: 'auto',
|
|
160
|
-
markerUnits: 'userSpaceOnUse',
|
|
161
|
-
});
|
|
162
|
-
marker.child('path', {
|
|
163
|
-
d: 'M0,0 L9,4 L0,8',
|
|
164
|
-
fill: 'none',
|
|
165
|
-
stroke: t.textSecondary,
|
|
166
|
-
'stroke-width': 1.4,
|
|
167
|
-
});
|
|
168
|
-
// ── Title ────────────────────────────────────────────────────────────
|
|
135
|
+
svg.child('rect', { class: 'canvas', width: totalW, height: totalH, fill: theme_1.INK.ground });
|
|
136
|
+
(0, layout_1.defineArrowhead)(doc.defs(), 'pkgArrow');
|
|
169
137
|
if (title) {
|
|
170
138
|
svg
|
|
171
139
|
.child('text', {
|
|
172
140
|
class: 'title',
|
|
173
141
|
x: P.PAD,
|
|
174
142
|
y: P.PAD + 26,
|
|
175
|
-
'font-family':
|
|
176
|
-
'font-size':
|
|
177
|
-
'font-weight':
|
|
178
|
-
fill:
|
|
143
|
+
'font-family': theme_1.FONT.family,
|
|
144
|
+
'font-size': theme_1.FONT.title + 9,
|
|
145
|
+
'font-weight': 'bold',
|
|
146
|
+
fill: theme_1.INK.line,
|
|
179
147
|
})
|
|
180
148
|
.text(title);
|
|
181
149
|
}
|
|
182
|
-
//
|
|
150
|
+
// Dependency arrows, drawn under packages.
|
|
183
151
|
for (const dep of dependencies) {
|
|
184
152
|
const a = byName.get(dep.from);
|
|
185
153
|
const b = byName.get(dep.to);
|
|
@@ -192,37 +160,39 @@ class PackageDiagram {
|
|
|
192
160
|
y1: start.y,
|
|
193
161
|
x2: end.x,
|
|
194
162
|
y2: end.y,
|
|
195
|
-
stroke:
|
|
196
|
-
'stroke-width':
|
|
163
|
+
stroke: theme_1.INK.line,
|
|
164
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
197
165
|
'stroke-dasharray': '7 5',
|
|
198
166
|
'marker-end': 'url(#pkgArrow)',
|
|
199
167
|
});
|
|
200
168
|
const mx = (start.x + end.x) / 2;
|
|
201
169
|
const my = (start.y + end.y) / 2;
|
|
202
|
-
const label = dep.label ?? '
|
|
170
|
+
const label = dep.label ?? '<<import>>';
|
|
203
171
|
svg
|
|
204
172
|
.child('text', {
|
|
205
173
|
class: 'dependency-label',
|
|
206
174
|
x: mx,
|
|
207
175
|
y: my - 6,
|
|
208
|
-
'font-family':
|
|
209
|
-
'font-size':
|
|
176
|
+
'font-family': theme_1.FONT.family,
|
|
177
|
+
'font-size': theme_1.FONT.small + 2,
|
|
210
178
|
'font-style': 'italic',
|
|
211
|
-
fill:
|
|
179
|
+
fill: theme_1.INK.muted,
|
|
212
180
|
'text-anchor': 'middle',
|
|
213
181
|
})
|
|
214
182
|
.text(label);
|
|
215
183
|
}
|
|
216
|
-
// ── Package folders ──────────────────────────────────────────────────
|
|
217
184
|
for (const pl of placed) {
|
|
218
|
-
this.drawPackage(svg, pl
|
|
185
|
+
this.drawPackage(svg, pl);
|
|
219
186
|
}
|
|
220
|
-
return doc
|
|
187
|
+
return doc;
|
|
188
|
+
}
|
|
189
|
+
generate() {
|
|
190
|
+
return this.build().toString('Generated by ts-prorm-orm PackageDiagram');
|
|
221
191
|
}
|
|
222
192
|
/** Compute connection points on the borders of two package boxes. */
|
|
223
193
|
edgePoints(a, b) {
|
|
224
|
-
const ac = { x: a.x + a.w / 2, y: a.bodyY +
|
|
225
|
-
const bc = { x: b.x + b.w / 2, y: b.bodyY +
|
|
194
|
+
const ac = { x: a.x + a.w / 2, y: a.bodyY + a.h / 2 };
|
|
195
|
+
const bc = { x: b.x + b.w / 2, y: b.bodyY + b.h / 2 };
|
|
226
196
|
const clamp = (c, box, toward) => {
|
|
227
197
|
const dx = toward.x - c.x;
|
|
228
198
|
const dy = toward.y - c.y;
|
|
@@ -238,59 +208,53 @@ class PackageDiagram {
|
|
|
238
208
|
return [clamp(ac, a, bc), clamp(bc, b, ac)];
|
|
239
209
|
}
|
|
240
210
|
/** Draw one UML folder-shaped package with its member grid. */
|
|
241
|
-
drawPackage(svg, pl
|
|
211
|
+
drawPackage(svg, pl) {
|
|
242
212
|
const P = PackageDiagram;
|
|
243
|
-
const { pkg, x, y, w, bodyY
|
|
213
|
+
const { pkg, x, y, w, bodyY } = pl;
|
|
244
214
|
const bodyH = pl.h;
|
|
245
|
-
// Folder tab (top-left small rect
|
|
215
|
+
// Folder tab (top-left small rect).
|
|
246
216
|
svg.child('rect', {
|
|
247
217
|
class: 'package-tab',
|
|
248
218
|
x,
|
|
249
219
|
y,
|
|
250
220
|
width: P.TAB_W,
|
|
251
221
|
height: P.TAB_H,
|
|
252
|
-
fill:
|
|
253
|
-
stroke:
|
|
254
|
-
'stroke-width':
|
|
222
|
+
fill: theme_1.INK.wash,
|
|
223
|
+
stroke: theme_1.INK.line,
|
|
224
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
255
225
|
});
|
|
256
|
-
// Body rect
|
|
226
|
+
// Body rect.
|
|
257
227
|
svg.child('rect', {
|
|
258
228
|
class: 'package-body',
|
|
259
229
|
x,
|
|
260
230
|
y: bodyY,
|
|
261
231
|
width: w,
|
|
262
232
|
height: bodyH,
|
|
263
|
-
fill:
|
|
264
|
-
stroke:
|
|
265
|
-
'stroke-width':
|
|
233
|
+
fill: theme_1.INK.ground,
|
|
234
|
+
stroke: theme_1.INK.line,
|
|
235
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
266
236
|
});
|
|
267
|
-
// Header strip inside body
|
|
237
|
+
// Header strip inside body.
|
|
268
238
|
svg.child('rect', {
|
|
269
239
|
class: 'package-header',
|
|
270
240
|
x,
|
|
271
241
|
y: bodyY,
|
|
272
242
|
width: w,
|
|
273
243
|
height: P.HDR_H,
|
|
274
|
-
fill:
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
x1: x,
|
|
278
|
-
y1: bodyY + P.HDR_H,
|
|
279
|
-
x2: x + w,
|
|
280
|
-
y2: bodyY + P.HDR_H,
|
|
281
|
-
stroke: IND_HAIRLINE,
|
|
282
|
-
'stroke-width': 1,
|
|
244
|
+
fill: theme_1.INK.wash,
|
|
245
|
+
stroke: theme_1.INK.line,
|
|
246
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
283
247
|
});
|
|
284
|
-
// Package name
|
|
248
|
+
// Package name.
|
|
285
249
|
svg
|
|
286
250
|
.child('text', {
|
|
287
251
|
class: 'package-name',
|
|
288
252
|
x: x + P.BODY_PAD,
|
|
289
253
|
y: bodyY + 26,
|
|
290
|
-
'font-family':
|
|
291
|
-
'font-size':
|
|
292
|
-
'font-weight':
|
|
293
|
-
fill:
|
|
254
|
+
'font-family': theme_1.FONT.family,
|
|
255
|
+
'font-size': theme_1.FONT.body + 4,
|
|
256
|
+
'font-weight': 'bold',
|
|
257
|
+
fill: theme_1.INK.line,
|
|
294
258
|
})
|
|
295
259
|
.text(pkg.name);
|
|
296
260
|
// Member boxes in a grid.
|
|
@@ -307,40 +271,39 @@ class PackageDiagram {
|
|
|
307
271
|
y: my,
|
|
308
272
|
width: P.MEMBER_W,
|
|
309
273
|
height: P.MEMBER_H,
|
|
310
|
-
fill:
|
|
311
|
-
stroke:
|
|
312
|
-
'stroke-width':
|
|
274
|
+
fill: theme_1.INK.ground,
|
|
275
|
+
stroke: theme_1.INK.line,
|
|
276
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
313
277
|
});
|
|
314
|
-
// Left
|
|
278
|
+
// Left stripe.
|
|
315
279
|
svg.child('rect', {
|
|
316
280
|
class: 'member-stripe',
|
|
317
281
|
x: mx,
|
|
318
282
|
y: my,
|
|
319
283
|
width: 4,
|
|
320
284
|
height: P.MEMBER_H,
|
|
321
|
-
fill:
|
|
285
|
+
fill: theme_1.INK.line,
|
|
322
286
|
});
|
|
323
|
-
const nameDisp = m.name.length > 18 ? m.name.slice(0, 17) + '…' : m.name;
|
|
324
287
|
svg
|
|
325
288
|
.child('text', {
|
|
326
289
|
class: 'member-name',
|
|
327
290
|
x: mx + 14,
|
|
328
291
|
y: m.kind ? my + 18 : my + 25,
|
|
329
|
-
'font-family':
|
|
330
|
-
'font-size':
|
|
331
|
-
'font-weight':
|
|
332
|
-
fill:
|
|
292
|
+
'font-family': theme_1.FONT.mono,
|
|
293
|
+
'font-size': theme_1.FONT.body + 1,
|
|
294
|
+
'font-weight': 'bold',
|
|
295
|
+
fill: theme_1.INK.line,
|
|
333
296
|
})
|
|
334
|
-
.text(
|
|
297
|
+
.text((0, layout_1.truncate)(m.name, P.MEMBER_W - 20, theme_1.FONT.body + 1, true));
|
|
335
298
|
if (m.kind) {
|
|
336
299
|
svg
|
|
337
300
|
.child('text', {
|
|
338
301
|
class: 'member-kind',
|
|
339
302
|
x: mx + 14,
|
|
340
303
|
y: my + 32,
|
|
341
|
-
'font-family':
|
|
342
|
-
'font-size':
|
|
343
|
-
fill:
|
|
304
|
+
'font-family': theme_1.FONT.family,
|
|
305
|
+
'font-size': theme_1.FONT.small - 1,
|
|
306
|
+
fill: theme_1.INK.muted,
|
|
344
307
|
})
|
|
345
308
|
.text(m.kind);
|
|
346
309
|
}
|
|
@@ -1,29 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* RelationalDiagram
|
|
2
|
+
* RelationalDiagram - renders a relational schema as entity boxes with their
|
|
3
3
|
* columns and draws connectors between related tables using proper crow's-foot
|
|
4
4
|
* cardinality notation.
|
|
5
5
|
*
|
|
6
6
|
* Each entity is a box listing its columns; primary-key columns are marked and
|
|
7
7
|
* underlined, foreign-key columns are marked. Relationship connectors terminate
|
|
8
8
|
* with crow's-foot endpoints:
|
|
9
|
-
* - "one"
|
|
10
|
-
* - "many"
|
|
11
|
-
* - "optional" → a small circle just outside the endpoint (zero cardinality)
|
|
9
|
+
* - "one" -> a small perpendicular tick (single bar)
|
|
10
|
+
* - "many" -> the three-pronged crow's foot
|
|
12
11
|
*
|
|
13
12
|
* Supported relationship types: one-to-one, one-to-many, many-to-one,
|
|
14
13
|
* many-to-many. Entities are laid out on a grid and connectors are routed
|
|
15
14
|
* between the nearest entity edges.
|
|
16
15
|
*
|
|
17
|
-
*
|
|
18
|
-
* / `El` builder — never by concatenating markup strings — and the viewBox is
|
|
19
|
-
* auto-sized to the content. Both `theme` and `color` change real fill/stroke
|
|
20
|
-
* values in the output (via `resolveTheme` / `resolveAccent`).
|
|
16
|
+
* The viewBox is auto-sized to the content.
|
|
21
17
|
*
|
|
22
18
|
* Usage:
|
|
23
19
|
* const rel = new RelationalDiagram({
|
|
24
20
|
* title: 'Shop Schema',
|
|
25
|
-
* entities: [
|
|
26
|
-
* relationships: [
|
|
21
|
+
* entities: [ ...RelEntity ],
|
|
22
|
+
* relationships: [ ...RelRelationship ],
|
|
27
23
|
* });
|
|
28
24
|
* rel.save('./diagrams/schema.svg');
|
|
29
25
|
* // or: const svg = rel.generate();
|
|
@@ -49,7 +45,12 @@ export interface RelationalDiagramOptions {
|
|
|
49
45
|
entities: RelEntity[];
|
|
50
46
|
relationships?: RelRelationship[];
|
|
51
47
|
title?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Accepted for backward compatibility and ignored: diagrams render in a
|
|
50
|
+
* single monochrome theme.
|
|
51
|
+
*/
|
|
52
52
|
theme?: 'light' | 'dark';
|
|
53
|
+
/** Accepted for backward compatibility and ignored. */
|
|
53
54
|
color?: string;
|
|
54
55
|
/** Number of entity columns in the layout grid. @default 3 */
|
|
55
56
|
columns?: number;
|
|
@@ -73,6 +74,7 @@ export declare class RelationalDiagram {
|
|
|
73
74
|
private crowFoot;
|
|
74
75
|
private oneBar;
|
|
75
76
|
private renderRelationship;
|
|
77
|
+
private build;
|
|
76
78
|
generate(): string;
|
|
77
79
|
/**
|
|
78
80
|
* Write the SVG to a file, creating parent directories as needed.
|