@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.
- package/LICENSE +15 -0
- package/README.md +254 -0
- package/dist/core/diff.d.ts +22 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +248 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/errors.d.ts +4 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +7 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fs.d.ts +31 -0
- package/dist/core/fs.d.ts.map +1 -0
- package/dist/core/fs.js +104 -0
- package/dist/core/fs.js.map +1 -0
- package/dist/core/normalize.d.ts +10 -0
- package/dist/core/normalize.d.ts.map +1 -0
- package/dist/core/normalize.js +152 -0
- package/dist/core/normalize.js.map +1 -0
- package/dist/core/parser.d.ts +25 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +210 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/paths.d.ts +29 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +41 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/sql/apply-ops.d.ts +3 -0
- package/dist/core/sql/apply-ops.d.ts.map +1 -0
- package/dist/core/sql/apply-ops.js +174 -0
- package/dist/core/sql/apply-ops.js.map +1 -0
- package/dist/core/sql/load-migrations.d.ts +6 -0
- package/dist/core/sql/load-migrations.d.ts.map +1 -0
- package/dist/core/sql/load-migrations.js +26 -0
- package/dist/core/sql/load-migrations.js.map +1 -0
- package/dist/core/sql/parse-migration.d.ts +11 -0
- package/dist/core/sql/parse-migration.d.ts.map +1 -0
- package/dist/core/sql/parse-migration.js +509 -0
- package/dist/core/sql/parse-migration.js.map +1 -0
- package/dist/core/sql/schema-to-dsl.d.ts +3 -0
- package/dist/core/sql/schema-to-dsl.d.ts.map +1 -0
- package/dist/core/sql/schema-to-dsl.js +33 -0
- package/dist/core/sql/schema-to-dsl.js.map +1 -0
- package/dist/core/sql/split-statements.d.ts +11 -0
- package/dist/core/sql/split-statements.d.ts.map +1 -0
- package/dist/core/sql/split-statements.js +111 -0
- package/dist/core/sql/split-statements.js.map +1 -0
- package/dist/core/state-manager.d.ts +17 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +48 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/core/utils.d.ts +30 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +45 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/core/validate.d.ts +20 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +154 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/core/validator.d.ts +16 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +126 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/diff/diff.d.ts +7 -0
- package/dist/diff/diff.d.ts.map +1 -0
- package/dist/diff/diff.js +75 -0
- package/dist/diff/diff.js.map +1 -0
- package/dist/generator/sql-generator.d.ts +8 -0
- package/dist/generator/sql-generator.d.ts.map +1 -0
- package/dist/generator/sql-generator.js +126 -0
- package/dist/generator/sql-generator.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/parser.d.ts +3 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +135 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/state/snapshot.d.ts +3 -0
- package/dist/state/snapshot.d.ts.map +1 -0
- package/dist/state/snapshot.js +22 -0
- package/dist/state/snapshot.js.map +1 -0
- package/package.json +33 -0
package/dist/core/fs.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Ensure a directory exists, creating it if necessary
|
|
5
|
+
*/
|
|
6
|
+
export async function ensureDir(dirPath) {
|
|
7
|
+
try {
|
|
8
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
throw new Error(`Failed to create directory ${dirPath}: ${error}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if a file exists
|
|
16
|
+
*/
|
|
17
|
+
export async function fileExists(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
await fs.access(filePath);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Read a text file with UTF-8 encoding
|
|
28
|
+
*/
|
|
29
|
+
export async function readTextFile(filePath) {
|
|
30
|
+
try {
|
|
31
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error(`Failed to read file ${filePath}: ${error}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Write a text file with UTF-8 encoding
|
|
39
|
+
*/
|
|
40
|
+
export async function writeTextFile(filePath, content) {
|
|
41
|
+
try {
|
|
42
|
+
// Ensure parent directory exists
|
|
43
|
+
const dir = path.dirname(filePath);
|
|
44
|
+
await ensureDir(dir);
|
|
45
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw new Error(`Failed to write file ${filePath}: ${error}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Read a JSON file with UTF-8 encoding
|
|
53
|
+
* Returns fallback value if file doesn't exist
|
|
54
|
+
*/
|
|
55
|
+
export async function readJsonFile(filePath, fallback) {
|
|
56
|
+
try {
|
|
57
|
+
const exists = await fileExists(filePath);
|
|
58
|
+
if (!exists) {
|
|
59
|
+
return fallback;
|
|
60
|
+
}
|
|
61
|
+
const content = await readTextFile(filePath);
|
|
62
|
+
return JSON.parse(content);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw new Error(`Failed to read JSON file ${filePath}: ${error}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Write a JSON file with UTF-8 encoding
|
|
70
|
+
* Pretty-prints with 2-space indentation
|
|
71
|
+
*/
|
|
72
|
+
export async function writeJsonFile(filePath, data) {
|
|
73
|
+
try {
|
|
74
|
+
const content = JSON.stringify(data, null, 2);
|
|
75
|
+
await writeTextFile(filePath, content);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new Error(`Failed to write JSON file ${filePath}: ${error}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Find files matching a pattern recursively
|
|
83
|
+
*/
|
|
84
|
+
export async function findFiles(dirPath, pattern) {
|
|
85
|
+
const results = [];
|
|
86
|
+
try {
|
|
87
|
+
const items = await fs.readdir(dirPath, { withFileTypes: true });
|
|
88
|
+
for (const item of items) {
|
|
89
|
+
const fullPath = path.join(dirPath, item.name);
|
|
90
|
+
if (item.isDirectory()) {
|
|
91
|
+
const subResults = await findFiles(fullPath, pattern);
|
|
92
|
+
results.push(...subResults);
|
|
93
|
+
}
|
|
94
|
+
else if (item.isFile() && pattern.test(item.name)) {
|
|
95
|
+
results.push(fullPath);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw new Error(`Failed to find files in ${dirPath}: ${error}`);
|
|
101
|
+
}
|
|
102
|
+
return results;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/core/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize identifiers for deterministic generated names.
|
|
3
|
+
*/
|
|
4
|
+
export declare function normalizeIdent(input: string): string;
|
|
5
|
+
export declare function pkName(table: string): string;
|
|
6
|
+
export declare function uqName(table: string, column: string): string;
|
|
7
|
+
export declare function legacyPkName(table: string): string;
|
|
8
|
+
export declare function legacyUqName(table: string, column: string): string;
|
|
9
|
+
export declare function normalizeDefault(expr: string | null | undefined): string | null;
|
|
10
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/core/normalize.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElE;AAkJD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAa/E"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize identifiers for deterministic generated names.
|
|
3
|
+
*/
|
|
4
|
+
export function normalizeIdent(input) {
|
|
5
|
+
return input
|
|
6
|
+
.trim()
|
|
7
|
+
.toLowerCase()
|
|
8
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
9
|
+
.replace(/_+/g, '_')
|
|
10
|
+
.replace(/^_+|_+$/g, '');
|
|
11
|
+
}
|
|
12
|
+
export function pkName(table) {
|
|
13
|
+
return `pk_${normalizeIdent(table)}`;
|
|
14
|
+
}
|
|
15
|
+
export function uqName(table, column) {
|
|
16
|
+
return `uq_${normalizeIdent(table)}_${normalizeIdent(column)}`;
|
|
17
|
+
}
|
|
18
|
+
export function legacyPkName(table) {
|
|
19
|
+
return `${normalizeIdent(table)}_pkey`;
|
|
20
|
+
}
|
|
21
|
+
export function legacyUqName(table, column) {
|
|
22
|
+
return `${normalizeIdent(table)}_${normalizeIdent(column)}_key`;
|
|
23
|
+
}
|
|
24
|
+
function normalizeSpacesOutsideQuotes(value) {
|
|
25
|
+
let result = '';
|
|
26
|
+
let inSingleQuote = false;
|
|
27
|
+
let inDoubleQuote = false;
|
|
28
|
+
let pendingSpace = false;
|
|
29
|
+
for (const char of value) {
|
|
30
|
+
if (char === "'" && !inDoubleQuote) {
|
|
31
|
+
if (pendingSpace && result.length > 0 && result[result.length - 1] !== ' ') {
|
|
32
|
+
result += ' ';
|
|
33
|
+
}
|
|
34
|
+
pendingSpace = false;
|
|
35
|
+
inSingleQuote = !inSingleQuote;
|
|
36
|
+
result += char;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (char === '"' && !inSingleQuote) {
|
|
40
|
+
if (pendingSpace && result.length > 0 && result[result.length - 1] !== ' ') {
|
|
41
|
+
result += ' ';
|
|
42
|
+
}
|
|
43
|
+
pendingSpace = false;
|
|
44
|
+
inDoubleQuote = !inDoubleQuote;
|
|
45
|
+
result += char;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (!inSingleQuote && !inDoubleQuote && /\s/.test(char)) {
|
|
49
|
+
pendingSpace = true;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (pendingSpace && result.length > 0 && result[result.length - 1] !== ' ') {
|
|
53
|
+
result += ' ';
|
|
54
|
+
}
|
|
55
|
+
pendingSpace = false;
|
|
56
|
+
result += char;
|
|
57
|
+
}
|
|
58
|
+
return result.trim();
|
|
59
|
+
}
|
|
60
|
+
function normalizeKnownFunctionsOutsideQuotes(value) {
|
|
61
|
+
let result = '';
|
|
62
|
+
let inSingleQuote = false;
|
|
63
|
+
let inDoubleQuote = false;
|
|
64
|
+
let buffer = '';
|
|
65
|
+
function flushBuffer() {
|
|
66
|
+
if (!buffer) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
result += buffer
|
|
70
|
+
.replace(/\bnow\s*\(\s*\)/gi, 'now()')
|
|
71
|
+
.replace(/\bgen_random_uuid\s*\(\s*\)/gi, 'gen_random_uuid()');
|
|
72
|
+
buffer = '';
|
|
73
|
+
}
|
|
74
|
+
for (const char of value) {
|
|
75
|
+
if (char === "'" && !inDoubleQuote) {
|
|
76
|
+
flushBuffer();
|
|
77
|
+
inSingleQuote = !inSingleQuote;
|
|
78
|
+
result += char;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (char === '"' && !inSingleQuote) {
|
|
82
|
+
flushBuffer();
|
|
83
|
+
inDoubleQuote = !inDoubleQuote;
|
|
84
|
+
result += char;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (inSingleQuote || inDoubleQuote) {
|
|
88
|
+
result += char;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
buffer += char;
|
|
92
|
+
}
|
|
93
|
+
flushBuffer();
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
function normalizePunctuationOutsideQuotes(value) {
|
|
97
|
+
let result = '';
|
|
98
|
+
let inSingleQuote = false;
|
|
99
|
+
let inDoubleQuote = false;
|
|
100
|
+
for (let index = 0; index < value.length; index++) {
|
|
101
|
+
const char = value[index];
|
|
102
|
+
if (char === "'" && !inDoubleQuote) {
|
|
103
|
+
inSingleQuote = !inSingleQuote;
|
|
104
|
+
result += char;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (char === '"' && !inSingleQuote) {
|
|
108
|
+
inDoubleQuote = !inDoubleQuote;
|
|
109
|
+
result += char;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (!inSingleQuote && !inDoubleQuote && (char === '(' || char === ')')) {
|
|
113
|
+
while (result.endsWith(' ')) {
|
|
114
|
+
result = result.slice(0, -1);
|
|
115
|
+
}
|
|
116
|
+
result += char;
|
|
117
|
+
let lookahead = index + 1;
|
|
118
|
+
while (lookahead < value.length && value[lookahead] === ' ') {
|
|
119
|
+
lookahead++;
|
|
120
|
+
}
|
|
121
|
+
index = lookahead - 1;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (!inSingleQuote && !inDoubleQuote && char === ',') {
|
|
125
|
+
while (result.endsWith(' ')) {
|
|
126
|
+
result = result.slice(0, -1);
|
|
127
|
+
}
|
|
128
|
+
result += ', ';
|
|
129
|
+
let lookahead = index + 1;
|
|
130
|
+
while (lookahead < value.length && value[lookahead] === ' ') {
|
|
131
|
+
lookahead++;
|
|
132
|
+
}
|
|
133
|
+
index = lookahead - 1;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
result += char;
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
export function normalizeDefault(expr) {
|
|
141
|
+
if (expr === undefined || expr === null) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const trimmed = expr.trim();
|
|
145
|
+
if (trimmed.length === 0) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const normalizedSpacing = normalizeSpacesOutsideQuotes(trimmed);
|
|
149
|
+
const normalizedPunctuation = normalizePunctuationOutsideQuotes(normalizedSpacing);
|
|
150
|
+
return normalizeKnownFunctionsOutsideQuotes(normalizedPunctuation);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/core/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DatabaseSchema } from '../types/schema';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a schema from DSL source string
|
|
4
|
+
*
|
|
5
|
+
* Supported DSL:
|
|
6
|
+
* - Comments: lines starting with # or // are ignored
|
|
7
|
+
* - Blocks:
|
|
8
|
+
* table <name> {
|
|
9
|
+
* <colName> <type> [modifiers...]
|
|
10
|
+
* }
|
|
11
|
+
*
|
|
12
|
+
* Supported modifiers:
|
|
13
|
+
* - pk (primary key)
|
|
14
|
+
* - unique
|
|
15
|
+
* - not null
|
|
16
|
+
* - nullable
|
|
17
|
+
* - default <value>
|
|
18
|
+
* - fk <table>.<column> (e.g., fk users.id)
|
|
19
|
+
*
|
|
20
|
+
* @param source - DSL source string
|
|
21
|
+
* @returns DatabaseSchema with tables and columns in order
|
|
22
|
+
* @throws Error if parsing fails
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseSchema(source: string): DatabaseSchema;
|
|
25
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,cAAc,EAAc,MAAM,iBAAiB,CAAC;AAEtF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAqO1D"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a schema from DSL source string
|
|
3
|
+
*
|
|
4
|
+
* Supported DSL:
|
|
5
|
+
* - Comments: lines starting with # or // are ignored
|
|
6
|
+
* - Blocks:
|
|
7
|
+
* table <name> {
|
|
8
|
+
* <colName> <type> [modifiers...]
|
|
9
|
+
* }
|
|
10
|
+
*
|
|
11
|
+
* Supported modifiers:
|
|
12
|
+
* - pk (primary key)
|
|
13
|
+
* - unique
|
|
14
|
+
* - not null
|
|
15
|
+
* - nullable
|
|
16
|
+
* - default <value>
|
|
17
|
+
* - fk <table>.<column> (e.g., fk users.id)
|
|
18
|
+
*
|
|
19
|
+
* @param source - DSL source string
|
|
20
|
+
* @returns DatabaseSchema with tables and columns in order
|
|
21
|
+
* @throws Error if parsing fails
|
|
22
|
+
*/
|
|
23
|
+
export function parseSchema(source) {
|
|
24
|
+
const lines = source.split('\n');
|
|
25
|
+
const tables = {};
|
|
26
|
+
let currentLine = 0;
|
|
27
|
+
const validBaseColumnTypes = new Set([
|
|
28
|
+
'uuid', 'varchar', 'text', 'int', 'bigint', 'boolean', 'timestamptz', 'date'
|
|
29
|
+
]);
|
|
30
|
+
function normalizeColumnType(type) {
|
|
31
|
+
return type
|
|
32
|
+
.toLowerCase()
|
|
33
|
+
.trim()
|
|
34
|
+
.replace(/\s+/g, ' ')
|
|
35
|
+
.replace(/\s*\(\s*/g, '(')
|
|
36
|
+
.replace(/\s*,\s*/g, ',')
|
|
37
|
+
.replace(/\s*\)\s*/g, ')');
|
|
38
|
+
}
|
|
39
|
+
function isValidColumnType(type) {
|
|
40
|
+
const normalizedType = normalizeColumnType(type);
|
|
41
|
+
if (validBaseColumnTypes.has(normalizedType)) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return /^varchar\(\d+\)$/.test(normalizedType) || /^numeric\(\d+,\d+\)$/.test(normalizedType);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Remove comments and trim whitespace from a line
|
|
48
|
+
*/
|
|
49
|
+
function cleanLine(line) {
|
|
50
|
+
// Remove line comments
|
|
51
|
+
const commentIndex = line.search(/(?:\/\/|#)/);
|
|
52
|
+
if (commentIndex !== -1) {
|
|
53
|
+
line = line.substring(0, commentIndex);
|
|
54
|
+
}
|
|
55
|
+
return line.trim();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse a foreign key reference (e.g., "users.id")
|
|
59
|
+
*/
|
|
60
|
+
function parseForeignKey(fkRef, lineNum) {
|
|
61
|
+
const parts = fkRef.split('.');
|
|
62
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
63
|
+
throw new Error(`Line ${lineNum}: Invalid foreign key format '${fkRef}'. Expected format: table.column`);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
table: parts[0],
|
|
67
|
+
column: parts[1]
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse a column definition line
|
|
72
|
+
*/
|
|
73
|
+
function parseColumn(line, lineNum) {
|
|
74
|
+
const tokens = line.split(/\s+/).filter(t => t.length > 0);
|
|
75
|
+
const modifiers = new Set(['pk', 'unique', 'nullable', 'default', 'fk']);
|
|
76
|
+
if (tokens.length < 2) {
|
|
77
|
+
throw new Error(`Line ${lineNum}: Invalid column definition. Expected: <name> <type> [modifiers...]`);
|
|
78
|
+
}
|
|
79
|
+
const colName = tokens[0];
|
|
80
|
+
const colType = normalizeColumnType(tokens[1]);
|
|
81
|
+
if (!isValidColumnType(colType)) {
|
|
82
|
+
throw new Error(`Line ${lineNum}: Invalid column type '${tokens[1]}'. Valid types: ${Array.from(validBaseColumnTypes).join(', ')}, varchar(n), numeric(p,s)`);
|
|
83
|
+
}
|
|
84
|
+
const column = {
|
|
85
|
+
name: colName,
|
|
86
|
+
type: colType,
|
|
87
|
+
nullable: true
|
|
88
|
+
};
|
|
89
|
+
// Parse modifiers
|
|
90
|
+
let i = 2;
|
|
91
|
+
while (i < tokens.length) {
|
|
92
|
+
const modifier = tokens[i];
|
|
93
|
+
switch (modifier) {
|
|
94
|
+
case 'pk':
|
|
95
|
+
column.primaryKey = true;
|
|
96
|
+
i++;
|
|
97
|
+
break;
|
|
98
|
+
case 'unique':
|
|
99
|
+
column.unique = true;
|
|
100
|
+
i++;
|
|
101
|
+
break;
|
|
102
|
+
case 'nullable':
|
|
103
|
+
column.nullable = true;
|
|
104
|
+
i++;
|
|
105
|
+
break;
|
|
106
|
+
case 'not':
|
|
107
|
+
if (tokens[i + 1] !== 'null') {
|
|
108
|
+
throw new Error(`Line ${lineNum}: Unknown modifier 'not'`);
|
|
109
|
+
}
|
|
110
|
+
column.nullable = false;
|
|
111
|
+
i += 2;
|
|
112
|
+
break;
|
|
113
|
+
case 'default':
|
|
114
|
+
i++;
|
|
115
|
+
if (i >= tokens.length) {
|
|
116
|
+
throw new Error(`Line ${lineNum}: 'default' modifier requires a value`);
|
|
117
|
+
}
|
|
118
|
+
{
|
|
119
|
+
const defaultTokens = [];
|
|
120
|
+
while (i < tokens.length && !modifiers.has(tokens[i])) {
|
|
121
|
+
defaultTokens.push(tokens[i]);
|
|
122
|
+
i++;
|
|
123
|
+
}
|
|
124
|
+
if (defaultTokens.length === 0) {
|
|
125
|
+
throw new Error(`Line ${lineNum}: 'default' modifier requires a value`);
|
|
126
|
+
}
|
|
127
|
+
column.default = defaultTokens.join(' ');
|
|
128
|
+
}
|
|
129
|
+
break;
|
|
130
|
+
case 'fk':
|
|
131
|
+
i++;
|
|
132
|
+
if (i >= tokens.length) {
|
|
133
|
+
throw new Error(`Line ${lineNum}: 'fk' modifier requires a table.column reference`);
|
|
134
|
+
}
|
|
135
|
+
column.foreignKey = parseForeignKey(tokens[i], lineNum);
|
|
136
|
+
i++;
|
|
137
|
+
break;
|
|
138
|
+
default:
|
|
139
|
+
throw new Error(`Line ${lineNum}: Unknown modifier '${modifier}'`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return column;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Parse a table block
|
|
146
|
+
*/
|
|
147
|
+
function parseTableBlock(startLine) {
|
|
148
|
+
const firstLine = cleanLine(lines[startLine]);
|
|
149
|
+
const match = firstLine.match(/^table\s+(\w+)\s*\{?\s*$/);
|
|
150
|
+
if (!match) {
|
|
151
|
+
throw new Error(`Line ${startLine + 1}: Invalid table definition. Expected: table <name> {`);
|
|
152
|
+
}
|
|
153
|
+
const tableName = match[1];
|
|
154
|
+
if (tables[tableName]) {
|
|
155
|
+
throw new Error(`Line ${startLine + 1}: Duplicate table definition '${tableName}'`);
|
|
156
|
+
}
|
|
157
|
+
const columns = [];
|
|
158
|
+
let lineIdx = startLine + 1;
|
|
159
|
+
let foundClosingBrace = false;
|
|
160
|
+
// Parse columns until we find closing brace
|
|
161
|
+
while (lineIdx < lines.length) {
|
|
162
|
+
const cleaned = cleanLine(lines[lineIdx]);
|
|
163
|
+
if (!cleaned) {
|
|
164
|
+
lineIdx++;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (cleaned === '}') {
|
|
168
|
+
foundClosingBrace = true;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
// This should be a column definition
|
|
172
|
+
try {
|
|
173
|
+
const column = parseColumn(cleaned, lineIdx + 1);
|
|
174
|
+
columns.push(column);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
lineIdx++;
|
|
180
|
+
}
|
|
181
|
+
if (!foundClosingBrace) {
|
|
182
|
+
throw new Error(`Line ${startLine + 1}: Table '${tableName}' block not closed (missing '}')`);
|
|
183
|
+
}
|
|
184
|
+
const primaryKeyColumn = columns.find(column => column.primaryKey)?.name ?? null;
|
|
185
|
+
tables[tableName] = {
|
|
186
|
+
name: tableName,
|
|
187
|
+
columns,
|
|
188
|
+
...(primaryKeyColumn !== null && { primaryKey: primaryKeyColumn }),
|
|
189
|
+
};
|
|
190
|
+
return lineIdx;
|
|
191
|
+
}
|
|
192
|
+
// Main parsing loop
|
|
193
|
+
while (currentLine < lines.length) {
|
|
194
|
+
const cleaned = cleanLine(lines[currentLine]);
|
|
195
|
+
if (!cleaned) {
|
|
196
|
+
currentLine++;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
// Check if this is a table definition
|
|
200
|
+
if (cleaned.startsWith('table ')) {
|
|
201
|
+
currentLine = parseTableBlock(currentLine);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
throw new Error(`Line ${currentLine + 1}: Unexpected content '${cleaned}'. Expected table definition.`);
|
|
205
|
+
}
|
|
206
|
+
currentLine++;
|
|
207
|
+
}
|
|
208
|
+
return { tables };
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the project root directory
|
|
3
|
+
* For MVP, this is just the current working directory
|
|
4
|
+
*/
|
|
5
|
+
export declare function getProjectRoot(cwd?: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Get the SchemaForge directory path
|
|
8
|
+
*/
|
|
9
|
+
export declare function getSchemaForgeDir(root: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Get the schema file path
|
|
12
|
+
* Default: schemaforge/schema.sf
|
|
13
|
+
*/
|
|
14
|
+
export declare function getSchemaFilePath(root: string, config?: {
|
|
15
|
+
schemaFile?: string;
|
|
16
|
+
}): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get the config file path
|
|
19
|
+
* Default: schemaforge/config.json
|
|
20
|
+
*/
|
|
21
|
+
export declare function getConfigPath(root: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Get the state file path
|
|
24
|
+
* Default: schemaforge/state.json
|
|
25
|
+
*/
|
|
26
|
+
export declare function getStatePath(root: string, config?: {
|
|
27
|
+
stateFile?: string;
|
|
28
|
+
}): string;
|
|
29
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAIxF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAIlF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
/**
|
|
3
|
+
* Get the project root directory
|
|
4
|
+
* For MVP, this is just the current working directory
|
|
5
|
+
*/
|
|
6
|
+
export function getProjectRoot(cwd = process.cwd()) {
|
|
7
|
+
return cwd;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get the SchemaForge directory path
|
|
11
|
+
*/
|
|
12
|
+
export function getSchemaForgeDir(root) {
|
|
13
|
+
return path.join(root, 'schemaforge');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the schema file path
|
|
17
|
+
* Default: schemaforge/schema.sf
|
|
18
|
+
*/
|
|
19
|
+
export function getSchemaFilePath(root, config) {
|
|
20
|
+
const schemaForgeDir = getSchemaForgeDir(root);
|
|
21
|
+
const fileName = config?.schemaFile || 'schema.sf';
|
|
22
|
+
return path.join(schemaForgeDir, fileName);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the config file path
|
|
26
|
+
* Default: schemaforge/config.json
|
|
27
|
+
*/
|
|
28
|
+
export function getConfigPath(root) {
|
|
29
|
+
const schemaForgeDir = getSchemaForgeDir(root);
|
|
30
|
+
return path.join(schemaForgeDir, 'config.json');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the state file path
|
|
34
|
+
* Default: schemaforge/state.json
|
|
35
|
+
*/
|
|
36
|
+
export function getStatePath(root, config) {
|
|
37
|
+
const schemaForgeDir = getSchemaForgeDir(root);
|
|
38
|
+
const fileName = config?.stateFile || 'state.json';
|
|
39
|
+
return path.join(schemaForgeDir, fileName);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAgC;IAC9E,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,EAAE,UAAU,IAAI,WAAW,CAAC;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAA+B;IACxE,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,EAAE,SAAS,IAAI,YAAY,CAAC;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-ops.d.ts","sourceRoot":"","sources":["../../../src/core/sql/apply-ops.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAgD,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA+D9G,wBAAgB,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAuI3D"}
|