@t1mmen/srtd 0.2.1
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 +21 -0
- package/README.md +277 -0
- package/dist/__tests__/vitest.setup.d.ts +2 -0
- package/dist/__tests__/vitest.setup.js +72 -0
- package/dist/__tests__/vitest.setup.js.map +1 -0
- package/dist/__tests__/watch.test.d.ts +1 -0
- package/dist/__tests__/watch.test.js +24 -0
- package/dist/__tests__/watch.test.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/_app.d.ts +3 -0
- package/dist/commands/_app.js +7 -0
- package/dist/commands/_app.js.map +1 -0
- package/dist/commands/apply.d.ts +1 -0
- package/dist/commands/apply.js +20 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/build.d.ts +1 -0
- package/dist/commands/build.js +15 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/help.d.ts +1 -0
- package/dist/commands/help.js +2 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +37 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +80 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/register.d.ts +8 -0
- package/dist/commands/register.js +82 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/watch.d.ts +2 -0
- package/dist/commands/watch.js +127 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/components/Branding.d.ts +6 -0
- package/dist/components/Branding.js +28 -0
- package/dist/components/Branding.js.map +1 -0
- package/dist/components/TimeSince.d.ts +4 -0
- package/dist/components/TimeSince.js +29 -0
- package/dist/components/TimeSince.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/hooks/useTemplateState.d.ts +6 -0
- package/dist/hooks/useTemplateState.js +28 -0
- package/dist/hooks/useTemplateState.js.map +1 -0
- package/dist/lib/templateManager.d.ts +32 -0
- package/dist/lib/templateManager.js +237 -0
- package/dist/lib/templateManager.js.map +1 -0
- package/dist/lib/templateManager.test.d.ts +1 -0
- package/dist/lib/templateManager.test.js +289 -0
- package/dist/lib/templateManager.test.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/applyMigration.d.ts +2 -0
- package/dist/utils/applyMigration.js +29 -0
- package/dist/utils/applyMigration.js.map +1 -0
- package/dist/utils/applyMigrations.test.d.ts +1 -0
- package/dist/utils/applyMigrations.test.js +112 -0
- package/dist/utils/applyMigrations.test.js.map +1 -0
- package/dist/utils/calculateMD5.d.ts +1 -0
- package/dist/utils/calculateMD5.js +5 -0
- package/dist/utils/calculateMD5.js.map +1 -0
- package/dist/utils/config.d.ts +3 -0
- package/dist/utils/config.js +78 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/config.test.d.ts +1 -0
- package/dist/utils/config.test.js +61 -0
- package/dist/utils/config.test.js.map +1 -0
- package/dist/utils/createEmptyBuildLog.d.ts +1 -0
- package/dist/utils/createEmptyBuildLog.js +10 -0
- package/dist/utils/createEmptyBuildLog.js.map +1 -0
- package/dist/utils/databaseConnection.d.ts +3 -0
- package/dist/utils/databaseConnection.js +45 -0
- package/dist/utils/databaseConnection.js.map +1 -0
- package/dist/utils/databaseConnection.test.d.ts +1 -0
- package/dist/utils/databaseConnection.test.js +45 -0
- package/dist/utils/databaseConnection.test.js.map +1 -0
- package/dist/utils/ensureDirectories.d.ts +4 -0
- package/dist/utils/ensureDirectories.js +23 -0
- package/dist/utils/ensureDirectories.js.map +1 -0
- package/dist/utils/fileExists.d.ts +1 -0
- package/dist/utils/fileExists.js +11 -0
- package/dist/utils/fileExists.js.map +1 -0
- package/dist/utils/getNextTimestamp.d.ts +2 -0
- package/dist/utils/getNextTimestamp.js +12 -0
- package/dist/utils/getNextTimestamp.js.map +1 -0
- package/dist/utils/isWipTemplate.d.ts +1 -0
- package/dist/utils/isWipTemplate.js +6 -0
- package/dist/utils/isWipTemplate.js.map +1 -0
- package/dist/utils/loadBuildLog.d.ts +2 -0
- package/dist/utils/loadBuildLog.js +21 -0
- package/dist/utils/loadBuildLog.js.map +1 -0
- package/dist/utils/loadBuildLog.test.d.ts +1 -0
- package/dist/utils/loadBuildLog.test.js +62 -0
- package/dist/utils/loadBuildLog.test.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/registerTemplate.d.ts +1 -0
- package/dist/utils/registerTemplate.js +44 -0
- package/dist/utils/registerTemplate.js.map +1 -0
- package/dist/utils/safeCreate.d.ts +1 -0
- package/dist/utils/safeCreate.js +10 -0
- package/dist/utils/safeCreate.js.map +1 -0
- package/dist/utils/saveBuildLog.d.ts +2 -0
- package/dist/utils/saveBuildLog.js +9 -0
- package/dist/utils/saveBuildLog.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateManager.js","sourceRoot":"","sources":["../../src/lib/templateManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join, relative } from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { TEST_FN_PREFIX } from '../__tests__/vitest.setup.js';
|
|
6
|
+
import { connect, disconnect } from '../utils/databaseConnection.js';
|
|
7
|
+
import { ensureDirectories } from '../utils/ensureDirectories.js';
|
|
8
|
+
import { TemplateManager } from './templateManager.js';
|
|
9
|
+
describe('TemplateManager', () => {
|
|
10
|
+
const testContext = {
|
|
11
|
+
timestamp: Date.now(),
|
|
12
|
+
testDir: '',
|
|
13
|
+
testFunctionName: '',
|
|
14
|
+
};
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
testContext.testDir = join(tmpdir(), `srtd-test-${testContext.timestamp}`);
|
|
17
|
+
testContext.testFunctionName = `${TEST_FN_PREFIX}${testContext.timestamp}`;
|
|
18
|
+
await ensureDirectories(testContext.testDir);
|
|
19
|
+
const client = await connect();
|
|
20
|
+
try {
|
|
21
|
+
await client.query('BEGIN');
|
|
22
|
+
await client.query(`DROP FUNCTION IF EXISTS ${testContext.testFunctionName}()`);
|
|
23
|
+
await client.query('COMMIT');
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
await client.query('ROLLBACK');
|
|
27
|
+
throw e;
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
client.release();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
afterEach(async () => {
|
|
34
|
+
const client = await connect();
|
|
35
|
+
try {
|
|
36
|
+
await client.query('BEGIN');
|
|
37
|
+
await client.query(`DROP FUNCTION IF EXISTS ${testContext.testFunctionName}()`);
|
|
38
|
+
await client.query('COMMIT');
|
|
39
|
+
}
|
|
40
|
+
catch (_) {
|
|
41
|
+
await client.query('ROLLBACK');
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
client.release();
|
|
45
|
+
}
|
|
46
|
+
await fs.rm(testContext.testDir, { recursive: true, force: true });
|
|
47
|
+
disconnect();
|
|
48
|
+
});
|
|
49
|
+
const createTemplate = async (name, content) => {
|
|
50
|
+
const path = join(testContext.testDir, 'test-templates', name);
|
|
51
|
+
await fs.writeFile(path, content);
|
|
52
|
+
return path;
|
|
53
|
+
};
|
|
54
|
+
const createTemplateWithFunc = async (name, funcSuffix = '') => {
|
|
55
|
+
const funcName = `${testContext.testFunctionName}${funcSuffix}`;
|
|
56
|
+
const content = `CREATE FUNCTION ${funcName}() RETURNS void AS $$ BEGIN NULL; END; $$ LANGUAGE plpgsql;`;
|
|
57
|
+
return createTemplate(name, content);
|
|
58
|
+
};
|
|
59
|
+
it('should create migration file when template changes', async () => {
|
|
60
|
+
await createTemplateWithFunc(`test-${testContext.timestamp}.sql`);
|
|
61
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
62
|
+
await manager.processTemplates({ generateFiles: true });
|
|
63
|
+
const migrations = await fs.readdir(join(testContext.testDir, 'test-migrations'));
|
|
64
|
+
const relevantMigrations = migrations.filter(m => m.includes(`test-${testContext.timestamp}`));
|
|
65
|
+
expect(relevantMigrations).toHaveLength(1);
|
|
66
|
+
});
|
|
67
|
+
it('should not allow building WIP templates', async () => {
|
|
68
|
+
await createTemplateWithFunc(`test-${testContext.timestamp}.wip.sql`);
|
|
69
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
70
|
+
await manager.processTemplates({ generateFiles: true });
|
|
71
|
+
const migrations = await fs.readdir(join(testContext.testDir, 'test-migrations'));
|
|
72
|
+
expect(migrations.filter(m => m.includes(`test-${testContext.timestamp}`))).toHaveLength(0);
|
|
73
|
+
});
|
|
74
|
+
it('should maintain separate build and local logs', async () => {
|
|
75
|
+
const templatePath = join(testContext.testDir, 'test-templates', `test-${testContext.timestamp}.sql`);
|
|
76
|
+
const templateContent = `CREATE FUNCTION ${testContext.testFunctionName}() RETURNS void AS $$ BEGIN NULL; END; $$ LANGUAGE plpgsql;`;
|
|
77
|
+
await fs.writeFile(templatePath, templateContent);
|
|
78
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
79
|
+
// Build writes to build log
|
|
80
|
+
await manager.processTemplates({ generateFiles: true });
|
|
81
|
+
const buildLog = JSON.parse(await fs.readFile(join(testContext.testDir, '.buildlog-test.json'), 'utf-8'));
|
|
82
|
+
const relPath = relative(testContext.testDir, templatePath);
|
|
83
|
+
expect(buildLog.templates[relPath].lastBuildHash).toBeDefined();
|
|
84
|
+
// Apply writes to local log
|
|
85
|
+
await manager.processTemplates({ apply: true });
|
|
86
|
+
const localLog = JSON.parse(await fs.readFile(join(testContext.testDir, '.buildlog-test.local.json'), 'utf-8'));
|
|
87
|
+
expect(localLog.templates[relPath].lastAppliedHash).toBeDefined();
|
|
88
|
+
});
|
|
89
|
+
it('should track template state correctly', async () => {
|
|
90
|
+
const templatePath = join(testContext.testDir, 'test-templates', `test-${testContext.timestamp}.sql`);
|
|
91
|
+
const templateContent = `CREATE FUNCTION ${testContext.testFunctionName}() RETURNS void AS $$ BEGIN NULL; END; $$ LANGUAGE plpgsql;`;
|
|
92
|
+
await fs.writeFile(templatePath, templateContent);
|
|
93
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
94
|
+
// Initially no state
|
|
95
|
+
let status = await manager.getTemplateStatus(templatePath);
|
|
96
|
+
expect(status.buildState.lastBuildHash).toBeUndefined();
|
|
97
|
+
expect(status.buildState.lastAppliedHash).toBeUndefined();
|
|
98
|
+
// After build
|
|
99
|
+
await manager.processTemplates({ generateFiles: true });
|
|
100
|
+
status = await manager.getTemplateStatus(templatePath);
|
|
101
|
+
expect(status.buildState.lastBuildHash).toBeDefined();
|
|
102
|
+
expect(status.buildState.lastBuildDate).toBeDefined();
|
|
103
|
+
// After apply
|
|
104
|
+
await manager.processTemplates({ apply: true });
|
|
105
|
+
status = await manager.getTemplateStatus(templatePath);
|
|
106
|
+
expect(status.buildState.lastAppliedHash).toBeDefined();
|
|
107
|
+
expect(status.buildState.lastAppliedDate).toBeDefined();
|
|
108
|
+
});
|
|
109
|
+
it('should handle rapid template changes', async () => {
|
|
110
|
+
const templatePath = join(testContext.testDir, 'test-templates', `test-${testContext.timestamp}.sql`);
|
|
111
|
+
const baseContent = `CREATE FUNCTION ${testContext.testFunctionName}() RETURNS void AS $$ BEGIN NULL; END; $$ LANGUAGE plpgsql;`;
|
|
112
|
+
await fs.writeFile(templatePath, baseContent);
|
|
113
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
114
|
+
const changes = [];
|
|
115
|
+
manager.on('templateChanged', async (template) => {
|
|
116
|
+
changes.push(template.currentHash);
|
|
117
|
+
});
|
|
118
|
+
const watcher = await manager.watch();
|
|
119
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
120
|
+
// Make rapid changes
|
|
121
|
+
for (let i = 0; i < 5; i++) {
|
|
122
|
+
await fs.writeFile(templatePath, `${baseContent}\n-- Change ${i}`);
|
|
123
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
124
|
+
}
|
|
125
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
126
|
+
watcher.close();
|
|
127
|
+
expect(changes.length).toBeGreaterThanOrEqual(1);
|
|
128
|
+
expect(new Set(changes).size).toBe(changes.length); // All changes should be unique
|
|
129
|
+
}, 10000);
|
|
130
|
+
it('should apply WIP templates directly to database', async () => {
|
|
131
|
+
const templatePath = join(testContext.testDir, 'test-templates', `test-${testContext.timestamp}.wip.sql`);
|
|
132
|
+
const templateContent = `CREATE FUNCTION ${testContext.testFunctionName}() RETURNS void AS $$ BEGIN NULL; END; $$ LANGUAGE plpgsql;`;
|
|
133
|
+
await fs.writeFile(templatePath, templateContent);
|
|
134
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
135
|
+
const result = await manager.processTemplates({ apply: true });
|
|
136
|
+
expect(result.errors).toHaveLength(0);
|
|
137
|
+
const client = await connect();
|
|
138
|
+
try {
|
|
139
|
+
const res = await client.query(`SELECT COUNT(*) FROM pg_proc WHERE proname = $1`, [
|
|
140
|
+
testContext.testFunctionName,
|
|
141
|
+
]);
|
|
142
|
+
expect(Number.parseInt(res.rows[0].count)).toBe(1);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
client.release();
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
it('should handle sequential template operations', async () => {
|
|
149
|
+
const templates = await Promise.all([...Array(5)].map((_, i) => createTemplateWithFunc(`test-${i}-${testContext.timestamp}.sql`, `_${i}`)));
|
|
150
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
151
|
+
// Apply templates one by one
|
|
152
|
+
for (const _templatePath of templates) {
|
|
153
|
+
const result = await manager.processTemplates({ apply: true });
|
|
154
|
+
expect(result.errors).toHaveLength(0);
|
|
155
|
+
}
|
|
156
|
+
const client = await connect();
|
|
157
|
+
try {
|
|
158
|
+
for (let i = 0; i < 5; i++) {
|
|
159
|
+
const res = await client.query(`SELECT proname FROM pg_proc WHERE proname = $1`, [
|
|
160
|
+
`${testContext.testFunctionName}_${i}`,
|
|
161
|
+
]);
|
|
162
|
+
expect(res.rows).toHaveLength(1);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
client.release();
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
it('should generate unique timestamps for multiple templates', async () => {
|
|
170
|
+
const templates = await Promise.all([...Array(10)].map((_, i) => createTemplateWithFunc(`test-${i}-${testContext.timestamp}.sql`, `_${i}`)));
|
|
171
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
172
|
+
await manager.processTemplates({ generateFiles: true });
|
|
173
|
+
const migrations = await fs.readdir(join(testContext.testDir, 'test-migrations'));
|
|
174
|
+
const timestamps = migrations.map(m => m.split('_')[0]);
|
|
175
|
+
const uniqueTimestamps = new Set(timestamps);
|
|
176
|
+
expect(uniqueTimestamps.size).toBe(templates.length);
|
|
177
|
+
expect(timestamps).toEqual([...timestamps].sort());
|
|
178
|
+
});
|
|
179
|
+
it('should handle mix of working and broken templates', async () => {
|
|
180
|
+
await createTemplateWithFunc(`test-good-${testContext.timestamp}.sql`, '_good');
|
|
181
|
+
await createTemplate(`test-bad-${testContext.timestamp}.sql`, 'INVALID SQL SYNTAX;');
|
|
182
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
183
|
+
const result = await manager.processTemplates({ apply: true });
|
|
184
|
+
expect(result.errors).toHaveLength(1);
|
|
185
|
+
expect(result.applied).toHaveLength(1);
|
|
186
|
+
const client = await connect();
|
|
187
|
+
try {
|
|
188
|
+
const res = await client.query(`SELECT COUNT(*) FROM pg_proc WHERE proname = $1`, [
|
|
189
|
+
`${testContext.testFunctionName}_good`,
|
|
190
|
+
]);
|
|
191
|
+
expect(Number.parseInt(res.rows[0].count)).toBe(1);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
client.release();
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
it('should handle database errors gracefully', async () => {
|
|
198
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
199
|
+
await createTemplate(`test-error-${testContext.timestamp}.sql`, 'SELECT 1/0;'); // Division by zero error
|
|
200
|
+
const result = await manager.processTemplates({ apply: true });
|
|
201
|
+
expect(result.errors).toHaveLength(1);
|
|
202
|
+
expect(result.errors[0]?.error).toMatch(/division by zero/i);
|
|
203
|
+
});
|
|
204
|
+
it('should handle file system errors', async () => {
|
|
205
|
+
const errorPath = join(testContext.testDir, 'test-templates', `test-error-${testContext.timestamp}.sql`);
|
|
206
|
+
try {
|
|
207
|
+
await createTemplate(`test-error-${testContext.timestamp}.sql`, 'SELECT 1;');
|
|
208
|
+
await fs.chmod(errorPath, 0o000);
|
|
209
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
210
|
+
await manager.processTemplates({ generateFiles: true });
|
|
211
|
+
// Cleanup for afterEach
|
|
212
|
+
await fs.chmod(errorPath, 0o644);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
expect(error).toBeDefined();
|
|
216
|
+
expect(error).toMatchObject({
|
|
217
|
+
errno: -13,
|
|
218
|
+
code: 'EACCES',
|
|
219
|
+
syscall: 'open',
|
|
220
|
+
path: expect.stringContaining('test-error'),
|
|
221
|
+
});
|
|
222
|
+
// expect(error.length).toBeGreaterThan(0);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
it('should handle large batches of templates', async () => {
|
|
226
|
+
// Create 50 templates
|
|
227
|
+
await Promise.all([...Array(50)].map((_, i) => createTemplateWithFunc(`test-${i}-${testContext.timestamp}.sql`, `_${i}`)));
|
|
228
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
229
|
+
const result = await manager.processTemplates({ generateFiles: true });
|
|
230
|
+
expect(result.errors).toHaveLength(0);
|
|
231
|
+
const migrations = await fs.readdir(join(testContext.testDir, 'test-migrations'));
|
|
232
|
+
expect(migrations.length).toBe(50);
|
|
233
|
+
});
|
|
234
|
+
it('should handle templates with complex SQL', async () => {
|
|
235
|
+
const complexSQL = `
|
|
236
|
+
CREATE OR REPLACE FUNCTION ${testContext.testFunctionName}(
|
|
237
|
+
param1 integer DEFAULT 100,
|
|
238
|
+
OUT result1 integer,
|
|
239
|
+
OUT result2 text
|
|
240
|
+
) RETURNS record AS $$
|
|
241
|
+
DECLARE
|
|
242
|
+
temp_var integer;
|
|
243
|
+
BEGIN
|
|
244
|
+
-- Complex logic with multiple statements
|
|
245
|
+
SELECT CASE
|
|
246
|
+
WHEN param1 > 100 THEN param1 * 2
|
|
247
|
+
ELSE param1 / 2
|
|
248
|
+
END INTO temp_var;
|
|
249
|
+
|
|
250
|
+
result1 := temp_var;
|
|
251
|
+
result2 := 'Processed: ' || temp_var::text;
|
|
252
|
+
|
|
253
|
+
-- Exception handling
|
|
254
|
+
EXCEPTION WHEN OTHERS THEN
|
|
255
|
+
result1 := -1;
|
|
256
|
+
result2 := SQLERRM;
|
|
257
|
+
END;
|
|
258
|
+
$$ LANGUAGE plpgsql;
|
|
259
|
+
`;
|
|
260
|
+
await createTemplate(`test-complex-${testContext.timestamp}.sql`, complexSQL);
|
|
261
|
+
const manager = await TemplateManager.create(testContext.testDir);
|
|
262
|
+
const result = await manager.processTemplates({ apply: true });
|
|
263
|
+
expect(result.errors).toHaveLength(0);
|
|
264
|
+
const client = await connect();
|
|
265
|
+
try {
|
|
266
|
+
const res = await client.query(`
|
|
267
|
+
SELECT proname, pronargs, prorettype::regtype::text as return_type
|
|
268
|
+
FROM pg_proc
|
|
269
|
+
WHERE proname = $1
|
|
270
|
+
`, [testContext.testFunctionName]);
|
|
271
|
+
expect(res.rows).toHaveLength(1);
|
|
272
|
+
expect(res.rows[0].return_type).toBe('record');
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
client.release();
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
it('should maintain template state across manager instances', async () => {
|
|
279
|
+
const template = await createTemplateWithFunc(`test-${testContext.timestamp}.sql`);
|
|
280
|
+
// First manager instance
|
|
281
|
+
const manager1 = await TemplateManager.create(testContext.testDir);
|
|
282
|
+
await manager1.processTemplates({ generateFiles: true });
|
|
283
|
+
// Second manager instance should see the state
|
|
284
|
+
const manager2 = await TemplateManager.create(testContext.testDir);
|
|
285
|
+
const status = await manager2.getTemplateStatus(template);
|
|
286
|
+
expect(status.buildState.lastBuildHash).toBeDefined();
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
//# sourceMappingURL=templateManager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templateManager.test.js","sourceRoot":"","sources":["../../src/lib/templateManager.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface TemplateBuildState {
|
|
2
|
+
lastBuildHash?: string;
|
|
3
|
+
lastBuildDate?: string;
|
|
4
|
+
lastBuildError?: string;
|
|
5
|
+
lastMigrationFile?: string;
|
|
6
|
+
lastAppliedHash?: string;
|
|
7
|
+
lastAppliedDate?: string;
|
|
8
|
+
lastAppliedError?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface BuildLog {
|
|
11
|
+
version: string;
|
|
12
|
+
lastTimestamp: string;
|
|
13
|
+
templates: {
|
|
14
|
+
[templatePath: string]: TemplateBuildState;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface MigrationError {
|
|
18
|
+
file: string;
|
|
19
|
+
error: string;
|
|
20
|
+
templateName: string;
|
|
21
|
+
}
|
|
22
|
+
export interface CLIConfig {
|
|
23
|
+
filter: string;
|
|
24
|
+
wipIndicator: string;
|
|
25
|
+
wrapInTransaction: boolean;
|
|
26
|
+
banner: string;
|
|
27
|
+
footer: string;
|
|
28
|
+
templateDir: string;
|
|
29
|
+
migrationDir: string;
|
|
30
|
+
buildLog: string;
|
|
31
|
+
localBuildLog: string;
|
|
32
|
+
pgConnection: string;
|
|
33
|
+
}
|
|
34
|
+
export interface CLIResult {
|
|
35
|
+
errors: MigrationError[];
|
|
36
|
+
applied: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface TemplateStatus {
|
|
39
|
+
name: string;
|
|
40
|
+
path: string;
|
|
41
|
+
currentHash: string;
|
|
42
|
+
migrationHash: string | null;
|
|
43
|
+
buildState: TemplateBuildState;
|
|
44
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { connect } from './databaseConnection.js';
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
export async function applyMigration(content, templateName, silent = false) {
|
|
4
|
+
const client = await connect();
|
|
5
|
+
try {
|
|
6
|
+
await client.query('BEGIN');
|
|
7
|
+
const lockKey = Math.abs(Buffer.from(templateName).reduce((acc, byte) => acc + byte, 0));
|
|
8
|
+
await client.query(`SELECT pg_advisory_xact_lock(${lockKey}::bigint)`);
|
|
9
|
+
await client.query(content);
|
|
10
|
+
await client.query('COMMIT');
|
|
11
|
+
if (!silent)
|
|
12
|
+
logger.success('Migration applied successfully');
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
await client.query('ROLLBACK');
|
|
17
|
+
if (!silent)
|
|
18
|
+
logger.error(`Migration failed for ${templateName}: ${error}`);
|
|
19
|
+
return {
|
|
20
|
+
file: templateName,
|
|
21
|
+
error: error instanceof Error ? error.message : String(error),
|
|
22
|
+
templateName,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
client.release();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=applyMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyMigration.js","sourceRoot":"","sources":["../../src/utils/applyMigration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,YAAoB,EACpB,MAAM,GAAG,KAAK;IAEd,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,MAAM,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,WAAW,CAAC,CAAC;QACvE,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,KAAK,CAAC,wBAAwB,YAAY,KAAK,KAAK,EAAE,CAAC,CAAC;QAC5E,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,YAAY;SACb,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { TEST_FN_PREFIX } from '../__tests__/vitest.setup.js';
|
|
3
|
+
import { applyMigration } from './applyMigration.js';
|
|
4
|
+
import { connect } from './databaseConnection.js';
|
|
5
|
+
describe('applyMigration', () => {
|
|
6
|
+
let client;
|
|
7
|
+
const testContext = {
|
|
8
|
+
timestamp: Date.now(),
|
|
9
|
+
testFunctionName: '',
|
|
10
|
+
};
|
|
11
|
+
beforeAll(async () => {
|
|
12
|
+
client = await connect();
|
|
13
|
+
});
|
|
14
|
+
beforeEach(async () => {
|
|
15
|
+
testContext.testFunctionName = `${TEST_FN_PREFIX}${testContext.timestamp}`;
|
|
16
|
+
await client.query('BEGIN');
|
|
17
|
+
await client.query(`DROP FUNCTION IF EXISTS ${testContext.testFunctionName}()`);
|
|
18
|
+
await client.query('COMMIT');
|
|
19
|
+
});
|
|
20
|
+
afterEach(async () => {
|
|
21
|
+
await client.query('BEGIN');
|
|
22
|
+
await client.query(`DROP FUNCTION IF EXISTS ${testContext.testFunctionName}()`);
|
|
23
|
+
await client.query('COMMIT');
|
|
24
|
+
});
|
|
25
|
+
it('should successfully apply valid SQL', async () => {
|
|
26
|
+
const sql = `
|
|
27
|
+
CREATE FUNCTION ${testContext.testFunctionName}()
|
|
28
|
+
RETURNS void AS $$
|
|
29
|
+
BEGIN NULL; END;
|
|
30
|
+
$$ LANGUAGE plpgsql;
|
|
31
|
+
`;
|
|
32
|
+
const result = await applyMigration(sql, 'test-template');
|
|
33
|
+
expect(result).toBe(true);
|
|
34
|
+
// Verify function exists
|
|
35
|
+
const res = await client.query(`SELECT proname FROM pg_proc WHERE proname = $1`, [
|
|
36
|
+
testContext.testFunctionName,
|
|
37
|
+
]);
|
|
38
|
+
expect(res.rows).toHaveLength(1);
|
|
39
|
+
});
|
|
40
|
+
it('should fail and rollback on invalid SQL', async () => {
|
|
41
|
+
const sql = 'INVALID SQL SYNTAX';
|
|
42
|
+
const result = await applyMigration(sql, 'test-template');
|
|
43
|
+
expect(result).not.toBe(true);
|
|
44
|
+
expect(result).toMatchObject({
|
|
45
|
+
file: 'test-template',
|
|
46
|
+
error: expect.stringMatching(/syntax error/i),
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it('should handle concurrent migrations with advisory locks', async () => {
|
|
50
|
+
const client2 = await connect();
|
|
51
|
+
const sql = `
|
|
52
|
+
DO $$
|
|
53
|
+
BEGIN
|
|
54
|
+
PERFORM pg_sleep(0.1);
|
|
55
|
+
RAISE NOTICE 'Executed after delay';
|
|
56
|
+
END $$;
|
|
57
|
+
`;
|
|
58
|
+
// Start two concurrent migrations
|
|
59
|
+
const [result1, result2] = await Promise.all([
|
|
60
|
+
applyMigration(sql, 'test-template'),
|
|
61
|
+
applyMigration(sql, 'test-template'),
|
|
62
|
+
]);
|
|
63
|
+
expect(result1).toBe(true);
|
|
64
|
+
expect(result2).toBe(true);
|
|
65
|
+
client2.release();
|
|
66
|
+
});
|
|
67
|
+
it('should handle transactions properly', async () => {
|
|
68
|
+
const sql = `
|
|
69
|
+
CREATE TABLE IF NOT EXISTS test_table_${testContext.timestamp} (id serial);
|
|
70
|
+
SELECT 1/0; -- Force error
|
|
71
|
+
`;
|
|
72
|
+
const result = await applyMigration(sql, 'test-template');
|
|
73
|
+
expect(result).not.toBe(true);
|
|
74
|
+
expect(result).toMatchObject({
|
|
75
|
+
error: expect.stringMatching(/division by zero/i),
|
|
76
|
+
});
|
|
77
|
+
// Verify table wasn't created (rollback worked)
|
|
78
|
+
const res = await client.query(`
|
|
79
|
+
SELECT EXISTS (
|
|
80
|
+
SELECT FROM information_schema.tables
|
|
81
|
+
WHERE table_name = $1
|
|
82
|
+
)`, [`test_table_${testContext.timestamp}`]);
|
|
83
|
+
expect(res.rows[0].exists).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it('should handle large SQL statements', async () => {
|
|
86
|
+
// Generate a large SQL statement
|
|
87
|
+
const statements = Array(1000)
|
|
88
|
+
.fill(0)
|
|
89
|
+
.map((_, i) => `SELECT ${i} as number;`)
|
|
90
|
+
.join('\n');
|
|
91
|
+
const result = await applyMigration(statements, 'test-template');
|
|
92
|
+
expect(result).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('should handle errors in stored procedures', async () => {
|
|
95
|
+
const sql = `
|
|
96
|
+
CREATE OR REPLACE FUNCTION ${testContext.testFunctionName}()
|
|
97
|
+
RETURNS void AS $$
|
|
98
|
+
BEGIN
|
|
99
|
+
RAISE EXCEPTION 'Custom error message';
|
|
100
|
+
END;
|
|
101
|
+
$$ LANGUAGE plpgsql;
|
|
102
|
+
|
|
103
|
+
SELECT ${testContext.testFunctionName}();
|
|
104
|
+
`;
|
|
105
|
+
const result = await applyMigration(sql, 'test-template');
|
|
106
|
+
expect(result).not.toBe(true);
|
|
107
|
+
expect(result).toMatchObject({
|
|
108
|
+
error: expect.stringMatching(/Custom error message/),
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=applyMigrations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyMigrations.test.js","sourceRoot":"","sources":["../../src/utils/applyMigrations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function calculateMD5(content: string): Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculateMD5.js","sourceRoot":"","sources":["../../src/utils/calculateMD5.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|