@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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +277 -0
  3. package/dist/__tests__/vitest.setup.d.ts +2 -0
  4. package/dist/__tests__/vitest.setup.js +72 -0
  5. package/dist/__tests__/vitest.setup.js.map +1 -0
  6. package/dist/__tests__/watch.test.d.ts +1 -0
  7. package/dist/__tests__/watch.test.js +24 -0
  8. package/dist/__tests__/watch.test.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +7 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/_app.d.ts +3 -0
  13. package/dist/commands/_app.js +7 -0
  14. package/dist/commands/_app.js.map +1 -0
  15. package/dist/commands/apply.d.ts +1 -0
  16. package/dist/commands/apply.js +20 -0
  17. package/dist/commands/apply.js.map +1 -0
  18. package/dist/commands/build.d.ts +1 -0
  19. package/dist/commands/build.js +15 -0
  20. package/dist/commands/build.js.map +1 -0
  21. package/dist/commands/help.d.ts +1 -0
  22. package/dist/commands/help.js +2 -0
  23. package/dist/commands/help.js.map +1 -0
  24. package/dist/commands/index.d.ts +2 -0
  25. package/dist/commands/index.js +37 -0
  26. package/dist/commands/index.js.map +1 -0
  27. package/dist/commands/init.d.ts +1 -0
  28. package/dist/commands/init.js +80 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/register.d.ts +8 -0
  31. package/dist/commands/register.js +82 -0
  32. package/dist/commands/register.js.map +1 -0
  33. package/dist/commands/watch.d.ts +2 -0
  34. package/dist/commands/watch.js +127 -0
  35. package/dist/commands/watch.js.map +1 -0
  36. package/dist/components/Branding.d.ts +6 -0
  37. package/dist/components/Branding.js +28 -0
  38. package/dist/components/Branding.js.map +1 -0
  39. package/dist/components/TimeSince.d.ts +4 -0
  40. package/dist/components/TimeSince.js +29 -0
  41. package/dist/components/TimeSince.js.map +1 -0
  42. package/dist/constants.d.ts +1 -0
  43. package/dist/constants.js +2 -0
  44. package/dist/constants.js.map +1 -0
  45. package/dist/hooks/useTemplateState.d.ts +6 -0
  46. package/dist/hooks/useTemplateState.js +28 -0
  47. package/dist/hooks/useTemplateState.js.map +1 -0
  48. package/dist/lib/templateManager.d.ts +32 -0
  49. package/dist/lib/templateManager.js +237 -0
  50. package/dist/lib/templateManager.js.map +1 -0
  51. package/dist/lib/templateManager.test.d.ts +1 -0
  52. package/dist/lib/templateManager.test.js +289 -0
  53. package/dist/lib/templateManager.test.js.map +1 -0
  54. package/dist/types.d.ts +44 -0
  55. package/dist/types.js +2 -0
  56. package/dist/types.js.map +1 -0
  57. package/dist/utils/applyMigration.d.ts +2 -0
  58. package/dist/utils/applyMigration.js +29 -0
  59. package/dist/utils/applyMigration.js.map +1 -0
  60. package/dist/utils/applyMigrations.test.d.ts +1 -0
  61. package/dist/utils/applyMigrations.test.js +112 -0
  62. package/dist/utils/applyMigrations.test.js.map +1 -0
  63. package/dist/utils/calculateMD5.d.ts +1 -0
  64. package/dist/utils/calculateMD5.js +5 -0
  65. package/dist/utils/calculateMD5.js.map +1 -0
  66. package/dist/utils/config.d.ts +3 -0
  67. package/dist/utils/config.js +78 -0
  68. package/dist/utils/config.js.map +1 -0
  69. package/dist/utils/config.test.d.ts +1 -0
  70. package/dist/utils/config.test.js +61 -0
  71. package/dist/utils/config.test.js.map +1 -0
  72. package/dist/utils/createEmptyBuildLog.d.ts +1 -0
  73. package/dist/utils/createEmptyBuildLog.js +10 -0
  74. package/dist/utils/createEmptyBuildLog.js.map +1 -0
  75. package/dist/utils/databaseConnection.d.ts +3 -0
  76. package/dist/utils/databaseConnection.js +45 -0
  77. package/dist/utils/databaseConnection.js.map +1 -0
  78. package/dist/utils/databaseConnection.test.d.ts +1 -0
  79. package/dist/utils/databaseConnection.test.js +45 -0
  80. package/dist/utils/databaseConnection.test.js.map +1 -0
  81. package/dist/utils/ensureDirectories.d.ts +4 -0
  82. package/dist/utils/ensureDirectories.js +23 -0
  83. package/dist/utils/ensureDirectories.js.map +1 -0
  84. package/dist/utils/fileExists.d.ts +1 -0
  85. package/dist/utils/fileExists.js +11 -0
  86. package/dist/utils/fileExists.js.map +1 -0
  87. package/dist/utils/getNextTimestamp.d.ts +2 -0
  88. package/dist/utils/getNextTimestamp.js +12 -0
  89. package/dist/utils/getNextTimestamp.js.map +1 -0
  90. package/dist/utils/isWipTemplate.d.ts +1 -0
  91. package/dist/utils/isWipTemplate.js +6 -0
  92. package/dist/utils/isWipTemplate.js.map +1 -0
  93. package/dist/utils/loadBuildLog.d.ts +2 -0
  94. package/dist/utils/loadBuildLog.js +21 -0
  95. package/dist/utils/loadBuildLog.js.map +1 -0
  96. package/dist/utils/loadBuildLog.test.d.ts +1 -0
  97. package/dist/utils/loadBuildLog.test.js +62 -0
  98. package/dist/utils/loadBuildLog.test.js.map +1 -0
  99. package/dist/utils/logger.d.ts +8 -0
  100. package/dist/utils/logger.js +11 -0
  101. package/dist/utils/logger.js.map +1 -0
  102. package/dist/utils/registerTemplate.d.ts +1 -0
  103. package/dist/utils/registerTemplate.js +44 -0
  104. package/dist/utils/registerTemplate.js.map +1 -0
  105. package/dist/utils/safeCreate.d.ts +1 -0
  106. package/dist/utils/safeCreate.js +10 -0
  107. package/dist/utils/safeCreate.js.map +1 -0
  108. package/dist/utils/saveBuildLog.d.ts +2 -0
  109. package/dist/utils/saveBuildLog.js +9 -0
  110. package/dist/utils/saveBuildLog.js.map +1 -0
  111. 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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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { MigrationError } from '../types.js';
2
+ export declare function applyMigration(content: string, templateName: string, silent?: boolean): Promise<true | MigrationError>;
@@ -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,5 @@
1
+ import crypto from 'node:crypto';
2
+ export async function calculateMD5(content) {
3
+ return crypto.createHash('md5').update(content).digest('hex');
4
+ }
5
+ //# sourceMappingURL=calculateMD5.js.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import type { CLIConfig } from '../types.js';
2
+ export declare function getConfig(dir?: string): Promise<CLIConfig>;
3
+ export declare function saveConfig(baseDir: string, config: Partial<CLIConfig>): Promise<void>;