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,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* IndexDiagram
|
|
3
|
+
* IndexDiagram - an INDEX & CONSTRAINT MAP for a single table.
|
|
4
4
|
*
|
|
5
5
|
* A table's columns are laid out as a horizontal strip of "column chips".
|
|
6
6
|
* Below the strip, every index/constraint is drawn as a labeled "bracket" that
|
|
7
|
-
* spans the column chips it covers
|
|
7
|
+
* spans the column chips it covers - so composite indexes visibly span multiple
|
|
8
8
|
* columns and overlapping coverage is obvious at a glance.
|
|
9
9
|
*
|
|
10
10
|
* Index kinds (PRIMARY / UNIQUE / INDEX / FULLTEXT / FOREIGN KEY / CHECK) are
|
|
11
|
-
* distinguished by
|
|
12
|
-
* its access method (btree/hash/gin
|
|
13
|
-
*
|
|
14
|
-
* `--theme light|dark` drives the canvas/text colors and `--color <name|hex>`
|
|
15
|
-
* drives the accent used for the header and the PRIMARY index — both genuinely
|
|
16
|
-
* change fill/stroke values in the generated SVG.
|
|
11
|
+
* distinguished by a short ASCII badge; each row also shows the index name,
|
|
12
|
+
* its access method (btree/hash/gin...) and whether it is unique.
|
|
17
13
|
*
|
|
18
14
|
* Usage:
|
|
19
15
|
* const diag = new IndexDiagram({ table: 'users', columns: [...], indexes: [...] });
|
|
@@ -58,32 +54,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
58
54
|
exports.IndexDiagram = void 0;
|
|
59
55
|
const fs = __importStar(require("fs"));
|
|
60
56
|
const path = __importStar(require("path"));
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// Industry blueprint: badges share the accent light tint (#eef6ff / #2c455d)
|
|
73
|
-
// with the badge letters carrying the distinction; a couple of kinds drop to
|
|
74
|
-
// the neutral tint so the map still reads categorically without vibrant hues.
|
|
75
|
-
const KIND_STYLES = {
|
|
76
|
-
PRIMARY: { badge: 'PK', color: '#2c455d', bg: '#eef6ff' },
|
|
77
|
-
UNIQUE: { badge: 'UQ', color: '#2c455d', bg: '#eef6ff' },
|
|
78
|
-
INDEX: { badge: 'IX', color: '#5d5d60', bg: '#f5f5f8' },
|
|
79
|
-
FULLTEXT: { badge: 'FT', color: '#5d5d60', bg: '#f5f5f8' },
|
|
80
|
-
'FOREIGN KEY': { badge: 'FK', color: '#2c455d', bg: '#eef6ff' },
|
|
81
|
-
CHECK: { badge: 'CK', color: '#5d5d60', bg: '#f5f5f8' },
|
|
57
|
+
const svg_1 = require("./core/svg");
|
|
58
|
+
const theme_1 = require("./core/theme");
|
|
59
|
+
const layout_1 = require("./core/layout");
|
|
60
|
+
// Short ASCII badge per index kind. No colour distinction: monochrome.
|
|
61
|
+
const KIND_BADGE = {
|
|
62
|
+
PRIMARY: 'PK',
|
|
63
|
+
UNIQUE: 'UQ',
|
|
64
|
+
INDEX: 'IX',
|
|
65
|
+
FULLTEXT: 'FT',
|
|
66
|
+
'FOREIGN KEY': 'FK',
|
|
67
|
+
CHECK: 'CK',
|
|
82
68
|
};
|
|
83
|
-
function
|
|
84
|
-
return
|
|
69
|
+
function kindBadge(kind) {
|
|
70
|
+
return KIND_BADGE[kind ?? 'INDEX'] ?? KIND_BADGE.INDEX;
|
|
85
71
|
}
|
|
86
|
-
// ─── Main class ──────────────────────────────────────────────────────────────
|
|
87
72
|
class IndexDiagram {
|
|
88
73
|
constructor(options) {
|
|
89
74
|
this.opts = {
|
|
@@ -98,10 +83,8 @@ class IndexDiagram {
|
|
|
98
83
|
const longest = label.reduce((m, s) => Math.max(m, s.length), 4);
|
|
99
84
|
return Math.max(IndexDiagram.MIN_CHIP_W, longest * 8 + 24);
|
|
100
85
|
}
|
|
101
|
-
|
|
102
|
-
const { table, columns, indexes, title
|
|
103
|
-
const accent = (0, palette_1.resolveAccent)(color);
|
|
104
|
-
const t = (0, palette_1.resolveTheme)(theme);
|
|
86
|
+
build() {
|
|
87
|
+
const { table, columns, indexes, title } = this.opts;
|
|
105
88
|
const PAD = IndexDiagram.PAD;
|
|
106
89
|
const HDR = IndexDiagram.HDR;
|
|
107
90
|
const CHIP_H = IndexDiagram.CHIP_H;
|
|
@@ -110,7 +93,6 @@ class IndexDiagram {
|
|
|
110
93
|
const GAP_AFTER_STRIP = IndexDiagram.GAP_AFTER_STRIP;
|
|
111
94
|
const ROW_H = IndexDiagram.ROW_H;
|
|
112
95
|
const LABEL_W = IndexDiagram.LABEL_W;
|
|
113
|
-
const R = IndexDiagram.R;
|
|
114
96
|
const chipW = this.chipWidth();
|
|
115
97
|
const nCols = Math.max(columns.length, 1);
|
|
116
98
|
// Geometry of the column strip.
|
|
@@ -128,58 +110,62 @@ class IndexDiagram {
|
|
|
128
110
|
const svgW = contentW + PAD;
|
|
129
111
|
const rowsTop = stripY + CHIP_H + GAP_AFTER_STRIP;
|
|
130
112
|
const svgH = rowsTop + indexes.length * ROW_H + PAD;
|
|
131
|
-
const
|
|
132
|
-
const doc = new svg_dom_1.SvgDocument(svgW, svgH);
|
|
113
|
+
const doc = new svg_1.SvgDocument(svgW, svgH);
|
|
133
114
|
const svg = doc.root;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
svg.child('
|
|
137
|
-
|
|
138
|
-
|
|
115
|
+
svg.child('rect', { width: svgW, height: svgH, fill: theme_1.INK.ground });
|
|
116
|
+
// Header bar.
|
|
117
|
+
svg.child('rect', {
|
|
118
|
+
x: PAD,
|
|
119
|
+
y: PAD,
|
|
120
|
+
width: contentW - PAD,
|
|
121
|
+
height: HDR,
|
|
122
|
+
fill: theme_1.INK.wash,
|
|
123
|
+
stroke: theme_1.INK.line,
|
|
124
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
125
|
+
});
|
|
139
126
|
svg
|
|
140
127
|
.child('text', {
|
|
141
128
|
x: PAD + 18,
|
|
142
129
|
y: PAD + 27,
|
|
143
|
-
'font-family':
|
|
144
|
-
'font-size':
|
|
145
|
-
'font-weight':
|
|
146
|
-
fill:
|
|
130
|
+
'font-family': theme_1.FONT.family,
|
|
131
|
+
'font-size': theme_1.FONT.title + 7,
|
|
132
|
+
'font-weight': 'bold',
|
|
133
|
+
fill: theme_1.INK.line,
|
|
147
134
|
})
|
|
148
|
-
.text(title || `Index Map
|
|
135
|
+
.text(title || `Index Map - ${table}`);
|
|
149
136
|
svg
|
|
150
137
|
.child('text', {
|
|
151
138
|
x: PAD + 18,
|
|
152
139
|
y: PAD + 47,
|
|
153
|
-
'font-family':
|
|
154
|
-
'font-size':
|
|
155
|
-
fill:
|
|
140
|
+
'font-family': theme_1.FONT.mono,
|
|
141
|
+
'font-size': theme_1.FONT.small + 2,
|
|
142
|
+
fill: theme_1.INK.muted,
|
|
156
143
|
})
|
|
157
|
-
.text(`${columns.length} columns
|
|
158
|
-
// "TABLE" pill on the right of the header.
|
|
144
|
+
.text(`${columns.length} columns, ${indexes.length} indexes`);
|
|
159
145
|
svg
|
|
160
146
|
.child('text', {
|
|
161
147
|
x: contentW - 16,
|
|
162
148
|
y: PAD + 33,
|
|
163
|
-
'font-family':
|
|
164
|
-
'font-size':
|
|
165
|
-
'font-weight':
|
|
166
|
-
fill:
|
|
149
|
+
'font-family': theme_1.FONT.mono,
|
|
150
|
+
'font-size': theme_1.FONT.small + 3,
|
|
151
|
+
'font-weight': 'bold',
|
|
152
|
+
fill: theme_1.INK.line,
|
|
167
153
|
'text-anchor': 'end',
|
|
168
154
|
})
|
|
169
155
|
.text(table);
|
|
170
|
-
//
|
|
156
|
+
// Column strip label.
|
|
171
157
|
svg
|
|
172
158
|
.child('text', {
|
|
173
159
|
x: stripX,
|
|
174
160
|
y: stripY - 8,
|
|
175
|
-
'font-family':
|
|
176
|
-
'font-size':
|
|
177
|
-
'font-weight':
|
|
161
|
+
'font-family': theme_1.FONT.family,
|
|
162
|
+
'font-size': theme_1.FONT.small + 2,
|
|
163
|
+
'font-weight': 'bold',
|
|
178
164
|
'letter-spacing': 1,
|
|
179
|
-
fill:
|
|
165
|
+
fill: theme_1.INK.muted,
|
|
180
166
|
})
|
|
181
167
|
.text('COLUMNS');
|
|
182
|
-
//
|
|
168
|
+
// Column chips.
|
|
183
169
|
columns.forEach((c, i) => {
|
|
184
170
|
const x = stripX + i * chipStride;
|
|
185
171
|
svg.child('rect', {
|
|
@@ -187,45 +173,40 @@ class IndexDiagram {
|
|
|
187
173
|
y: stripY,
|
|
188
174
|
width: chipW,
|
|
189
175
|
height: CHIP_H,
|
|
190
|
-
fill:
|
|
191
|
-
stroke:
|
|
192
|
-
'stroke-width':
|
|
176
|
+
fill: theme_1.INK.ground,
|
|
177
|
+
stroke: theme_1.INK.line,
|
|
178
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
193
179
|
});
|
|
194
180
|
svg
|
|
195
181
|
.child('text', {
|
|
196
182
|
x: x + chipW / 2,
|
|
197
183
|
y: stripY + 20,
|
|
198
|
-
'font-family':
|
|
199
|
-
'font-size':
|
|
200
|
-
'font-weight':
|
|
201
|
-
fill:
|
|
184
|
+
'font-family': theme_1.FONT.mono,
|
|
185
|
+
'font-size': theme_1.FONT.body + 2,
|
|
186
|
+
'font-weight': 'bold',
|
|
187
|
+
fill: theme_1.INK.line,
|
|
202
188
|
'text-anchor': 'middle',
|
|
203
189
|
})
|
|
204
|
-
.text(c.name);
|
|
190
|
+
.text((0, layout_1.truncate)(c.name, chipW - 8, theme_1.FONT.body + 2, true));
|
|
205
191
|
if (c.type) {
|
|
206
192
|
svg
|
|
207
193
|
.child('text', {
|
|
208
194
|
x: x + chipW / 2,
|
|
209
195
|
y: stripY + 37,
|
|
210
|
-
'font-family':
|
|
211
|
-
'font-size':
|
|
212
|
-
fill:
|
|
196
|
+
'font-family': theme_1.FONT.mono,
|
|
197
|
+
'font-size': theme_1.FONT.small,
|
|
198
|
+
fill: theme_1.INK.muted,
|
|
213
199
|
'text-anchor': 'middle',
|
|
214
200
|
})
|
|
215
201
|
.text(c.type);
|
|
216
202
|
}
|
|
217
203
|
});
|
|
218
|
-
//
|
|
219
|
-
// Each row draws: left label block (badge + name + method) and a spanning
|
|
220
|
-
// bracket that connects to every covered column chip via connector lines.
|
|
204
|
+
// Index / constraint rows with spanning brackets.
|
|
221
205
|
const chipBottom = stripY + CHIP_H;
|
|
222
206
|
indexes.forEach((idx, i) => {
|
|
223
207
|
const rowY = rowsTop + i * ROW_H;
|
|
224
208
|
const rowMid = rowY + ROW_H / 2;
|
|
225
|
-
const style = kindStyle(idx.kind);
|
|
226
209
|
const isPrimary = idx.kind === 'PRIMARY';
|
|
227
|
-
// The PRIMARY index adopts the accent color so --color is visibly wired in.
|
|
228
|
-
const lineColor = isPrimary ? accent.mid : style.color;
|
|
229
210
|
// Alternating row background band.
|
|
230
211
|
if (i % 2 === 1) {
|
|
231
212
|
svg.child('rect', {
|
|
@@ -233,34 +214,39 @@ class IndexDiagram {
|
|
|
233
214
|
y: rowY,
|
|
234
215
|
width: contentW - PAD,
|
|
235
216
|
height: ROW_H,
|
|
236
|
-
fill:
|
|
217
|
+
fill: theme_1.INK.wash,
|
|
237
218
|
});
|
|
238
219
|
}
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
220
|
+
// Left label block: badge chip.
|
|
221
|
+
svg.child('rect', {
|
|
222
|
+
x: PAD + 8,
|
|
223
|
+
y: rowMid - 12,
|
|
224
|
+
width: 30,
|
|
225
|
+
height: 24,
|
|
226
|
+
fill: theme_1.INK.wash,
|
|
227
|
+
stroke: theme_1.INK.line,
|
|
228
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
229
|
+
});
|
|
244
230
|
svg
|
|
245
231
|
.child('text', {
|
|
246
232
|
x: PAD + 8 + 15,
|
|
247
233
|
y: rowMid + 5,
|
|
248
|
-
'font-family':
|
|
249
|
-
'font-size':
|
|
250
|
-
'font-weight':
|
|
251
|
-
fill:
|
|
234
|
+
'font-family': theme_1.FONT.mono,
|
|
235
|
+
'font-size': theme_1.FONT.small + 2,
|
|
236
|
+
'font-weight': 'bold',
|
|
237
|
+
fill: theme_1.INK.line,
|
|
252
238
|
'text-anchor': 'middle',
|
|
253
239
|
})
|
|
254
|
-
.text(
|
|
240
|
+
.text(kindBadge(idx.kind));
|
|
255
241
|
// Index name.
|
|
256
242
|
svg
|
|
257
243
|
.child('text', {
|
|
258
244
|
x: PAD + 48,
|
|
259
245
|
y: rowMid - 2,
|
|
260
|
-
'font-family':
|
|
261
|
-
'font-size':
|
|
262
|
-
'font-weight':
|
|
263
|
-
fill:
|
|
246
|
+
'font-family': theme_1.FONT.mono,
|
|
247
|
+
'font-size': theme_1.FONT.body + 1,
|
|
248
|
+
'font-weight': 'bold',
|
|
249
|
+
fill: theme_1.INK.line,
|
|
264
250
|
})
|
|
265
251
|
.text(idx.name);
|
|
266
252
|
// Method + unique subtitle.
|
|
@@ -274,12 +260,12 @@ class IndexDiagram {
|
|
|
274
260
|
.child('text', {
|
|
275
261
|
x: PAD + 48,
|
|
276
262
|
y: rowMid + 13,
|
|
277
|
-
'font-family':
|
|
278
|
-
'font-size':
|
|
279
|
-
fill:
|
|
263
|
+
'font-family': theme_1.FONT.mono,
|
|
264
|
+
'font-size': theme_1.FONT.small,
|
|
265
|
+
fill: theme_1.INK.muted,
|
|
280
266
|
})
|
|
281
|
-
.text(meta.join('
|
|
282
|
-
//
|
|
267
|
+
.text(meta.join(', '));
|
|
268
|
+
// Spanning bracket over covered columns.
|
|
283
269
|
const covered = idx.columns
|
|
284
270
|
.map((cn) => colCenter[cn])
|
|
285
271
|
.filter((v) => typeof v === 'number')
|
|
@@ -294,25 +280,27 @@ class IndexDiagram {
|
|
|
294
280
|
y1: bracketY,
|
|
295
281
|
x2: last,
|
|
296
282
|
y2: bracketY,
|
|
297
|
-
stroke:
|
|
298
|
-
'stroke-width': isPrimary ?
|
|
283
|
+
stroke: theme_1.INK.line,
|
|
284
|
+
'stroke-width': isPrimary ? theme_1.STROKE.heavy : theme_1.STROKE.hair,
|
|
299
285
|
'stroke-linecap': 'round',
|
|
300
286
|
});
|
|
301
287
|
// A connector path from each covered column chip down to the spine.
|
|
302
288
|
covered.forEach((cxp) => {
|
|
303
|
-
// Curved connector from the bottom of the chip to the spine node.
|
|
304
289
|
const d = `M ${cxp} ${chipBottom} C ${cxp} ${(chipBottom + bracketY) / 2}, ${cxp} ${(chipBottom + bracketY) / 2}, ${cxp} ${bracketY}`;
|
|
305
290
|
svg.child('path', {
|
|
306
291
|
d,
|
|
307
|
-
stroke:
|
|
308
|
-
'stroke-width':
|
|
292
|
+
stroke: theme_1.INK.line,
|
|
293
|
+
'stroke-width': theme_1.STROKE.hair,
|
|
309
294
|
fill: 'none',
|
|
310
|
-
opacity: 0.85,
|
|
311
295
|
});
|
|
312
|
-
|
|
313
|
-
|
|
296
|
+
svg.child('circle', {
|
|
297
|
+
cx: cxp,
|
|
298
|
+
cy: bracketY,
|
|
299
|
+
r: isPrimary ? 5 : 4,
|
|
300
|
+
fill: theme_1.INK.line,
|
|
301
|
+
});
|
|
314
302
|
});
|
|
315
|
-
// Order labels (1,2,3
|
|
303
|
+
// Order labels (1,2,3...) for composite indexes so column order reads.
|
|
316
304
|
if (covered.length > 1) {
|
|
317
305
|
idx.columns.forEach((cn, ord) => {
|
|
318
306
|
const cxp = colCenter[cn];
|
|
@@ -322,17 +310,20 @@ class IndexDiagram {
|
|
|
322
310
|
.child('text', {
|
|
323
311
|
x: cxp + 8,
|
|
324
312
|
y: bracketY - 8,
|
|
325
|
-
'font-family':
|
|
326
|
-
'font-size':
|
|
327
|
-
'font-weight':
|
|
328
|
-
fill:
|
|
313
|
+
'font-family': theme_1.FONT.mono,
|
|
314
|
+
'font-size': theme_1.FONT.small - 1,
|
|
315
|
+
'font-weight': 'bold',
|
|
316
|
+
fill: theme_1.INK.line,
|
|
329
317
|
})
|
|
330
318
|
.text(String(ord + 1));
|
|
331
319
|
});
|
|
332
320
|
}
|
|
333
321
|
}
|
|
334
322
|
});
|
|
335
|
-
return doc
|
|
323
|
+
return doc;
|
|
324
|
+
}
|
|
325
|
+
generate() {
|
|
326
|
+
return this.build().toString('Generated by ts-prorm-orm IndexDiagram');
|
|
336
327
|
}
|
|
337
328
|
/** Write the SVG to a file. Creates parent directories if needed. */
|
|
338
329
|
save(outputPath) {
|
|
@@ -355,4 +346,3 @@ IndexDiagram.GAP_AFTER_STRIP = 46;
|
|
|
355
346
|
IndexDiagram.ROW_H = 54;
|
|
356
347
|
IndexDiagram.LABEL_W = 250; // left column: badge + name + method
|
|
357
348
|
IndexDiagram.MIN_CHIP_W = 96;
|
|
358
|
-
IndexDiagram.R = 12;
|
package/dist/diagrams/index.d.ts
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* SVG diagram generators for ORM models and ER schemas.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* --- Quick-start --------------------------------------------------------
|
|
7
7
|
*
|
|
8
8
|
* 1) Single-model card
|
|
9
|
-
*
|
|
9
|
+
* -----------------
|
|
10
10
|
* import { ModelDiagram } from './diagrams';
|
|
11
11
|
*
|
|
12
12
|
* const diag = new ModelDiagram({
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
*
|
|
34
34
|
*
|
|
35
35
|
* 2) Full ER diagram
|
|
36
|
-
*
|
|
36
|
+
* ----------------
|
|
37
37
|
* import { ERDiagram } from './diagrams';
|
|
38
38
|
*
|
|
39
39
|
* const er = new ERDiagram({
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
*
|
|
47
47
|
*
|
|
48
48
|
* 3) CLI
|
|
49
|
-
*
|
|
49
|
+
* ----
|
|
50
50
|
* # Single model (from JSON spec)
|
|
51
51
|
* cli diagram:model --file ./User.json --out ./diagrams/User.svg
|
|
52
52
|
*
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
* --assoc "hasMany:Post:userId" \
|
|
60
60
|
* --out ./diagrams/User.svg
|
|
61
61
|
*
|
|
62
|
-
*
|
|
62
|
+
* --- JSON spec format ---------------------------------------------------
|
|
63
63
|
*
|
|
64
64
|
* Single model file:
|
|
65
65
|
* {
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
* {
|
|
80
80
|
* "title": "My App Schema",
|
|
81
81
|
* "columns": 3,
|
|
82
|
-
* "models": [ <model-spec>, <model-spec>,
|
|
82
|
+
* "models": [ <model-spec>, <model-spec>, ... ]
|
|
83
83
|
* }
|
|
84
84
|
*/
|
|
85
85
|
export { ModelDiagram } from './model-diagram';
|
|
@@ -112,9 +112,6 @@ export { PackageDiagram } from './package-diagram';
|
|
|
112
112
|
export type { PackageDiagramOptions, PackageBox, PackageMember, PackageDependency, } from './package-diagram';
|
|
113
113
|
export { GanttDiagram } from './gantt-diagram';
|
|
114
114
|
export type { GanttDiagramOptions, GanttTask } from './gantt-diagram';
|
|
115
|
-
export { SvgDocument, El } from './svg-dom';
|
|
116
|
-
export { resolveAccent, resolveTheme, rotatedPalettes, accent2Of, ACCENT_PALETTES, INDUSTRY, FONTS, FONT_IMPORT, BADGE_TINTS, } from './palette';
|
|
117
|
-
export type { AccentPalette, ThemeColors } from './palette';
|
|
118
115
|
import { ModelDiagramOptions } from './model-diagram';
|
|
119
116
|
import { ERDiagramOptions } from './er-diagram';
|
|
120
117
|
/**
|
package/dist/diagrams/index.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* SVG diagram generators for ORM models and ER schemas.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* --- Quick-start --------------------------------------------------------
|
|
8
8
|
*
|
|
9
9
|
* 1) Single-model card
|
|
10
|
-
*
|
|
10
|
+
* -----------------
|
|
11
11
|
* import { ModelDiagram } from './diagrams';
|
|
12
12
|
*
|
|
13
13
|
* const diag = new ModelDiagram({
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
*
|
|
35
35
|
*
|
|
36
36
|
* 2) Full ER diagram
|
|
37
|
-
*
|
|
37
|
+
* ----------------
|
|
38
38
|
* import { ERDiagram } from './diagrams';
|
|
39
39
|
*
|
|
40
40
|
* const er = new ERDiagram({
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
*
|
|
48
48
|
*
|
|
49
49
|
* 3) CLI
|
|
50
|
-
*
|
|
50
|
+
* ----
|
|
51
51
|
* # Single model (from JSON spec)
|
|
52
52
|
* cli diagram:model --file ./User.json --out ./diagrams/User.svg
|
|
53
53
|
*
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
* --assoc "hasMany:Post:userId" \
|
|
61
61
|
* --out ./diagrams/User.svg
|
|
62
62
|
*
|
|
63
|
-
*
|
|
63
|
+
* --- JSON spec format ---------------------------------------------------
|
|
64
64
|
*
|
|
65
65
|
* Single model file:
|
|
66
66
|
* {
|
|
@@ -80,11 +80,11 @@
|
|
|
80
80
|
* {
|
|
81
81
|
* "title": "My App Schema",
|
|
82
82
|
* "columns": 3,
|
|
83
|
-
* "models": [ <model-spec>, <model-spec>,
|
|
83
|
+
* "models": [ <model-spec>, <model-spec>, ... ]
|
|
84
84
|
* }
|
|
85
85
|
*/
|
|
86
86
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
87
|
-
exports.
|
|
87
|
+
exports.GanttDiagram = exports.PackageDiagram = exports.ChenDiagram = exports.TreeDiagram = exports.FlowDiagram = exports.IndexDiagram = exports.SchemaDocDiagram = exports.DependencyDiagram = exports.StateDiagram = exports.SequenceDiagram = exports.RelationalDiagram = exports.ClassDiagram = exports.MigrationDiagram = exports.ERDiagram = exports.ModelDiagram = void 0;
|
|
88
88
|
exports.generateModelDiagram = generateModelDiagram;
|
|
89
89
|
exports.generateERDiagram = generateERDiagram;
|
|
90
90
|
exports.generateModelDiagramFromFile = generateModelDiagramFromFile;
|
|
@@ -95,7 +95,7 @@ var er_diagram_1 = require("./er-diagram");
|
|
|
95
95
|
Object.defineProperty(exports, "ERDiagram", { enumerable: true, get: function () { return er_diagram_1.ERDiagram; } });
|
|
96
96
|
var migration_diagram_1 = require("./migration-diagram");
|
|
97
97
|
Object.defineProperty(exports, "MigrationDiagram", { enumerable: true, get: function () { return migration_diagram_1.MigrationDiagram; } });
|
|
98
|
-
//
|
|
98
|
+
// --- Extended diagram generators (all built on the shared DOM SVG builder) --
|
|
99
99
|
var class_diagram_1 = require("./class-diagram");
|
|
100
100
|
Object.defineProperty(exports, "ClassDiagram", { enumerable: true, get: function () { return class_diagram_1.ClassDiagram; } });
|
|
101
101
|
var relational_diagram_1 = require("./relational-diagram");
|
|
@@ -120,22 +120,7 @@ var package_diagram_1 = require("./package-diagram");
|
|
|
120
120
|
Object.defineProperty(exports, "PackageDiagram", { enumerable: true, get: function () { return package_diagram_1.PackageDiagram; } });
|
|
121
121
|
var gantt_diagram_1 = require("./gantt-diagram");
|
|
122
122
|
Object.defineProperty(exports, "GanttDiagram", { enumerable: true, get: function () { return gantt_diagram_1.GanttDiagram; } });
|
|
123
|
-
//
|
|
124
|
-
var svg_dom_1 = require("./svg-dom");
|
|
125
|
-
Object.defineProperty(exports, "SvgDocument", { enumerable: true, get: function () { return svg_dom_1.SvgDocument; } });
|
|
126
|
-
Object.defineProperty(exports, "El", { enumerable: true, get: function () { return svg_dom_1.El; } });
|
|
127
|
-
var palette_1 = require("./palette");
|
|
128
|
-
Object.defineProperty(exports, "resolveAccent", { enumerable: true, get: function () { return palette_1.resolveAccent; } });
|
|
129
|
-
Object.defineProperty(exports, "resolveTheme", { enumerable: true, get: function () { return palette_1.resolveTheme; } });
|
|
130
|
-
Object.defineProperty(exports, "rotatedPalettes", { enumerable: true, get: function () { return palette_1.rotatedPalettes; } });
|
|
131
|
-
Object.defineProperty(exports, "accent2Of", { enumerable: true, get: function () { return palette_1.accent2Of; } });
|
|
132
|
-
Object.defineProperty(exports, "ACCENT_PALETTES", { enumerable: true, get: function () { return palette_1.ACCENT_PALETTES; } });
|
|
133
|
-
// Industry design-system tokens
|
|
134
|
-
Object.defineProperty(exports, "INDUSTRY", { enumerable: true, get: function () { return palette_1.INDUSTRY; } });
|
|
135
|
-
Object.defineProperty(exports, "FONTS", { enumerable: true, get: function () { return palette_1.FONTS; } });
|
|
136
|
-
Object.defineProperty(exports, "FONT_IMPORT", { enumerable: true, get: function () { return palette_1.FONT_IMPORT; } });
|
|
137
|
-
Object.defineProperty(exports, "BADGE_TINTS", { enumerable: true, get: function () { return palette_1.BADGE_TINTS; } });
|
|
138
|
-
// ─── Convenience factory functions ──────────────────────────────────────────
|
|
123
|
+
// --- Convenience factory functions ------------------------------------------
|
|
139
124
|
const model_diagram_2 = require("./model-diagram");
|
|
140
125
|
const er_diagram_2 = require("./er-diagram");
|
|
141
126
|
/**
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MigrationDiagram
|
|
2
|
+
* MigrationDiagram - generates an SVG showing database schema changes.
|
|
3
3
|
*
|
|
4
4
|
* Features:
|
|
5
5
|
* - Shows tables with their columns (before/after or just new state)
|
|
6
|
-
* -
|
|
6
|
+
* - Change indicators per column: added, removed, modified
|
|
7
7
|
* - Migration metadata header with timestamp and description
|
|
8
8
|
* - Support for multiple migration steps
|
|
9
9
|
* - Compact field rows with type badges
|
|
@@ -40,9 +40,12 @@ export interface MigrationDiagramOptions {
|
|
|
40
40
|
timestamp?: string;
|
|
41
41
|
/** All table changes to visualize */
|
|
42
42
|
changes: TableChange[];
|
|
43
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Accepted for backward compatibility and ignored: diagrams render in a
|
|
45
|
+
* single monochrome theme.
|
|
46
|
+
*/
|
|
44
47
|
theme?: 'light' | 'dark';
|
|
45
|
-
/**
|
|
48
|
+
/** Accepted for backward compatibility and ignored. */
|
|
46
49
|
color?: string;
|
|
47
50
|
}
|
|
48
51
|
export declare class MigrationDiagram {
|
|
@@ -59,6 +62,7 @@ export declare class MigrationDiagram {
|
|
|
59
62
|
private renderBanner;
|
|
60
63
|
private renderChangeBox;
|
|
61
64
|
private renderLegend;
|
|
65
|
+
private build;
|
|
62
66
|
generate(): string;
|
|
63
67
|
/**
|
|
64
68
|
* Write the SVG to a file.
|