@aruvili/core 0.1.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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +106 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.test.d.ts +2 -0
- package/dist/core.test.d.ts.map +1 -0
- package/dist/core.test.js +192 -0
- package/dist/core.test.js.map +1 -0
- package/dist/ddl.d.ts +20 -0
- package/dist/ddl.d.ts.map +1 -0
- package/dist/ddl.js +218 -0
- package/dist/ddl.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +61 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/validation.d.ts +10 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +144 -0
- package/dist/validation.js.map +1 -0
- package/package.json +21 -0
- package/src/cli.ts +105 -0
- package/src/core.test.ts +236 -0
- package/src/ddl.ts +246 -0
- package/src/index.ts +3 -0
- package/src/types/index.ts +92 -0
- package/src/validation.ts +170 -0
- package/tsconfig.json +10 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const validation_js_1 = require("./validation.js");
|
|
10
|
+
const ddl_js_1 = require("./ddl.js");
|
|
11
|
+
const [, , command, ...args] = process.argv;
|
|
12
|
+
if (!command || command === 'help') {
|
|
13
|
+
printHelp();
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
16
|
+
switch (command) {
|
|
17
|
+
case 'init':
|
|
18
|
+
handleInit(args[0]);
|
|
19
|
+
break;
|
|
20
|
+
case 'validate':
|
|
21
|
+
handleValidate(args[0]);
|
|
22
|
+
break;
|
|
23
|
+
case 'ddl':
|
|
24
|
+
handleDdl(args[0]);
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
console.error(`Unknown command: ${command}`);
|
|
28
|
+
printHelp();
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
function printHelp() {
|
|
32
|
+
console.log(`
|
|
33
|
+
Aruvili Meta-Framework CLI
|
|
34
|
+
Usage: aruvili-meta <command> [args]
|
|
35
|
+
|
|
36
|
+
Commands:
|
|
37
|
+
init <name> Scaffold a new DocType definition template
|
|
38
|
+
validate <path> Validate a DocType JSON schema file
|
|
39
|
+
ddl <path> Generate PostgreSQL CREATE TABLE DDL from JSON schema
|
|
40
|
+
help Print this usage information
|
|
41
|
+
`);
|
|
42
|
+
}
|
|
43
|
+
function handleInit(name) {
|
|
44
|
+
if (!name) {
|
|
45
|
+
console.error('Error: DocType name is required.');
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const filename = `${name.toLowerCase().replace(/[^a-z0-9_]/g, '_')}.json`;
|
|
49
|
+
const template = {
|
|
50
|
+
name,
|
|
51
|
+
is_submittable: false,
|
|
52
|
+
istable: false,
|
|
53
|
+
fields: [
|
|
54
|
+
{ fieldname: 'title', label: 'Title', fieldtype: 'Text', required: true }
|
|
55
|
+
],
|
|
56
|
+
permissions: [
|
|
57
|
+
{ role: 'System Manager', read: true, write: true, create: true, delete: true }
|
|
58
|
+
]
|
|
59
|
+
};
|
|
60
|
+
fs_1.default.writeFileSync(path_1.default.resolve(process.cwd(), filename), JSON.stringify(template, null, 2));
|
|
61
|
+
console.log(`Scaffolded template DocType schema: ${filename}`);
|
|
62
|
+
}
|
|
63
|
+
function handleValidate(filePath) {
|
|
64
|
+
if (!filePath) {
|
|
65
|
+
console.error('Error: Path to DocType JSON file is required.');
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const data = JSON.parse(fs_1.default.readFileSync(path_1.default.resolve(process.cwd(), filePath), 'utf-8'));
|
|
70
|
+
const result = (0, validation_js_1.validateDocType)(data);
|
|
71
|
+
if (result.valid) {
|
|
72
|
+
console.log(`✅ DocType '${data.name}' is valid.`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.error(`❌ Validation errors found in ${filePath}:`);
|
|
76
|
+
result.errors.forEach(err => console.error(` - ${err}`));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.error(`Error: Failed to validate. ${err.message}`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function handleDdl(filePath) {
|
|
86
|
+
if (!filePath) {
|
|
87
|
+
console.error('Error: Path to DocType JSON file is required.');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const data = JSON.parse(fs_1.default.readFileSync(path_1.default.resolve(process.cwd(), filePath), 'utf-8'));
|
|
92
|
+
const result = (0, validation_js_1.validateDocType)(data);
|
|
93
|
+
if (!result.valid) {
|
|
94
|
+
console.error(`❌ Cannot generate DDL. DocType schema has validation errors:`);
|
|
95
|
+
result.errors.forEach(err => console.error(` - ${err}`));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
const ddl = (0, ddl_js_1.generateCreateTableDDL)(data);
|
|
99
|
+
console.log(ddl.join('\n'));
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.error(`Error: Failed to generate DDL. ${err.message}`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.test.d.ts","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const bun_test_1 = require("bun:test");
|
|
4
|
+
const validation_js_1 = require("./validation.js");
|
|
5
|
+
const ddl_js_1 = require("./ddl.js");
|
|
6
|
+
(0, bun_test_1.describe)('DocType validation', () => {
|
|
7
|
+
(0, bun_test_1.it)('should validate a correct DocType definition', () => {
|
|
8
|
+
const doc = {
|
|
9
|
+
name: 'Task',
|
|
10
|
+
fields: [
|
|
11
|
+
{ fieldname: 'title', label: 'Title', fieldtype: 'Text', required: true },
|
|
12
|
+
{ fieldname: 'status', label: 'Status', fieldtype: 'Select', options: 'Open,Closed', default: 'Open' }
|
|
13
|
+
],
|
|
14
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
15
|
+
};
|
|
16
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
17
|
+
(0, bun_test_1.expect)(result.valid).toBe(true);
|
|
18
|
+
(0, bun_test_1.expect)(result.errors.length).toBe(0);
|
|
19
|
+
});
|
|
20
|
+
(0, bun_test_1.it)('should block reserved field names', () => {
|
|
21
|
+
const doc = {
|
|
22
|
+
name: 'Task',
|
|
23
|
+
fields: [{ fieldname: 'docstatus', label: 'Doc Status', fieldtype: 'Int' }],
|
|
24
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
25
|
+
};
|
|
26
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
27
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
28
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('reserved');
|
|
29
|
+
});
|
|
30
|
+
(0, bun_test_1.it)('should block uuid as a field name', () => {
|
|
31
|
+
const doc = {
|
|
32
|
+
name: 'Task',
|
|
33
|
+
fields: [{ fieldname: 'uuid', label: 'UUID', fieldtype: 'Text' }],
|
|
34
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
35
|
+
};
|
|
36
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
37
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
38
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('reserved');
|
|
39
|
+
});
|
|
40
|
+
(0, bun_test_1.it)('should validate fieldname naming conventions', () => {
|
|
41
|
+
const doc = {
|
|
42
|
+
name: 'Task',
|
|
43
|
+
fields: [{ fieldname: 'Title Field', label: 'Title', fieldtype: 'Text' }],
|
|
44
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
45
|
+
};
|
|
46
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
47
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
48
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('is invalid');
|
|
49
|
+
});
|
|
50
|
+
(0, bun_test_1.it)('should block Select type fields without options', () => {
|
|
51
|
+
const doc = {
|
|
52
|
+
name: 'Task',
|
|
53
|
+
fields: [{ fieldname: 'status', label: 'Status', fieldtype: 'Select' }],
|
|
54
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
55
|
+
};
|
|
56
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
57
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
58
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('requires options');
|
|
59
|
+
});
|
|
60
|
+
(0, bun_test_1.it)('should block SQL reserved words as DocType names', () => {
|
|
61
|
+
const doc = {
|
|
62
|
+
name: 'Select',
|
|
63
|
+
fields: [{ fieldname: 'title', label: 'Title', fieldtype: 'Text' }],
|
|
64
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
65
|
+
};
|
|
66
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
67
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
68
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('reserved SQL keyword');
|
|
69
|
+
});
|
|
70
|
+
(0, bun_test_1.it)('should block SQL reserved words as field names', () => {
|
|
71
|
+
const doc = {
|
|
72
|
+
name: 'Task',
|
|
73
|
+
fields: [{ fieldname: 'select', label: 'Select', fieldtype: 'Text' }],
|
|
74
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
75
|
+
};
|
|
76
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
77
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
(0, bun_test_1.it)('should require permissions on non-child DocTypes', () => {
|
|
80
|
+
const doc = {
|
|
81
|
+
name: 'Task',
|
|
82
|
+
fields: [{ fieldname: 'title', label: 'Title', fieldtype: 'Text' }],
|
|
83
|
+
permissions: []
|
|
84
|
+
};
|
|
85
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
86
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
87
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('at least one permission');
|
|
88
|
+
});
|
|
89
|
+
(0, bun_test_1.it)('should allow child tables without permissions', () => {
|
|
90
|
+
const doc = {
|
|
91
|
+
name: 'Task Item',
|
|
92
|
+
istable: true,
|
|
93
|
+
fields: [{ fieldname: 'item_name', label: 'Item', fieldtype: 'Text' }],
|
|
94
|
+
permissions: []
|
|
95
|
+
};
|
|
96
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
97
|
+
(0, bun_test_1.expect)(result.valid).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
(0, bun_test_1.it)('should block submittable child tables', () => {
|
|
100
|
+
const doc = {
|
|
101
|
+
name: 'Bad Child',
|
|
102
|
+
istable: true,
|
|
103
|
+
is_submittable: true,
|
|
104
|
+
fields: [{ fieldname: 'item_name', label: 'Item', fieldtype: 'Text' }],
|
|
105
|
+
permissions: []
|
|
106
|
+
};
|
|
107
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
108
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
109
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('cannot be both');
|
|
110
|
+
});
|
|
111
|
+
(0, bun_test_1.it)('should validate title_field references existing field', () => {
|
|
112
|
+
const doc = {
|
|
113
|
+
name: 'Task',
|
|
114
|
+
title_field: 'nonexistent',
|
|
115
|
+
fields: [{ fieldname: 'title', label: 'Title', fieldtype: 'Text' }],
|
|
116
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
117
|
+
};
|
|
118
|
+
const result = (0, validation_js_1.validateDocType)(doc);
|
|
119
|
+
(0, bun_test_1.expect)(result.valid).toBe(false);
|
|
120
|
+
(0, bun_test_1.expect)(result.errors.join('')).toContain('does not reference');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
(0, bun_test_1.describe)('SQL DDL Code Generation', () => {
|
|
124
|
+
(0, bun_test_1.it)('should generate a valid CREATE TABLE with uuid column', () => {
|
|
125
|
+
const doc = {
|
|
126
|
+
name: 'Task',
|
|
127
|
+
fields: [
|
|
128
|
+
{ fieldname: 'title', label: 'Title', fieldtype: 'Text', required: true },
|
|
129
|
+
{ fieldname: 'description', label: 'Description', fieldtype: 'Long Text' },
|
|
130
|
+
{ fieldname: 'project', label: 'Project', fieldtype: 'Link', options: 'Project' }
|
|
131
|
+
],
|
|
132
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
133
|
+
};
|
|
134
|
+
const statements = (0, ddl_js_1.generateCreateTableDDL)(doc);
|
|
135
|
+
const sql = statements.join('\n');
|
|
136
|
+
(0, bun_test_1.expect)((0, ddl_js_1.getTableName)(doc.name)).toBe('dt_task');
|
|
137
|
+
(0, bun_test_1.expect)(sql).toContain('CREATE TABLE dt_task');
|
|
138
|
+
(0, bun_test_1.expect)(sql).toContain('name VARCHAR(255) PRIMARY KEY');
|
|
139
|
+
(0, bun_test_1.expect)(sql).toContain('uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL');
|
|
140
|
+
(0, bun_test_1.expect)(sql).toContain('title VARCHAR(255) NOT NULL');
|
|
141
|
+
(0, bun_test_1.expect)(sql).toContain('description TEXT');
|
|
142
|
+
(0, bun_test_1.expect)(sql).toContain('project VARCHAR(255)');
|
|
143
|
+
// Verify automatic indexes
|
|
144
|
+
(0, bun_test_1.expect)(sql).toContain('idx_dt_task_docstatus');
|
|
145
|
+
(0, bun_test_1.expect)(sql).toContain('idx_dt_task_created_at');
|
|
146
|
+
(0, bun_test_1.expect)(sql).toContain('idx_dt_task_project');
|
|
147
|
+
});
|
|
148
|
+
(0, bun_test_1.it)('should generate child table columns', () => {
|
|
149
|
+
const doc = {
|
|
150
|
+
name: 'Invoice Item',
|
|
151
|
+
istable: true,
|
|
152
|
+
fields: [{ fieldname: 'item_code', label: 'Item Code', fieldtype: 'Text', required: true }],
|
|
153
|
+
permissions: []
|
|
154
|
+
};
|
|
155
|
+
const statements = (0, ddl_js_1.generateCreateTableDDL)(doc);
|
|
156
|
+
const sql = statements.join('\n');
|
|
157
|
+
(0, bun_test_1.expect)(sql).toContain('uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL');
|
|
158
|
+
(0, bun_test_1.expect)(sql).toContain('parent VARCHAR(255) NOT NULL');
|
|
159
|
+
(0, bun_test_1.expect)(sql).toContain('parenttype VARCHAR(255) NOT NULL');
|
|
160
|
+
(0, bun_test_1.expect)(sql).toContain('parentfield VARCHAR(255) NOT NULL');
|
|
161
|
+
(0, bun_test_1.expect)(sql).toContain('idx INTEGER NOT NULL');
|
|
162
|
+
(0, bun_test_1.expect)(sql).toContain('idx_dt_invoice_item_parent');
|
|
163
|
+
});
|
|
164
|
+
(0, bun_test_1.it)('should calculate additive migrations with uuid backfill', () => {
|
|
165
|
+
const doc = {
|
|
166
|
+
name: 'Task',
|
|
167
|
+
fields: [
|
|
168
|
+
{ fieldname: 'title', label: 'Title', fieldtype: 'Text' },
|
|
169
|
+
{ fieldname: 'priority', label: 'Priority', fieldtype: 'Select', options: 'Low,Medium,High', default: 'Medium', searchable: true }
|
|
170
|
+
],
|
|
171
|
+
permissions: [{ role: 'System Manager', create: true, read: true, update: true, delete: true }]
|
|
172
|
+
};
|
|
173
|
+
// uuid missing from existing DB
|
|
174
|
+
const existing = [
|
|
175
|
+
{ columnName: 'name', dataType: 'varchar', isNullable: false, characterMaximumLength: 255 },
|
|
176
|
+
{ columnName: 'title', dataType: 'varchar', isNullable: true, characterMaximumLength: 255 }
|
|
177
|
+
];
|
|
178
|
+
const statements = (0, ddl_js_1.generateAlterTableDDL)(doc, existing);
|
|
179
|
+
(0, bun_test_1.expect)(statements.length).toBe(3); // uuid + priority column + priority index
|
|
180
|
+
(0, bun_test_1.expect)(statements[0]).toContain('ADD COLUMN uuid UUID');
|
|
181
|
+
// uuid already exists
|
|
182
|
+
const existingWithUuid = [
|
|
183
|
+
{ columnName: 'uuid', dataType: 'uuid', isNullable: false, characterMaximumLength: null },
|
|
184
|
+
{ columnName: 'name', dataType: 'varchar', isNullable: false, characterMaximumLength: 255 },
|
|
185
|
+
{ columnName: 'title', dataType: 'varchar', isNullable: true, characterMaximumLength: 255 }
|
|
186
|
+
];
|
|
187
|
+
const statements2 = (0, ddl_js_1.generateAlterTableDDL)(doc, existingWithUuid);
|
|
188
|
+
(0, bun_test_1.expect)(statements2.length).toBe(2);
|
|
189
|
+
(0, bun_test_1.expect)(statements2[0]).toContain('ADD COLUMN priority');
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=core.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.test.js","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":";;AAAA,uCAAgD;AAEhD,mDAAkD;AAClD,qCAAuF;AAEvF,IAAA,mBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,aAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE;gBACN,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACzE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE;aACvG;YACD,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC3E,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACjE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACzE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;YACvE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACnE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACrE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACnE,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACtE,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACtE,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,aAAa;YAC1B,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YACnE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,GAAG,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAA,iBAAM,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,mBAAQ,EAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAA,aAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE;gBACN,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACzE,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE;gBAC1E,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;aAClF;YACD,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QACF,MAAM,UAAU,GAAG,IAAA,+BAAsB,EAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElC,IAAA,iBAAM,EAAC,IAAA,qBAAY,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC9C,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACvD,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qDAAqD,CAAC,CAAC;QAC7E,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACrD,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC9C,2BAA2B;QAC3B,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC/C,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAChD,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC3F,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,MAAM,UAAU,GAAG,IAAA,+BAAsB,EAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElC,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qDAAqD,CAAC,CAAC;QAC7E,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACtD,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC1D,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC3D,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC9C,IAAA,iBAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE;gBACN,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;gBACzD,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;aACnI;YACD,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChG,CAAC;QAEF,gCAAgC;QAChC,MAAM,QAAQ,GAAG;YACf,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,EAAE;YAC3F,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE;SAC5F,CAAC;QAEF,MAAM,UAAU,GAAG,IAAA,8BAAqB,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAA,iBAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,0CAA0C;QAC7E,IAAA,iBAAM,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAExD,sBAAsB;QACtB,MAAM,gBAAgB,GAAG;YACvB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE;YACzF,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,EAAE;YAC3F,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE;SAC5F,CAAC;QAEF,MAAM,WAAW,GAAG,IAAA,8BAAqB,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACjE,IAAA,iBAAM,EAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAA,iBAAM,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/ddl.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DocTypeDefinition, DocField, DatabaseColumnMeta } from './types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Maps the DocType FieldType to a PostgreSQL database column type.
|
|
4
|
+
*/
|
|
5
|
+
export declare function mapFieldToPostgresType(field: DocField): string;
|
|
6
|
+
/**
|
|
7
|
+
* Standardize table name for a DocType.
|
|
8
|
+
* Enforces whitelist-safe identifier generation to prevent SQL injection.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getTableName(doctypeName: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generate DDL statement to create a table for a DocType.
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateCreateTableDDL(definition: DocTypeDefinition): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Compare DB catalog columns with schema definition, generating ADD COLUMN alterations.
|
|
17
|
+
* Implements strict additive-only migration. NEVER drops or renames columns.
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateAlterTableDDL(definition: DocTypeDefinition, existingColumns: DatabaseColumnMeta[]): string[];
|
|
20
|
+
//# sourceMappingURL=ddl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ddl.d.ts","sourceRoot":"","sources":["../src/ddl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAcnF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CA8B9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAMxD;AA8BD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAwF9E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EAAE,kBAAkB,EAAE,GACpC,MAAM,EAAE,CAwDV"}
|
package/dist/ddl.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapFieldToPostgresType = mapFieldToPostgresType;
|
|
4
|
+
exports.getTableName = getTableName;
|
|
5
|
+
exports.generateCreateTableDDL = generateCreateTableDDL;
|
|
6
|
+
exports.generateAlterTableDDL = generateAlterTableDDL;
|
|
7
|
+
/**
|
|
8
|
+
* Whitelist-validates an identifier to prevent SQL injection via dynamic column/table names.
|
|
9
|
+
* Only allows lowercase alphanumeric characters and underscores.
|
|
10
|
+
*/
|
|
11
|
+
function sanitizeIdentifier(name) {
|
|
12
|
+
const sanitized = name.replace(/[^a-z0-9_]/g, '');
|
|
13
|
+
if (sanitized !== name.toLowerCase().replace(/[^a-z0-9_]/g, '')) {
|
|
14
|
+
throw new Error(`Unsafe SQL identifier detected: '${name}'`);
|
|
15
|
+
}
|
|
16
|
+
return sanitized;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Maps the DocType FieldType to a PostgreSQL database column type.
|
|
20
|
+
*/
|
|
21
|
+
function mapFieldToPostgresType(field) {
|
|
22
|
+
switch (field.fieldtype) {
|
|
23
|
+
case 'Select':
|
|
24
|
+
case 'Link':
|
|
25
|
+
return `VARCHAR(${field.max_length || 255})`;
|
|
26
|
+
case 'Text':
|
|
27
|
+
return `VARCHAR(${field.max_length || 255})`;
|
|
28
|
+
case 'Small Text':
|
|
29
|
+
return 'TEXT';
|
|
30
|
+
case 'Long Text':
|
|
31
|
+
return 'TEXT';
|
|
32
|
+
case 'Int':
|
|
33
|
+
return 'INTEGER';
|
|
34
|
+
case 'Float':
|
|
35
|
+
return 'DOUBLE PRECISION';
|
|
36
|
+
case 'Check':
|
|
37
|
+
return 'BOOLEAN';
|
|
38
|
+
case 'Date':
|
|
39
|
+
return 'DATE';
|
|
40
|
+
case 'Datetime':
|
|
41
|
+
return 'TIMESTAMP WITH TIME ZONE';
|
|
42
|
+
case 'Currency':
|
|
43
|
+
return 'NUMERIC(18, 4)';
|
|
44
|
+
case 'Table':
|
|
45
|
+
case 'Table MultiSelect':
|
|
46
|
+
// Child tables do not create direct columns in parent tables.
|
|
47
|
+
return '';
|
|
48
|
+
default:
|
|
49
|
+
throw new Error(`Unsupported field type: ${field.fieldtype}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Standardize table name for a DocType.
|
|
54
|
+
* Enforces whitelist-safe identifier generation to prevent SQL injection.
|
|
55
|
+
*/
|
|
56
|
+
function getTableName(doctypeName) {
|
|
57
|
+
const sanitized = doctypeName.toLowerCase().replace(/[^a-z0-9_]/g, '_');
|
|
58
|
+
if (!sanitized || sanitized.length === 0) {
|
|
59
|
+
throw new Error(`Cannot generate table name from empty DocType name.`);
|
|
60
|
+
}
|
|
61
|
+
return `dt_${sanitized}`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Builds a safe default value expression for SQL column definitions.
|
|
65
|
+
* Prevents SQL injection through default value interpolation.
|
|
66
|
+
*/
|
|
67
|
+
function buildDefaultClause(value) {
|
|
68
|
+
if (value === undefined || value === null)
|
|
69
|
+
return '';
|
|
70
|
+
if (typeof value === 'string') {
|
|
71
|
+
// Escape single quotes to prevent SQL injection
|
|
72
|
+
const escaped = value.replace(/'/g, "''").replace(/\\/g, '\\\\');
|
|
73
|
+
// Reject values containing SQL comment sequences or semicolons
|
|
74
|
+
if (escaped.includes('--') || escaped.includes(';') || escaped.includes('/*')) {
|
|
75
|
+
throw new Error(`Unsafe default value detected: '${value}'`);
|
|
76
|
+
}
|
|
77
|
+
return ` DEFAULT '${escaped}'`;
|
|
78
|
+
}
|
|
79
|
+
if (typeof value === 'boolean') {
|
|
80
|
+
return ` DEFAULT ${value ? 'TRUE' : 'FALSE'}`;
|
|
81
|
+
}
|
|
82
|
+
if (typeof value === 'number') {
|
|
83
|
+
if (!isFinite(value)) {
|
|
84
|
+
throw new Error(`Default value must be a finite number, got: ${value}`);
|
|
85
|
+
}
|
|
86
|
+
return ` DEFAULT ${value}`;
|
|
87
|
+
}
|
|
88
|
+
return '';
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate DDL statement to create a table for a DocType.
|
|
92
|
+
*/
|
|
93
|
+
function generateCreateTableDDL(definition) {
|
|
94
|
+
const tableName = getTableName(definition.name);
|
|
95
|
+
const statements = [];
|
|
96
|
+
const columns = [];
|
|
97
|
+
// Every table has a primary key name and a globally unique UUIDv4 identifier
|
|
98
|
+
columns.push('name VARCHAR(255) PRIMARY KEY');
|
|
99
|
+
columns.push('uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL');
|
|
100
|
+
// Standard audit fields
|
|
101
|
+
columns.push('created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()');
|
|
102
|
+
columns.push('updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()');
|
|
103
|
+
columns.push('created_by VARCHAR(255)');
|
|
104
|
+
columns.push('modified_by VARCHAR(255)');
|
|
105
|
+
columns.push('docstatus INTEGER DEFAULT 0'); // 0: Draft, 1: Submitted, 2: Cancelled
|
|
106
|
+
columns.push('version INTEGER DEFAULT 1'); // Optimistic concurrency control
|
|
107
|
+
if (definition.is_submittable) {
|
|
108
|
+
columns.push('amended_from VARCHAR(255)');
|
|
109
|
+
}
|
|
110
|
+
if (definition.workflow) {
|
|
111
|
+
const wfCol = sanitizeIdentifier(definition.workflow.fieldname);
|
|
112
|
+
if (!definition.fields.some(f => f.fieldname === wfCol)) {
|
|
113
|
+
columns.push(`${wfCol} VARCHAR(255) DEFAULT '${definition.workflow.initial_state}'`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Relational structural columns for Child Tables
|
|
117
|
+
if (definition.istable) {
|
|
118
|
+
columns.push('parent VARCHAR(255) NOT NULL');
|
|
119
|
+
columns.push('parenttype VARCHAR(255) NOT NULL');
|
|
120
|
+
columns.push('parentfield VARCHAR(255) NOT NULL');
|
|
121
|
+
columns.push('idx INTEGER NOT NULL');
|
|
122
|
+
}
|
|
123
|
+
// Custom metadata fields
|
|
124
|
+
for (const field of definition.fields) {
|
|
125
|
+
const pgType = mapFieldToPostgresType(field);
|
|
126
|
+
if (!pgType)
|
|
127
|
+
continue; // Skip non-column fields like Table
|
|
128
|
+
const safeFieldname = sanitizeIdentifier(field.fieldname);
|
|
129
|
+
let colDef = `${safeFieldname} ${pgType}`;
|
|
130
|
+
if (field.required) {
|
|
131
|
+
colDef += ' NOT NULL';
|
|
132
|
+
}
|
|
133
|
+
if (field.unique) {
|
|
134
|
+
colDef += ' UNIQUE';
|
|
135
|
+
}
|
|
136
|
+
colDef += buildDefaultClause(field.default);
|
|
137
|
+
columns.push(colDef);
|
|
138
|
+
}
|
|
139
|
+
statements.push(`CREATE TABLE ${tableName} (\n ${columns.join(',\n ')}\n);`);
|
|
140
|
+
// Add indexing statements
|
|
141
|
+
if (definition.istable) {
|
|
142
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_parent ON ${tableName} (parent, parenttype);`);
|
|
143
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_idx ON ${tableName} (idx);`);
|
|
144
|
+
}
|
|
145
|
+
// Always index docstatus for workflow queries
|
|
146
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_docstatus ON ${tableName} (docstatus);`);
|
|
147
|
+
// Always index created_at for sorting
|
|
148
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_created_at ON ${tableName} (created_at);`);
|
|
149
|
+
if (definition.is_submittable) {
|
|
150
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_amended_from ON ${tableName} (amended_from);`);
|
|
151
|
+
}
|
|
152
|
+
if (definition.workflow) {
|
|
153
|
+
const wfCol = sanitizeIdentifier(definition.workflow.fieldname);
|
|
154
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${wfCol} ON ${tableName} (${wfCol});`);
|
|
155
|
+
}
|
|
156
|
+
for (const field of definition.fields) {
|
|
157
|
+
if (field.searchable || field.fieldtype === 'Link') {
|
|
158
|
+
const pgType = mapFieldToPostgresType(field);
|
|
159
|
+
if (pgType) {
|
|
160
|
+
const safeFieldname = sanitizeIdentifier(field.fieldname);
|
|
161
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${safeFieldname} ON ${tableName} (${safeFieldname});`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return statements;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Compare DB catalog columns with schema definition, generating ADD COLUMN alterations.
|
|
169
|
+
* Implements strict additive-only migration. NEVER drops or renames columns.
|
|
170
|
+
*/
|
|
171
|
+
function generateAlterTableDDL(definition, existingColumns) {
|
|
172
|
+
const tableName = getTableName(definition.name);
|
|
173
|
+
const statements = [];
|
|
174
|
+
const existingNames = new Set(existingColumns.map(c => c.columnName.toLowerCase()));
|
|
175
|
+
// Ensure every table has a unique UUID column
|
|
176
|
+
if (!existingNames.has('uuid')) {
|
|
177
|
+
statements.push(`ALTER TABLE ${tableName} ADD COLUMN uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL`);
|
|
178
|
+
}
|
|
179
|
+
// Ensure submittable tables have amended_from column
|
|
180
|
+
if (definition.is_submittable && !existingNames.has('amended_from')) {
|
|
181
|
+
statements.push(`ALTER TABLE ${tableName} ADD COLUMN amended_from VARCHAR(255)`);
|
|
182
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_amended_from ON ${tableName} (amended_from)`);
|
|
183
|
+
}
|
|
184
|
+
// Ensure workflow columns exist
|
|
185
|
+
if (definition.workflow) {
|
|
186
|
+
const wfCol = sanitizeIdentifier(definition.workflow.fieldname);
|
|
187
|
+
if (!existingNames.has(wfCol)) {
|
|
188
|
+
statements.push(`ALTER TABLE ${tableName} ADD COLUMN ${wfCol} VARCHAR(255) DEFAULT '${definition.workflow.initial_state}'`);
|
|
189
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${wfCol} ON ${tableName} (${wfCol})`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
for (const field of definition.fields) {
|
|
193
|
+
const pgType = mapFieldToPostgresType(field);
|
|
194
|
+
if (!pgType)
|
|
195
|
+
continue; // Skip Table fields
|
|
196
|
+
const safeFieldname = sanitizeIdentifier(field.fieldname);
|
|
197
|
+
if (!existingNames.has(safeFieldname)) {
|
|
198
|
+
let colDef = `ALTER TABLE ${tableName} ADD COLUMN ${safeFieldname} ${pgType}`;
|
|
199
|
+
const defaultClause = buildDefaultClause(field.default);
|
|
200
|
+
if (field.required) {
|
|
201
|
+
// Must provide default when adding NOT NULL to populated table
|
|
202
|
+
if (defaultClause) {
|
|
203
|
+
colDef += defaultClause;
|
|
204
|
+
}
|
|
205
|
+
colDef += ' NOT NULL';
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
colDef += defaultClause;
|
|
209
|
+
}
|
|
210
|
+
statements.push(colDef);
|
|
211
|
+
if (field.searchable || field.fieldtype === 'Link') {
|
|
212
|
+
statements.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${safeFieldname} ON ${tableName} (${safeFieldname});`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return statements;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=ddl.js.map
|
package/dist/ddl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ddl.js","sourceRoot":"","sources":["../src/ddl.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types/index.js"), exports);
|
|
18
|
+
__exportStar(require("./validation.js"), exports);
|
|
19
|
+
__exportStar(require("./ddl.js"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,kDAAgC;AAChC,2CAAyB"}
|