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.
Files changed (129) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +32 -24
  3. package/dist/compliance/index.d.ts +2 -0
  4. package/dist/compliance/index.js +13 -1
  5. package/dist/connection-manager.js +13 -1
  6. package/dist/core/expressions.d.ts +58 -0
  7. package/dist/core/expressions.js +83 -0
  8. package/dist/core/hooks-manager.d.ts +179 -0
  9. package/dist/core/hooks-manager.js +291 -0
  10. package/dist/core/types.d.ts +235 -0
  11. package/dist/core/types.js +9 -0
  12. package/dist/decorators/index.d.ts +2 -0
  13. package/dist/decorators/index.js +11 -1
  14. package/dist/diagrams/chen-diagram.d.ts +15 -12
  15. package/dist/diagrams/chen-diagram.js +76 -85
  16. package/dist/diagrams/class-diagram.d.ts +9 -8
  17. package/dist/diagrams/class-diagram.js +60 -82
  18. package/dist/diagrams/core/index.d.ts +13 -0
  19. package/dist/diagrams/core/index.js +33 -0
  20. package/dist/diagrams/core/layout.d.ts +104 -0
  21. package/dist/diagrams/core/layout.js +223 -0
  22. package/dist/diagrams/{svg-dom.d.ts → core/svg.d.ts} +8 -20
  23. package/dist/diagrams/{svg-dom.js → core/svg.js} +21 -29
  24. package/dist/diagrams/core/theme.d.ts +84 -0
  25. package/dist/diagrams/core/theme.js +62 -0
  26. package/dist/diagrams/dependency-diagram.d.ts +15 -14
  27. package/dist/diagrams/dependency-diagram.js +71 -105
  28. package/dist/diagrams/er-diagram.d.ts +13 -26
  29. package/dist/diagrams/er-diagram.js +180 -259
  30. package/dist/diagrams/flow-diagram.d.ts +16 -11
  31. package/dist/diagrams/flow-diagram.js +96 -91
  32. package/dist/diagrams/gantt-diagram.d.ts +10 -5
  33. package/dist/diagrams/gantt-diagram.js +77 -103
  34. package/dist/diagrams/index-diagram.d.ts +10 -10
  35. package/dist/diagrams/index-diagram.js +106 -116
  36. package/dist/diagrams/index.d.ts +6 -9
  37. package/dist/diagrams/index.js +9 -24
  38. package/dist/diagrams/migration-diagram.d.ts +8 -4
  39. package/dist/diagrams/migration-diagram.js +189 -161
  40. package/dist/diagrams/model-diagram.d.ts +34 -34
  41. package/dist/diagrams/model-diagram.js +106 -485
  42. package/dist/diagrams/package-diagram.d.ts +9 -6
  43. package/dist/diagrams/package-diagram.js +64 -101
  44. package/dist/diagrams/relational-diagram.d.ts +12 -10
  45. package/dist/diagrams/relational-diagram.js +87 -114
  46. package/dist/diagrams/schemadoc-diagram.d.ts +8 -8
  47. package/dist/diagrams/schemadoc-diagram.js +71 -93
  48. package/dist/diagrams/sequence-diagram.d.ts +10 -10
  49. package/dist/diagrams/sequence-diagram.js +64 -89
  50. package/dist/diagrams/state-diagram.d.ts +10 -9
  51. package/dist/diagrams/state-diagram.js +69 -92
  52. package/dist/diagrams/tree-diagram.d.ts +11 -5
  53. package/dist/diagrams/tree-diagram.js +41 -65
  54. package/dist/dialects/clickhouse/index.js +15 -0
  55. package/dist/dialects/cockroachdb/index.d.ts +1 -1
  56. package/dist/dialects/cockroachdb/index.js +32 -63
  57. package/dist/dialects/db2/index.js +23 -8
  58. package/dist/dialects/dialect.d.ts +29 -5
  59. package/dist/dialects/duckdb/index.js +9 -2
  60. package/dist/dialects/hana/index.js +22 -5
  61. package/dist/dialects/lock-clause-helper.d.ts +167 -0
  62. package/dist/dialects/lock-clause-helper.js +316 -0
  63. package/dist/dialects/mariadb/index.d.ts +7 -4
  64. package/dist/dialects/mariadb/index.js +36 -60
  65. package/dist/dialects/mssql/index.js +34 -3
  66. package/dist/dialects/mysql/index.d.ts +1 -1
  67. package/dist/dialects/mysql/index.js +17 -45
  68. package/dist/dialects/oracle/index.d.ts +14 -3
  69. package/dist/dialects/oracle/index.js +66 -36
  70. package/dist/dialects/order-expression-helper.d.ts +72 -0
  71. package/dist/dialects/order-expression-helper.js +154 -0
  72. package/dist/dialects/partial-index.d.ts +52 -0
  73. package/dist/dialects/partial-index.js +251 -0
  74. package/dist/dialects/postgres/index.d.ts +1 -1
  75. package/dist/dialects/postgres/index.js +43 -68
  76. package/dist/dialects/redshift/index.js +9 -2
  77. package/dist/dialects/snowflake/index.js +17 -0
  78. package/dist/dialects/spanner/index.js +7 -2
  79. package/dist/dialects/sqlite/driver.d.ts +55 -0
  80. package/dist/dialects/sqlite/driver.js +102 -0
  81. package/dist/dialects/sqlite/index.d.ts +1 -1
  82. package/dist/dialects/sqlite/index.js +49 -27
  83. package/dist/graph/base-graph-dialect.d.ts +24 -3
  84. package/dist/graph/base-graph-dialect.js +43 -2
  85. package/dist/graph/dgraph/index.js +6 -0
  86. package/dist/graph/gremlin/index.d.ts +6 -0
  87. package/dist/graph/gremlin/index.js +12 -1
  88. package/dist/graph/index.d.ts +1 -1
  89. package/dist/graph/neo4j/index.d.ts +2 -0
  90. package/dist/graph/neo4j/index.js +6 -1
  91. package/dist/graph/types.d.ts +12 -1
  92. package/dist/index.d.ts +13 -4
  93. package/dist/index.js +54 -7
  94. package/dist/logging/index.d.ts +10 -0
  95. package/dist/logging/index.js +23 -0
  96. package/dist/logging/query-logging.d.ts +82 -0
  97. package/dist/logging/query-logging.js +102 -0
  98. package/dist/models/decorators.d.ts +39 -3
  99. package/dist/models/decorators.js +74 -0
  100. package/dist/models/eager-load.d.ts +99 -0
  101. package/dist/models/eager-load.js +348 -5
  102. package/dist/models/indexes.d.ts +3 -2
  103. package/dist/models/indexes.js +7 -1
  104. package/dist/models/model.js +69 -43
  105. package/dist/prorm.d.ts +175 -409
  106. package/dist/prorm.js +1142 -557
  107. package/dist/query-builders/order-limit-builder.js +12 -10
  108. package/dist/query-builders/sql-compiler.d.ts +10 -3
  109. package/dist/query-builders/sql-compiler.js +14 -43
  110. package/dist/query-interface.d.ts +2 -1
  111. package/dist/sql-constants.d.ts +44 -0
  112. package/dist/sql-constants.js +138 -1
  113. package/dist/types/index.d.ts +53 -17
  114. package/dist/types/index.js +10 -15
  115. package/dist/types/query-types.d.ts +26 -0
  116. package/dist/types/query-types.js +30 -0
  117. package/package.json +32 -5
  118. package/dist/decorators/belongs-to-many.js +0 -115
  119. package/dist/decorators/belongs-to.js +0 -115
  120. package/dist/decorators/has-many.js +0 -127
  121. package/dist/decorators/has-one.js +0 -116
  122. package/dist/diagrams/palette.d.ts +0 -138
  123. package/dist/diagrams/palette.js +0 -194
  124. package/dist/hooks/hooks-manager.d.ts +0 -189
  125. package/dist/hooks/hooks-manager.js +0 -350
  126. package/dist/hooks/index.d.ts +0 -8
  127. package/dist/hooks/index.js +0 -37
  128. /package/dist/{logging.d.ts → logging/logger.d.ts} +0 -0
  129. /package/dist/{logging.js → logging/logger.js} +0 -0
