@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,75 @@
1
+ export function getTableNamesFromState(state) {
2
+ return new Set(Object.keys(state.tables));
3
+ }
4
+ export function getTableNamesFromSchema(schema) {
5
+ return new Set(Object.keys(schema.tables));
6
+ }
7
+ export function getColumnNamesFromState(stateColumns) {
8
+ return new Set(Object.keys(stateColumns));
9
+ }
10
+ export function getColumnNamesFromSchema(dbColumns) {
11
+ return new Set(dbColumns.map(column => column.name));
12
+ }
13
+ function getSortedNames(names) {
14
+ return Array.from(names).sort((a, b) => a.localeCompare(b));
15
+ }
16
+ export function diffSchemas(oldSnapshot, newSchema) {
17
+ const operations = [];
18
+ const oldTableNames = getTableNamesFromState(oldSnapshot);
19
+ const newTableNames = getTableNamesFromSchema(newSchema);
20
+ const sortedNewTableNames = getSortedNames(newTableNames);
21
+ const sortedOldTableNames = getSortedNames(oldTableNames);
22
+ for (const tableName of sortedNewTableNames) {
23
+ if (!oldTableNames.has(tableName)) {
24
+ operations.push({
25
+ kind: 'create_table',
26
+ table: newSchema.tables[tableName],
27
+ });
28
+ }
29
+ }
30
+ const commonTableNames = sortedNewTableNames.filter(tableName => oldTableNames.has(tableName));
31
+ for (const tableName of commonTableNames) {
32
+ const newTable = newSchema.tables[tableName];
33
+ const oldTable = oldSnapshot.tables[tableName];
34
+ if (!newTable || !oldTable) {
35
+ continue;
36
+ }
37
+ const oldColumnNames = getColumnNamesFromState(oldTable.columns);
38
+ for (const column of newTable.columns) {
39
+ if (!oldColumnNames.has(column.name)) {
40
+ operations.push({
41
+ kind: 'add_column',
42
+ tableName,
43
+ column,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ for (const tableName of commonTableNames) {
49
+ const newTable = newSchema.tables[tableName];
50
+ const oldTable = oldSnapshot.tables[tableName];
51
+ if (!newTable || !oldTable) {
52
+ continue;
53
+ }
54
+ const newColumnNames = getColumnNamesFromSchema(newTable.columns);
55
+ for (const columnName of Object.keys(oldTable.columns)) {
56
+ if (!newColumnNames.has(columnName)) {
57
+ operations.push({
58
+ kind: 'drop_column',
59
+ tableName,
60
+ columnName,
61
+ });
62
+ }
63
+ }
64
+ }
65
+ for (const tableName of sortedOldTableNames) {
66
+ if (!newTableNames.has(tableName)) {
67
+ operations.push({
68
+ kind: 'drop_table',
69
+ tableName,
70
+ });
71
+ }
72
+ }
73
+ return { operations };
74
+ }
75
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DiffResult } from '../types/schema';
2
+ export type Provider = 'supabase' | 'postgres';
3
+ export interface SqlConfig {
4
+ uuidDefault?: string;
5
+ timestampDefault?: string;
6
+ }
7
+ export declare function generateSql(diff: DiffResult, provider: Provider, sqlConfig?: SqlConfig): string;
8
+ //# sourceMappingURL=sql-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-generator.d.ts","sourceRoot":"","sources":["../../src/generator/sql-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAG5E,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,CAAC,EAAE,SAAS,GACpB,MAAM,CAWR"}
@@ -0,0 +1,126 @@
1
+ import { legacyPkName, legacyUqName, pkName, uqName } from '../core/normalize';
2
+ export function generateSql(diff, provider, sqlConfig) {
3
+ const statements = [];
4
+ for (const operation of diff.operations) {
5
+ const sql = generateOperation(operation, provider, sqlConfig);
6
+ if (sql) {
7
+ statements.push(sql);
8
+ }
9
+ }
10
+ return statements.join('\n\n');
11
+ }
12
+ function generateOperation(operation, provider, sqlConfig) {
13
+ switch (operation.kind) {
14
+ case 'create_table':
15
+ return generateCreateTable(operation.table, provider, sqlConfig);
16
+ case 'drop_table':
17
+ return generateDropTable(operation.tableName);
18
+ case 'column_type_changed':
19
+ return generateAlterColumnType(operation.tableName, operation.columnName, operation.toType);
20
+ case 'column_nullability_changed':
21
+ return generateAlterColumnNullability(operation.tableName, operation.columnName, operation.to);
22
+ case 'add_column':
23
+ return generateAddColumn(operation.tableName, operation.column, provider, sqlConfig);
24
+ case 'column_default_changed':
25
+ return generateAlterColumnDefault(operation.tableName, operation.columnName, operation.toDefault);
26
+ case 'drop_column':
27
+ return generateDropColumn(operation.tableName, operation.columnName);
28
+ case 'column_unique_changed':
29
+ return operation.to
30
+ ? generateAddUniqueConstraint(operation.tableName, operation.columnName)
31
+ : generateDropUniqueConstraint(operation.tableName, operation.columnName);
32
+ case 'drop_primary_key_constraint':
33
+ return generateDropPrimaryKeyConstraint(operation.tableName);
34
+ case 'add_primary_key_constraint':
35
+ return generateAddPrimaryKeyConstraint(operation.tableName, operation.columnName);
36
+ }
37
+ }
38
+ function generateCreateTable(table, provider, sqlConfig) {
39
+ const columnDefs = table.columns.map(col => generateColumnDefinition(col, provider, sqlConfig));
40
+ const lines = ['CREATE TABLE ' + table.name + ' ('];
41
+ columnDefs.forEach((colDef, index) => {
42
+ const isLast = index === columnDefs.length - 1;
43
+ lines.push(' ' + colDef + (isLast ? '' : ','));
44
+ });
45
+ lines.push(');');
46
+ return lines.join('\n');
47
+ }
48
+ function generateColumnDefinition(column, provider, sqlConfig) {
49
+ const parts = [column.name, column.type];
50
+ // Foreign key inline
51
+ if (column.foreignKey) {
52
+ parts.push(`references ${column.foreignKey.table}(${column.foreignKey.column})`);
53
+ }
54
+ // Primary key
55
+ if (column.primaryKey) {
56
+ parts.push('primary key');
57
+ }
58
+ // Unique
59
+ if (column.unique) {
60
+ parts.push('unique');
61
+ }
62
+ // Nullable
63
+ if (column.nullable === false) {
64
+ parts.push('not null');
65
+ }
66
+ // Default
67
+ if (column.default !== undefined) {
68
+ parts.push('default ' + column.default);
69
+ }
70
+ else if (column.type === 'uuid' &&
71
+ column.primaryKey &&
72
+ provider === 'supabase') {
73
+ parts.push('default gen_random_uuid()');
74
+ }
75
+ return parts.join(' ');
76
+ }
77
+ function generateDropTable(tableName) {
78
+ return `DROP TABLE ${tableName};`;
79
+ }
80
+ function generateAddColumn(tableName, column, provider, sqlConfig) {
81
+ const colDef = generateColumnDefinition(column, provider, sqlConfig);
82
+ return `ALTER TABLE ${tableName} ADD COLUMN ${colDef};`;
83
+ }
84
+ function generateDropColumn(tableName, columnName) {
85
+ return `ALTER TABLE ${tableName} DROP COLUMN ${columnName};`;
86
+ }
87
+ function generateAlterColumnType(tableName, columnName, newType) {
88
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} TYPE ${newType} USING ${columnName}::${newType};`;
89
+ }
90
+ function generateAddUniqueConstraint(tableName, columnName) {
91
+ const deterministicConstraintName = uqName(tableName, columnName);
92
+ return `ALTER TABLE ${tableName} ADD CONSTRAINT ${deterministicConstraintName} UNIQUE (${columnName});`;
93
+ }
94
+ function generateDropUniqueConstraint(tableName, columnName) {
95
+ const deterministicConstraintName = uqName(tableName, columnName);
96
+ const fallbackConstraintName = legacyUqName(tableName, columnName);
97
+ return generateDropConstraintStatements(tableName, [deterministicConstraintName, fallbackConstraintName]);
98
+ }
99
+ function generateDropPrimaryKeyConstraint(tableName) {
100
+ const deterministicConstraintName = pkName(tableName);
101
+ const fallbackConstraintName = legacyPkName(tableName);
102
+ return generateDropConstraintStatements(tableName, [deterministicConstraintName, fallbackConstraintName]);
103
+ }
104
+ function generateAddPrimaryKeyConstraint(tableName, columnName) {
105
+ const deterministicConstraintName = pkName(tableName);
106
+ return `ALTER TABLE ${tableName} ADD CONSTRAINT ${deterministicConstraintName} PRIMARY KEY (${columnName});`;
107
+ }
108
+ function generateDropConstraintStatements(tableName, constraintNames) {
109
+ const uniqueConstraintNames = Array.from(new Set(constraintNames));
110
+ return uniqueConstraintNames
111
+ .map(constraintName => `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${constraintName};`)
112
+ .join('\n');
113
+ }
114
+ function generateAlterColumnDefault(tableName, columnName, newDefault) {
115
+ if (newDefault === null) {
116
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP DEFAULT;`;
117
+ }
118
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET DEFAULT ${newDefault};`;
119
+ }
120
+ function generateAlterColumnNullability(tableName, columnName, toNullable) {
121
+ if (toNullable) {
122
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP NOT NULL;`;
123
+ }
124
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET NOT NULL;`;
125
+ }
126
+ //# sourceMappingURL=sql-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-generator.js","sourceRoot":"","sources":["../../src/generator/sql-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export { parseSchema } from './core/parser';
2
+ export { diffSchemas, getTableNamesFromState, getTableNamesFromSchema, getColumnNamesFromState, getColumnNamesFromSchema } from './core/diff';
3
+ export { validateSchema } from './core/validator';
4
+ export { validateSchemaChanges, toValidationReport } from './core/validate';
5
+ export type { Finding, ValidationReport, Severity } from './core/validate';
6
+ export { schemaToState, loadState, saveState } from './core/state-manager';
7
+ export { generateSql } from './generator/sql-generator';
8
+ export type { Provider, SqlConfig } from './generator/sql-generator';
9
+ export { parseMigrationSql, parseCreateTable, parseAlterTableAddColumn, parseAlterColumnType, parseSetDropNotNull, parseSetDropDefault, parseAddDropConstraint, parseDropColumn, parseDropTable } from './core/sql/parse-migration';
10
+ export { applySqlOps } from './core/sql/apply-ops';
11
+ export { schemaToDsl } from './core/sql/schema-to-dsl';
12
+ export { loadMigrationSqlInput } from './core/sql/load-migrations';
13
+ export type { MigrationSqlInput } from './core/sql/load-migrations';
14
+ export { splitSqlStatements } from './core/sql/split-statements';
15
+ export { ensureDir, fileExists, readTextFile, writeTextFile, readJsonFile, writeJsonFile, findFiles } from './core/fs';
16
+ export { normalizeIdent, pkName, uqName, legacyPkName, legacyUqName, normalizeDefault } from './core/normalize';
17
+ export { getProjectRoot, getSchemaForgeDir, getSchemaFilePath, getConfigPath, getStatePath } from './core/paths';
18
+ export { nowTimestamp, slugifyName } from './core/utils';
19
+ export { SchemaValidationError } from './core/errors';
20
+ export * from './types/schema';
21
+ export type { SqlOp, ParsedColumn, ParsedConstraint, ParseWarning, ParseResult, ApplySqlOpsResult } from './types/sql';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC9I,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGrE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACpO,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGjE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGvH,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGhH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ // Core parsing and schema functionality
2
+ export { parseSchema } from './core/parser';
3
+ // Diff and validation
4
+ export { diffSchemas, getTableNamesFromState, getTableNamesFromSchema, getColumnNamesFromState, getColumnNamesFromSchema } from './core/diff';
5
+ export { validateSchema } from './core/validator';
6
+ export { validateSchemaChanges, toValidationReport } from './core/validate';
7
+ // State management
8
+ export { schemaToState, loadState, saveState } from './core/state-manager';
9
+ // SQL Generation
10
+ export { generateSql } from './generator/sql-generator';
11
+ // SQL Parsing and Import
12
+ export { parseMigrationSql, parseCreateTable, parseAlterTableAddColumn, parseAlterColumnType, parseSetDropNotNull, parseSetDropDefault, parseAddDropConstraint, parseDropColumn, parseDropTable } from './core/sql/parse-migration';
13
+ export { applySqlOps } from './core/sql/apply-ops';
14
+ export { schemaToDsl } from './core/sql/schema-to-dsl';
15
+ export { loadMigrationSqlInput } from './core/sql/load-migrations';
16
+ export { splitSqlStatements } from './core/sql/split-statements';
17
+ // File system utilities
18
+ export { ensureDir, fileExists, readTextFile, writeTextFile, readJsonFile, writeJsonFile, findFiles } from './core/fs';
19
+ // Normalization utilities
20
+ export { normalizeIdent, pkName, uqName, legacyPkName, legacyUqName, normalizeDefault } from './core/normalize';
21
+ // Path utilities
22
+ export { getProjectRoot, getSchemaForgeDir, getSchemaFilePath, getConfigPath, getStatePath } from './core/paths';
23
+ // General utilities
24
+ export { nowTimestamp, slugifyName } from './core/utils';
25
+ // Errors
26
+ export { SchemaValidationError } from './core/errors';
27
+ // Types
28
+ export * from './types/schema';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC9I,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG5E,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE3E,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACpO,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvH,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhH,iBAAiB;AACjB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjH,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,SAAS;AACT,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,QAAQ;AACR,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DatabaseSchema } from '../types/schema';
2
+ export declare function parseSchema(source: string): DatabaseSchema;
3
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAqL1D"}
@@ -0,0 +1,135 @@
1
+ export function parseSchema(source) {
2
+ const lines = source.split('\n');
3
+ const tables = {};
4
+ let currentLine = 0;
5
+ const validColumnTypes = new Set([
6
+ 'uuid',
7
+ 'varchar',
8
+ 'text',
9
+ 'int',
10
+ 'boolean',
11
+ 'timestamptz',
12
+ 'date',
13
+ ]);
14
+ function cleanLine(line) {
15
+ const commentIndex = line.search(/(?:\/\/|#)/);
16
+ if (commentIndex !== -1) {
17
+ line = line.substring(0, commentIndex);
18
+ }
19
+ return line.trim();
20
+ }
21
+ function parseForeignKey(fkRef, lineNum) {
22
+ const parts = fkRef.split('.');
23
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
24
+ throw new Error(`Line ${lineNum}: Invalid foreign key format '${fkRef}'. Expected format: table.column`);
25
+ }
26
+ return {
27
+ table: parts[0],
28
+ column: parts[1],
29
+ };
30
+ }
31
+ function parseColumn(line, lineNum) {
32
+ const tokens = line.split(/\s+/).filter(t => t.length > 0);
33
+ if (tokens.length < 2) {
34
+ throw new Error(`Line ${lineNum}: Invalid column definition. Expected: <name> <type> [modifiers...]`);
35
+ }
36
+ const colName = tokens[0];
37
+ const colType = tokens[1];
38
+ if (!validColumnTypes.has(colType)) {
39
+ throw new Error(`Line ${lineNum}: Invalid column type '${colType}'. Valid types: ${Array.from(validColumnTypes).join(', ')}`);
40
+ }
41
+ const column = {
42
+ name: colName,
43
+ type: colType,
44
+ };
45
+ let i = 2;
46
+ while (i < tokens.length) {
47
+ const modifier = tokens[i];
48
+ switch (modifier) {
49
+ case 'pk':
50
+ column.primaryKey = true;
51
+ i++;
52
+ break;
53
+ case 'unique':
54
+ column.unique = true;
55
+ i++;
56
+ break;
57
+ case 'nullable':
58
+ column.nullable = true;
59
+ i++;
60
+ break;
61
+ case 'default':
62
+ i++;
63
+ if (i >= tokens.length) {
64
+ throw new Error(`Line ${lineNum}: 'default' modifier requires a value`);
65
+ }
66
+ column.default = tokens[i];
67
+ i++;
68
+ break;
69
+ case 'fk':
70
+ i++;
71
+ if (i >= tokens.length) {
72
+ throw new Error(`Line ${lineNum}: 'fk' modifier requires a table.column reference`);
73
+ }
74
+ column.foreignKey = parseForeignKey(tokens[i], lineNum);
75
+ i++;
76
+ break;
77
+ default:
78
+ throw new Error(`Line ${lineNum}: Unknown modifier '${modifier}'`);
79
+ }
80
+ }
81
+ return column;
82
+ }
83
+ function parseTableBlock(startLine) {
84
+ const firstLine = cleanLine(lines[startLine]);
85
+ const match = firstLine.match(/^table\s+(\w+)\s*\{?\s*$/);
86
+ if (!match) {
87
+ throw new Error(`Line ${startLine + 1}: Invalid table definition. Expected: table <name> {`);
88
+ }
89
+ const tableName = match[1];
90
+ if (tables[tableName]) {
91
+ throw new Error(`Line ${startLine + 1}: Duplicate table definition '${tableName}'`);
92
+ }
93
+ const columns = [];
94
+ let lineIdx = startLine + 1;
95
+ let foundClosingBrace = false;
96
+ while (lineIdx < lines.length) {
97
+ const cleaned = cleanLine(lines[lineIdx]);
98
+ if (!cleaned) {
99
+ lineIdx++;
100
+ continue;
101
+ }
102
+ if (cleaned === '}') {
103
+ foundClosingBrace = true;
104
+ break;
105
+ }
106
+ const column = parseColumn(cleaned, lineIdx + 1);
107
+ columns.push(column);
108
+ lineIdx++;
109
+ }
110
+ if (!foundClosingBrace) {
111
+ throw new Error(`Line ${startLine + 1}: Table '${tableName}' block not closed (missing '}')`);
112
+ }
113
+ tables[tableName] = {
114
+ name: tableName,
115
+ columns,
116
+ };
117
+ return lineIdx;
118
+ }
119
+ while (currentLine < lines.length) {
120
+ const cleaned = cleanLine(lines[currentLine]);
121
+ if (!cleaned) {
122
+ currentLine++;
123
+ continue;
124
+ }
125
+ if (cleaned.startsWith('table ')) {
126
+ currentLine = parseTableBlock(currentLine);
127
+ }
128
+ else {
129
+ throw new Error(`Line ${currentLine + 1}: Unexpected content '${cleaned}'. Expected table definition.`);
130
+ }
131
+ currentLine++;
132
+ }
133
+ return { tables };
134
+ }
135
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DatabaseSchema, StateFile } from '../types/schema';
2
+ export declare function createSnapshot(schema: DatabaseSchema): StateFile;
3
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/state/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,SAAS,EAEV,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAwBhE"}
@@ -0,0 +1,22 @@
1
+ export function createSnapshot(schema) {
2
+ const tables = {};
3
+ for (const [tableName, table] of Object.entries(schema.tables)) {
4
+ const columns = {};
5
+ for (const column of table.columns) {
6
+ columns[column.name] = {
7
+ type: column.type,
8
+ ...(column.primaryKey !== undefined && { primaryKey: column.primaryKey }),
9
+ ...(column.unique !== undefined && { unique: column.unique }),
10
+ ...(column.nullable !== undefined && { nullable: column.nullable }),
11
+ ...(column.default !== undefined && { default: column.default }),
12
+ ...(column.foreignKey !== undefined && { foreignKey: column.foreignKey }),
13
+ };
14
+ }
15
+ tables[tableName] = { columns };
16
+ }
17
+ return {
18
+ version: 1,
19
+ tables,
20
+ };
21
+ }
22
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/state/snapshot.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,MAAM,MAAM,GAA+B,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAgC,EAAE,CAAC;QAEhD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACnE,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChE,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;aAC1E,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;QACV,MAAM;KACP,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@xubylele/schema-forge-core",
3
+ "version": "1.0.0",
4
+ "description": "Core engine for Schema Forge DSL parsing, diffing and SQL generation",
5
+ "license": "ISC",
6
+ "author": "xubylele <diazxavier27@gmail.com>",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "test": "vitest run",
25
+ "dev": "tsc -w"
26
+ },
27
+ "devDependencies": {
28
+ "@changesets/cli": "^2.29.8",
29
+ "@types/node": "^20.0.0",
30
+ "typescript": "^5.0.0",
31
+ "vitest": "^4.0.18"
32
+ }
33
+ }