@xubylele/schema-forge-core 1.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 (83) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +254 -0
  3. package/dist/core/diff.d.ts +22 -0
  4. package/dist/core/diff.d.ts.map +1 -0
  5. package/dist/core/diff.js +248 -0
  6. package/dist/core/diff.js.map +1 -0
  7. package/dist/core/errors.d.ts +4 -0
  8. package/dist/core/errors.d.ts.map +1 -0
  9. package/dist/core/errors.js +7 -0
  10. package/dist/core/errors.js.map +1 -0
  11. package/dist/core/fs.d.ts +31 -0
  12. package/dist/core/fs.d.ts.map +1 -0
  13. package/dist/core/fs.js +104 -0
  14. package/dist/core/fs.js.map +1 -0
  15. package/dist/core/normalize.d.ts +10 -0
  16. package/dist/core/normalize.d.ts.map +1 -0
  17. package/dist/core/normalize.js +152 -0
  18. package/dist/core/normalize.js.map +1 -0
  19. package/dist/core/parser.d.ts +25 -0
  20. package/dist/core/parser.d.ts.map +1 -0
  21. package/dist/core/parser.js +210 -0
  22. package/dist/core/parser.js.map +1 -0
  23. package/dist/core/paths.d.ts +29 -0
  24. package/dist/core/paths.d.ts.map +1 -0
  25. package/dist/core/paths.js +41 -0
  26. package/dist/core/paths.js.map +1 -0
  27. package/dist/core/sql/apply-ops.d.ts +3 -0
  28. package/dist/core/sql/apply-ops.d.ts.map +1 -0
  29. package/dist/core/sql/apply-ops.js +174 -0
  30. package/dist/core/sql/apply-ops.js.map +1 -0
  31. package/dist/core/sql/load-migrations.d.ts +6 -0
  32. package/dist/core/sql/load-migrations.d.ts.map +1 -0
  33. package/dist/core/sql/load-migrations.js +26 -0
  34. package/dist/core/sql/load-migrations.js.map +1 -0
  35. package/dist/core/sql/parse-migration.d.ts +11 -0
  36. package/dist/core/sql/parse-migration.d.ts.map +1 -0
  37. package/dist/core/sql/parse-migration.js +509 -0
  38. package/dist/core/sql/parse-migration.js.map +1 -0
  39. package/dist/core/sql/schema-to-dsl.d.ts +3 -0
  40. package/dist/core/sql/schema-to-dsl.d.ts.map +1 -0
  41. package/dist/core/sql/schema-to-dsl.js +33 -0
  42. package/dist/core/sql/schema-to-dsl.js.map +1 -0
  43. package/dist/core/sql/split-statements.d.ts +11 -0
  44. package/dist/core/sql/split-statements.d.ts.map +1 -0
  45. package/dist/core/sql/split-statements.js +111 -0
  46. package/dist/core/sql/split-statements.js.map +1 -0
  47. package/dist/core/state-manager.d.ts +17 -0
  48. package/dist/core/state-manager.d.ts.map +1 -0
  49. package/dist/core/state-manager.js +48 -0
  50. package/dist/core/state-manager.js.map +1 -0
  51. package/dist/core/utils.d.ts +30 -0
  52. package/dist/core/utils.d.ts.map +1 -0
  53. package/dist/core/utils.js +45 -0
  54. package/dist/core/utils.js.map +1 -0
  55. package/dist/core/validate.d.ts +20 -0
  56. package/dist/core/validate.d.ts.map +1 -0
  57. package/dist/core/validate.js +154 -0
  58. package/dist/core/validate.js.map +1 -0
  59. package/dist/core/validator.d.ts +16 -0
  60. package/dist/core/validator.d.ts.map +1 -0
  61. package/dist/core/validator.js +126 -0
  62. package/dist/core/validator.js.map +1 -0
  63. package/dist/diff/diff.d.ts +7 -0
  64. package/dist/diff/diff.d.ts.map +1 -0
  65. package/dist/diff/diff.js +75 -0
  66. package/dist/diff/diff.js.map +1 -0
  67. package/dist/generator/sql-generator.d.ts +8 -0
  68. package/dist/generator/sql-generator.d.ts.map +1 -0
  69. package/dist/generator/sql-generator.js +126 -0
  70. package/dist/generator/sql-generator.js.map +1 -0
  71. package/dist/index.d.ts +22 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +29 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/parser/parser.d.ts +3 -0
  76. package/dist/parser/parser.d.ts.map +1 -0
  77. package/dist/parser/parser.js +135 -0
  78. package/dist/parser/parser.js.map +1 -0
  79. package/dist/state/snapshot.d.ts +3 -0
  80. package/dist/state/snapshot.d.ts.map +1 -0
  81. package/dist/state/snapshot.js +22 -0
  82. package/dist/state/snapshot.js.map +1 -0
  83. package/package.json +33 -0