@@ -1,19 +1,15 @@
1
1
  "use strict";
2
2
  /**
3
- * IndexDiagram an INDEX & CONSTRAINT MAP for a single table.
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 so composite indexes visibly span multiple
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 color + a short badge; each row also shows the index name,
12
- * its access method (btree/hash/gin) and whether it is unique.
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 palette_1 = require("./palette");
62
- const svg_dom_1 = require("./svg-dom");
63
- // ─── Industry design system ────────────────────────────────────────────────
64
- // Barlow / JetBrains Mono typography, hairline borders and square "blueprint"
65
- // corners are fixed by the Industry spec; accent + surface colours still route
66
- // through resolveAccent / resolveTheme so --color / --theme keep working.
67
- const IND_FONT_HEAD = '"Barlow Condensed", system-ui, sans-serif';
68
- const IND_FONT_BODY = '"Barlow", system-ui, sans-serif';
69
- const IND_FONT_MONO = 'ui-monospace, "JetBrains Mono", "SF Mono", Menlo, monospace';
70
- const IND_HAIRLINE = 'rgba(29,31,32,0.16)';
71
- 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');";
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 kindStyle(kind) {
84
- return KIND_STYLES[kind ?? 'INDEX'] ?? KIND_STYLES.INDEX;
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
- generate() {
102
- const { table, columns, indexes, title, theme, color } = this.opts;
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 uid = table.replace(/\W/g, '') || 'tbl';
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
- // ── Background + embedded Industry web-fonts ────────────────────────────
135
- svg.child('rect', { width: svgW, height: svgH, fill: t.canvasBg });
136
- svg.child('style').text(IND_FONT_IMPORT);
137
- // ── Header bar (solid accent — blueprint label bar, no gradient) ────────
138
- svg.child('rect', { x: PAD, y: PAD, width: contentW - PAD, height: HDR, fill: accent.mid });
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': IND_FONT_HEAD,
144
- 'font-size': 20,
145
- 'font-weight': 600,
146
- fill: '#FFFFFF',
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 · ${table}`);
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': IND_FONT_MONO,
154
- 'font-size': 11,
155
- fill: 'rgba(255,255,255,0.8)',
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 · ${indexes.length} indexes`);
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': IND_FONT_MONO,
164
- 'font-size': 12,
165
- 'font-weight': 700,
166
- fill: 'rgba(255,255,255,0.92)',
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
- // ── Column strip label ──────────────────────────────────────────────────
156
+ // Column strip label.
171
157
  svg
172
158
  .child('text', {
173
159
  x: stripX,
174
160
  y: stripY - 8,
175
- 'font-family': IND_FONT_BODY,
176
- 'font-size': 11,
177
- 'font-weight': 700,
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: t.textSecondary,
165
+ fill: theme_1.INK.muted,
180
166
  })
181
167
  .text('COLUMNS');
182
- // ── Column chips ────────────────────────────────────────────────────────
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: t.cardBg,
191
- stroke: t.border,
192
- 'stroke-width': 1,
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': IND_FONT_MONO,
199
- 'font-size': 13,
200
- 'font-weight': 700,
201
- fill: t.textPrimary,
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': IND_FONT_MONO,
211
- 'font-size': 10,
212
- fill: t.textSecondary,
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
- // ── Index / constraint rows with spanning brackets ──────────────────────
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: t.rowAlt,
217
+ fill: theme_1.INK.wash,
237
218
  });
238
219
  }
239
- // ── Left label block ──
240
- // Badge chip.
241
- const badgeBg = isPrimary ? accent.light : style.bg;
242
- const badgeFg = isPrimary ? accent.text : style.color;
243
- svg.child('rect', { x: PAD + 8, y: rowMid - 12, width: 30, height: 24, fill: badgeBg });
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': IND_FONT_MONO,
249
- 'font-size': 11,
250
- 'font-weight': 600,
251
- fill: badgeFg,
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(style.badge);
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': IND_FONT_MONO,
261
- 'font-size': 12,
262
- 'font-weight': 700,
263
- fill: t.textPrimary,
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': IND_FONT_MONO,
278
- 'font-size': 10,
279
- fill: t.textSecondary,
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
- // ── Spanning bracket over covered columns ──
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: lineColor,
298
- 'stroke-width': isPrimary ? 3 : 2,
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: lineColor,
308
- 'stroke-width': 1.5,
292
+ stroke: theme_1.INK.line,
293
+ 'stroke-width': theme_1.STROKE.hair,
309
294
  fill: 'none',
310
- opacity: 0.85,
311
295
  });
312
- // Node dot where the connector meets the spine.
313
- svg.child('circle', { cx: cxp, cy: bracketY, r: isPrimary ? 5 : 4, fill: lineColor });
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) for composite indexes so column order reads.
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': IND_FONT_MONO,
326
- 'font-size': 9,
327
- 'font-weight': 700,
328
- fill: lineColor,
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.toString('Generated by ts-prorm-orm IndexDiagram');
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;
@@ -3,10 +3,10 @@
3
3
  *
4
4
  * SVG diagram generators for ORM models and ER schemas.
5
5
  *
6
- * ─── Quick-start ────────────────────────────────────────────────────────
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
- * ─── JSON spec format ───────────────────────────────────────────────────
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
  /**
@@ -4,10 +4,10 @@
4
4
  *
5
5
  * SVG diagram generators for ORM models and ER schemas.
6
6
  *
7
- * ─── Quick-start ────────────────────────────────────────────────────────
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
- * ─── JSON spec format ───────────────────────────────────────────────────
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.BADGE_TINTS = exports.FONT_IMPORT = exports.FONTS = exports.INDUSTRY = exports.ACCENT_PALETTES = exports.accent2Of = exports.rotatedPalettes = exports.resolveTheme = exports.resolveAccent = exports.El = exports.SvgDocument = 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;
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
- // ─── Extended diagram generators (all built on the shared DOM SVG builder) ──
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
- // Shared DOM SVG builder + palette (exposed for custom generators)
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 generates an SVG showing database schema changes.
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
- * - Color-coded change indicators: green (added), red (removed), yellow (modified)
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
- /** Theme */
43
+ /**
44
+ * Accepted for backward compatibility and ignored: diagrams render in a
45
+ * single monochrome theme.
46
+ */
44
47
  theme?: 'light' | 'dark';
45
- /** Custom accent color */
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.