@@ -0,0 +1,509 @@
1
+ import { normalizeDefault } from '../normalize';
2
+ import { splitSqlStatements } from './split-statements';
3
+ const COLUMN_CONSTRAINT_KEYWORDS = new Set([
4
+ 'primary',
5
+ 'unique',
6
+ 'not',
7
+ 'null',
8
+ 'default',
9
+ 'constraint',
10
+ 'references',
11
+ 'check'
12
+ ]);
13
+ function normalizeSqlType(type) {
14
+ return type
15
+ .trim()
16
+ .toLowerCase()
17
+ .replace(/\s+/g, ' ')
18
+ .replace(/\s*\(\s*/g, '(')
19
+ .replace(/\s*,\s*/g, ',')
20
+ .replace(/\s*\)\s*/g, ')');
21
+ }
22
+ function unquoteIdentifier(value) {
23
+ const trimmed = value.trim();
24
+ if (trimmed.startsWith('"') && trimmed.endsWith('"') && trimmed.length >= 2) {
25
+ return trimmed.slice(1, -1).replace(/""/g, '"');
26
+ }
27
+ return trimmed;
28
+ }
29
+ function normalizeIdentifier(identifier) {
30
+ const parts = identifier
31
+ .trim()
32
+ .split('.')
33
+ .map(part => unquoteIdentifier(part))
34
+ .filter(part => part.length > 0);
35
+ const leaf = parts.length > 0 ? parts[parts.length - 1] : identifier.trim();
36
+ return leaf.toLowerCase();
37
+ }
38
+ function removeSqlComments(statement) {
39
+ let result = '';
40
+ let inSingleQuote = false;
41
+ let inDoubleQuote = false;
42
+ let inLineComment = false;
43
+ let inBlockComment = false;
44
+ for (let index = 0; index < statement.length; index++) {
45
+ const char = statement[index];
46
+ const next = index + 1 < statement.length ? statement[index + 1] : '';
47
+ if (inLineComment) {
48
+ if (char === '\n') {
49
+ inLineComment = false;
50
+ result += char;
51
+ }
52
+ continue;
53
+ }
54
+ if (inBlockComment) {
55
+ if (char === '*' && next === '/') {
56
+ inBlockComment = false;
57
+ index++;
58
+ }
59
+ continue;
60
+ }
61
+ if (!inSingleQuote && !inDoubleQuote) {
62
+ if (char === '-' && next === '-') {
63
+ inLineComment = true;
64
+ index++;
65
+ continue;
66
+ }
67
+ if (char === '/' && next === '*') {
68
+ inBlockComment = true;
69
+ index++;
70
+ continue;
71
+ }
72
+ }
73
+ if (char === "'" && !inDoubleQuote) {
74
+ if (inSingleQuote && next === "'") {
75
+ result += "''";
76
+ index++;
77
+ continue;
78
+ }
79
+ inSingleQuote = !inSingleQuote;
80
+ result += char;
81
+ continue;
82
+ }
83
+ if (char === '"' && !inSingleQuote) {
84
+ if (inDoubleQuote && next === '"') {
85
+ result += '""';
86
+ index++;
87
+ continue;
88
+ }
89
+ inDoubleQuote = !inDoubleQuote;
90
+ result += char;
91
+ continue;
92
+ }
93
+ result += char;
94
+ }
95
+ return result.trim();
96
+ }
97
+ function splitTopLevelComma(input) {
98
+ const parts = [];
99
+ let current = '';
100
+ let depth = 0;
101
+ let inSingleQuote = false;
102
+ let inDoubleQuote = false;
103
+ for (let index = 0; index < input.length; index++) {
104
+ const char = input[index];
105
+ const next = index + 1 < input.length ? input[index + 1] : '';
106
+ if (char === "'" && !inDoubleQuote) {
107
+ current += char;
108
+ if (inSingleQuote && next === "'") {
109
+ current += next;
110
+ index++;
111
+ continue;
112
+ }
113
+ inSingleQuote = !inSingleQuote;
114
+ continue;
115
+ }
116
+ if (char === '"' && !inSingleQuote) {
117
+ current += char;
118
+ if (inDoubleQuote && next === '"') {
119
+ current += next;
120
+ index++;
121
+ continue;
122
+ }
123
+ inDoubleQuote = !inDoubleQuote;
124
+ continue;
125
+ }
126
+ if (!inSingleQuote && !inDoubleQuote) {
127
+ if (char === '(') {
128
+ depth++;
129
+ }
130
+ else if (char === ')') {
131
+ depth = Math.max(0, depth - 1);
132
+ }
133
+ else if (char === ',' && depth === 0) {
134
+ const segment = current.trim();
135
+ if (segment.length > 0) {
136
+ parts.push(segment);
137
+ }
138
+ current = '';
139
+ continue;
140
+ }
141
+ }
142
+ current += char;
143
+ }
144
+ const tail = current.trim();
145
+ if (tail.length > 0) {
146
+ parts.push(tail);
147
+ }
148
+ return parts;
149
+ }
150
+ function tokenize(segment) {
151
+ const tokens = [];
152
+ let current = '';
153
+ let depth = 0;
154
+ let inSingleQuote = false;
155
+ let inDoubleQuote = false;
156
+ for (let index = 0; index < segment.length; index++) {
157
+ const char = segment[index];
158
+ const next = index + 1 < segment.length ? segment[index + 1] : '';
159
+ if (char === "'" && !inDoubleQuote) {
160
+ current += char;
161
+ if (inSingleQuote && next === "'") {
162
+ current += next;
163
+ index++;
164
+ continue;
165
+ }
166
+ inSingleQuote = !inSingleQuote;
167
+ continue;
168
+ }
169
+ if (char === '"' && !inSingleQuote) {
170
+ current += char;
171
+ if (inDoubleQuote && next === '"') {
172
+ current += next;
173
+ index++;
174
+ continue;
175
+ }
176
+ inDoubleQuote = !inDoubleQuote;
177
+ continue;
178
+ }
179
+ if (!inSingleQuote && !inDoubleQuote) {
180
+ if (char === '(') {
181
+ depth++;
182
+ }
183
+ else if (char === ')') {
184
+ depth = Math.max(0, depth - 1);
185
+ }
186
+ if (/\s/.test(char) && depth === 0) {
187
+ if (current.length > 0) {
188
+ tokens.push(current);
189
+ current = '';
190
+ }
191
+ continue;
192
+ }
193
+ }
194
+ current += char;
195
+ }
196
+ if (current.length > 0) {
197
+ tokens.push(current);
198
+ }
199
+ return tokens;
200
+ }
201
+ function parseColumnDefinition(segment) {
202
+ const tokens = tokenize(segment);
203
+ if (tokens.length < 2) {
204
+ return null;
205
+ }
206
+ const name = normalizeIdentifier(tokens[0]);
207
+ let cursor = 1;
208
+ const typeTokens = [];
209
+ while (cursor < tokens.length) {
210
+ const lower = tokens[cursor].toLowerCase();
211
+ if (COLUMN_CONSTRAINT_KEYWORDS.has(lower)) {
212
+ break;
213
+ }
214
+ typeTokens.push(tokens[cursor]);
215
+ cursor++;
216
+ }
217
+ if (typeTokens.length === 0) {
218
+ return null;
219
+ }
220
+ const parsed = {
221
+ name,
222
+ type: normalizeSqlType(typeTokens.join(' ')),
223
+ nullable: true
224
+ };
225
+ while (cursor < tokens.length) {
226
+ const lower = tokens[cursor].toLowerCase();
227
+ if (lower === 'primary' && tokens[cursor + 1]?.toLowerCase() === 'key') {
228
+ parsed.primaryKey = true;
229
+ parsed.nullable = false;
230
+ cursor += 2;
231
+ continue;
232
+ }
233
+ if (lower === 'unique') {
234
+ parsed.unique = true;
235
+ cursor++;
236
+ continue;
237
+ }
238
+ if (lower === 'not' && tokens[cursor + 1]?.toLowerCase() === 'null') {
239
+ parsed.nullable = false;
240
+ cursor += 2;
241
+ continue;
242
+ }
243
+ if (lower === 'null') {
244
+ parsed.nullable = true;
245
+ cursor++;
246
+ continue;
247
+ }
248
+ if (lower === 'default') {
249
+ cursor++;
250
+ const defaultTokens = [];
251
+ while (cursor < tokens.length) {
252
+ const probe = tokens[cursor].toLowerCase();
253
+ if (probe === 'constraint' ||
254
+ probe === 'references' ||
255
+ probe === 'check' ||
256
+ (probe === 'not' && tokens[cursor + 1]?.toLowerCase() === 'null') ||
257
+ probe === 'null' ||
258
+ probe === 'unique' ||
259
+ (probe === 'primary' && tokens[cursor + 1]?.toLowerCase() === 'key')) {
260
+ break;
261
+ }
262
+ defaultTokens.push(tokens[cursor]);
263
+ cursor++;
264
+ }
265
+ parsed.default = normalizeDefault(defaultTokens.join(' '));
266
+ continue;
267
+ }
268
+ cursor++;
269
+ }
270
+ return parsed;
271
+ }
272
+ function parseCreateTableConstraint(segment) {
273
+ const normalized = segment.trim().replace(/\s+/g, ' ');
274
+ const constraintMatch = normalized.match(/^constraint\s+([^\s]+)\s+(primary\s+key|unique)\s*\((.+)\)$/i);
275
+ if (constraintMatch) {
276
+ const [, rawName, kind, rawColumns] = constraintMatch;
277
+ const columns = splitTopLevelComma(rawColumns).map(item => normalizeIdentifier(item));
278
+ if (kind.toLowerCase().includes('primary')) {
279
+ return { type: 'PRIMARY_KEY', name: normalizeIdentifier(rawName), columns };
280
+ }
281
+ return { type: 'UNIQUE', name: normalizeIdentifier(rawName), columns };
282
+ }
283
+ const barePk = normalized.match(/^primary\s+key\s*\((.+)\)$/i);
284
+ if (barePk) {
285
+ const columns = splitTopLevelComma(barePk[1]).map(item => normalizeIdentifier(item));
286
+ return { type: 'PRIMARY_KEY', columns };
287
+ }
288
+ const bareUnique = normalized.match(/^unique\s*\((.+)\)$/i);
289
+ if (bareUnique) {
290
+ const columns = splitTopLevelComma(bareUnique[1]).map(item => normalizeIdentifier(item));
291
+ return { type: 'UNIQUE', columns };
292
+ }
293
+ return null;
294
+ }
295
+ function parseAlterTablePrefix(stmt) {
296
+ const match = stmt.match(/^alter\s+table\s+(?:if\s+exists\s+)?(?:only\s+)?(.+)$/i);
297
+ if (!match) {
298
+ return null;
299
+ }
300
+ const remainder = match[1].trim();
301
+ const tokens = tokenize(remainder);
302
+ if (tokens.length < 2) {
303
+ return null;
304
+ }
305
+ const tableToken = tokens[0];
306
+ const table = normalizeIdentifier(tableToken);
307
+ const rest = remainder.slice(tableToken.length).trim();
308
+ return { table, rest };
309
+ }
310
+ export function parseCreateTable(stmt) {
311
+ const match = stmt.match(/^create\s+table\s+(?:if\s+not\s+exists\s+)?(.+?)\s*\((.*)\)$/is);
312
+ if (!match) {
313
+ return null;
314
+ }
315
+ const table = normalizeIdentifier(match[1]);
316
+ const body = match[2];
317
+ const segments = splitTopLevelComma(body);
318
+ const columns = [];
319
+ const constraints = [];
320
+ for (const segment of segments) {
321
+ const constraint = parseCreateTableConstraint(segment);
322
+ if (constraint) {
323
+ constraints.push(constraint);
324
+ continue;
325
+ }
326
+ const column = parseColumnDefinition(segment);
327
+ if (column) {
328
+ columns.push(column);
329
+ }
330
+ }
331
+ return {
332
+ kind: 'CREATE_TABLE',
333
+ table,
334
+ columns,
335
+ constraints
336
+ };
337
+ }
338
+ export function parseAlterTableAddColumn(stmt) {
339
+ const prefix = parseAlterTablePrefix(stmt);
340
+ if (!prefix) {
341
+ return null;
342
+ }
343
+ const match = prefix.rest.match(/^add\s+column\s+(?:if\s+not\s+exists\s+)?(.+)$/i);
344
+ if (!match) {
345
+ return null;
346
+ }
347
+ const column = parseColumnDefinition(match[1]);
348
+ if (!column) {
349
+ return null;
350
+ }
351
+ return { kind: 'ADD_COLUMN', table: prefix.table, column };
352
+ }
353
+ export function parseAlterColumnType(stmt) {
354
+ const prefix = parseAlterTablePrefix(stmt);
355
+ if (!prefix) {
356
+ return null;
357
+ }
358
+ const match = prefix.rest.match(/^alter\s+column\s+([^\s]+)\s+type\s+(.+)$/i);
359
+ if (!match) {
360
+ return null;
361
+ }
362
+ const column = normalizeIdentifier(match[1]);
363
+ const toType = normalizeSqlType(match[2].replace(/\s+using\s+[\s\S]*$/i, '').trim());
364
+ return {
365
+ kind: 'ALTER_COLUMN_TYPE',
366
+ table: prefix.table,
367
+ column,
368
+ toType
369
+ };
370
+ }
371
+ export function parseSetDropNotNull(stmt) {
372
+ const prefix = parseAlterTablePrefix(stmt);
373
+ if (!prefix) {
374
+ return null;
375
+ }
376
+ const setMatch = prefix.rest.match(/^alter\s+column\s+([^\s]+)\s+set\s+not\s+null$/i);
377
+ if (setMatch) {
378
+ return {
379
+ kind: 'SET_NOT_NULL',
380
+ table: prefix.table,
381
+ column: normalizeIdentifier(setMatch[1])
382
+ };
383
+ }
384
+ const dropMatch = prefix.rest.match(/^alter\s+column\s+([^\s]+)\s+drop\s+not\s+null$/i);
385
+ if (dropMatch) {
386
+ return {
387
+ kind: 'DROP_NOT_NULL',
388
+ table: prefix.table,
389
+ column: normalizeIdentifier(dropMatch[1])
390
+ };
391
+ }
392
+ return null;
393
+ }
394
+ export function parseSetDropDefault(stmt) {
395
+ const prefix = parseAlterTablePrefix(stmt);
396
+ if (!prefix) {
397
+ return null;
398
+ }
399
+ const setMatch = prefix.rest.match(/^alter\s+column\s+([^\s]+)\s+set\s+default\s+(.+)$/i);
400
+ if (setMatch) {
401
+ return {
402
+ kind: 'SET_DEFAULT',
403
+ table: prefix.table,
404
+ column: normalizeIdentifier(setMatch[1]),
405
+ expr: normalizeDefault(setMatch[2].trim()) ?? setMatch[2].trim()
406
+ };
407
+ }
408
+ const dropMatch = prefix.rest.match(/^alter\s+column\s+([^\s]+)\s+drop\s+default$/i);
409
+ if (dropMatch) {
410
+ return {
411
+ kind: 'DROP_DEFAULT',
412
+ table: prefix.table,
413
+ column: normalizeIdentifier(dropMatch[1])
414
+ };
415
+ }
416
+ return null;
417
+ }
418
+ export function parseAddDropConstraint(stmt) {
419
+ const prefix = parseAlterTablePrefix(stmt);
420
+ if (!prefix) {
421
+ return null;
422
+ }
423
+ const addMatch = prefix.rest.match(/^add\s+constraint\s+([^\s]+)\s+(primary\s+key|unique)\s*\((.+)\)$/i);
424
+ if (addMatch) {
425
+ const [, rawName, kind, rawColumns] = addMatch;
426
+ const columns = splitTopLevelComma(rawColumns).map(item => normalizeIdentifier(item));
427
+ const constraint = kind.toLowerCase().includes('primary')
428
+ ? { type: 'PRIMARY_KEY', name: normalizeIdentifier(rawName), columns }
429
+ : { type: 'UNIQUE', name: normalizeIdentifier(rawName), columns };
430
+ return {
431
+ kind: 'ADD_CONSTRAINT',
432
+ table: prefix.table,
433
+ constraint
434
+ };
435
+ }
436
+ const dropMatch = prefix.rest.match(/^drop\s+constraint\s+(?:if\s+exists\s+)?([^\s]+)(?:\s+cascade)?$/i);
437
+ if (dropMatch) {
438
+ return {
439
+ kind: 'DROP_CONSTRAINT',
440
+ table: prefix.table,
441
+ name: normalizeIdentifier(dropMatch[1])
442
+ };
443
+ }
444
+ return null;
445
+ }
446
+ export function parseDropColumn(stmt) {
447
+ const prefix = parseAlterTablePrefix(stmt);
448
+ if (!prefix) {
449
+ return null;
450
+ }
451
+ const match = prefix.rest.match(/^drop\s+column\s+(?:if\s+exists\s+)?([^\s]+)(?:\s+cascade)?$/i);
452
+ if (!match) {
453
+ return null;
454
+ }
455
+ return {
456
+ kind: 'DROP_COLUMN',
457
+ table: prefix.table,
458
+ column: normalizeIdentifier(match[1])
459
+ };
460
+ }
461
+ export function parseDropTable(stmt) {
462
+ const match = stmt.match(/^drop\s+table\s+(?:if\s+exists\s+)?([^\s]+)(?:\s+cascade)?$/i);
463
+ if (!match) {
464
+ return null;
465
+ }
466
+ return {
467
+ kind: 'DROP_TABLE',
468
+ table: normalizeIdentifier(match[1])
469
+ };
470
+ }
471
+ const PARSERS = [
472
+ parseCreateTable,
473
+ parseAlterTableAddColumn,
474
+ parseAlterColumnType,
475
+ parseSetDropNotNull,
476
+ parseSetDropDefault,
477
+ parseAddDropConstraint,
478
+ parseDropColumn,
479
+ parseDropTable
480
+ ];
481
+ export function parseMigrationSql(sql) {
482
+ const statements = splitSqlStatements(sql);
483
+ const ops = [];
484
+ const warnings = [];
485
+ for (const raw of statements) {
486
+ const stmt = removeSqlComments(raw).trim();
487
+ if (!stmt) {
488
+ continue;
489
+ }
490
+ let parsed = null;
491
+ for (const parseFn of PARSERS) {
492
+ parsed = parseFn(stmt);
493
+ if (parsed) {
494
+ break;
495
+ }
496
+ }
497
+ if (parsed) {
498
+ ops.push(parsed);
499
+ }
500
+ else {
501
+ warnings.push({
502
+ statement: stmt,
503
+ reason: 'Unsupported or unrecognized statement'
504
+ });
505
+ }
506
+ }
507
+ return { ops, warnings };
508
+ }
509
+ //# sourceMappingURL=parse-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-migration.js","sourceRoot":"","sources":["../../../src/core/sql/parse-migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DatabaseSchema } from '../../types/schema';
2
+ export declare function schemaToDsl(schema: DatabaseSchema): string;
3
+ //# sourceMappingURL=schema-to-dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-to-dsl.d.ts","sourceRoot":"","sources":["../../../src/core/sql/schema-to-dsl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA+BzD,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAoB1D"}
@@ -0,0 +1,33 @@
1
+ function renderColumn(column) {
2
+ const parts = [column.name, column.type];
3
+ if (column.primaryKey) {
4
+ parts.push('pk');
5
+ }
6
+ if (column.unique) {
7
+ parts.push('unique');
8
+ }
9
+ if (column.nullable === false && !column.primaryKey) {
10
+ parts.push('not null');
11
+ }
12
+ if (column.default !== undefined && column.default !== null) {
13
+ parts.push(`default ${column.default}`);
14
+ }
15
+ return ` ${parts.join(' ')}`;
16
+ }
17
+ export function schemaToDsl(schema) {
18
+ const tableNames = Object.keys(schema.tables).sort((left, right) => left.localeCompare(right));
19
+ const blocks = tableNames.map(tableName => {
20
+ const table = schema.tables[tableName];
21
+ const lines = [`table ${table.name} {`];
22
+ for (const column of table.columns) {
23
+ lines.push(renderColumn(column));
24
+ }
25
+ lines.push('}');
26
+ return lines.join('\n');
27
+ });
28
+ if (blocks.length === 0) {
29
+ return '# SchemaForge schema definition\n';
30
+ }
31
+ return `# SchemaForge schema definition\n\n${blocks.join('\n\n')}\n`;
32
+ }
33
+ //# sourceMappingURL=schema-to-dsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-to-dsl.js","sourceRoot":"","sources":["../../../src/core/sql/schema-to-dsl.ts"],"names":[],"mappings":"AAEA,SAAS,YAAY,CAAC,MAOrB;IACC,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAsB;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/F,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,KAAK,GAAa,CAAC,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAElD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAa,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IAED,OAAO,sCAAsC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACvE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Split SQL text into statements by semicolon.
3
+ *
4
+ * Handles semicolons inside:
5
+ * - single-quoted strings
6
+ * - double-quoted identifiers
7
+ * - line/block comments
8
+ * - dollar-quoted blocks
9
+ */
10
+ export declare function splitSqlStatements(sql: string): string[];
11
+ //# sourceMappingURL=split-statements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split-statements.d.ts","sourceRoot":"","sources":["../../../src/core/sql/split-statements.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkHxD"}