@t1mmen/srtd 0.4.5 โ 0.4.6
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/README.md +38 -18
- package/dist/__tests__/helpers.d.ts +27 -0
- package/dist/__tests__/helpers.js +55 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/commands/register.js +20 -7
- package/dist/commands/register.js.map +1 -1
- package/dist/hooks/useTemplateManager.d.ts +1 -1
- package/dist/hooks/useTemplateManager.js +4 -2
- package/dist/hooks/useTemplateManager.js.map +1 -1
- package/dist/hooks/useTemplateProcessor.js +3 -1
- package/dist/hooks/useTemplateProcessor.js.map +1 -1
- package/dist/hooks/useTemplateState.js +2 -1
- package/dist/hooks/useTemplateState.js.map +1 -1
- package/dist/utils/findProjectRoot.d.ts +1 -0
- package/dist/utils/findProjectRoot.js +25 -0
- package/dist/utils/findProjectRoot.js.map +1 -0
- package/dist/utils/registerTemplate.js +7 -3
- package/dist/utils/registerTemplate.js.map +1 -1
- package/dist/utils/registerTemplate.test.d.ts +1 -0
- package/dist/utils/registerTemplate.test.js +142 -0
- package/dist/utils/registerTemplate.test.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -35,19 +35,19 @@ Say hello to `srtd`.
|
|
|
35
35
|
## Key Features โจ
|
|
36
36
|
|
|
37
37
|
- **Live Reload**: Changes to your SQL templates instantly update your local database
|
|
38
|
-
- **
|
|
39
|
-
- **Just SQL**: Templates build
|
|
40
|
-
- **
|
|
38
|
+
- **Templates as source of truth**: Templates are the source of (non-mutable) database objects
|
|
39
|
+
- **Just SQL**: Templates as just SQL, and `build` to standard [Supabase](https://supabase.com) migrations when you're ready to ship
|
|
40
|
+
- **Sane code reviews**: Templates evolve like regular code, making diffs in PR's and `git blame` work like you'd expect.
|
|
41
|
+
- **Developer Friendly**: Interactive CLI with visual feedback for all operations.
|
|
41
42
|
|
|
42
43
|
Built specifically for projects using the standard [Supabase](https://supabase.com) stack (but probably works alright for other Postgres-based projects, too).
|
|
43
44
|
|
|
44
|
-
##
|
|
45
|
+
## Quick Start ๐
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
- [Supabase](https://supabase.com) CLI installed and project initialized (with `/supabase` directory)
|
|
48
|
-
- Local Postgres instance running (typically via `supabase start`)
|
|
47
|
+
### Requirements
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
- Node.js v20.x or higher
|
|
50
|
+
- [Supabase](https://supabase.com) project initialized (in `/supabase`).
|
|
51
51
|
|
|
52
52
|
### Installation
|
|
53
53
|
|
|
@@ -74,7 +74,8 @@ npx @t1mmen/srtd init # Creates srtd.config.json, not required
|
|
|
74
74
|
Create `supabase/migrations-templates/my_function.sql`:
|
|
75
75
|
|
|
76
76
|
```sql
|
|
77
|
-
|
|
77
|
+
DROP FUNCTION IF EXISTS public.my_function; -- Makes it easier to change args later
|
|
78
|
+
CREATE FUNCTION my_function()
|
|
78
79
|
RETURNS void AS $$
|
|
79
80
|
BEGIN
|
|
80
81
|
-- Your function logic here
|
|
@@ -95,8 +96,7 @@ npx @t1mmen/srtd build # Creates timestamped migration file
|
|
|
95
96
|
supabase migration up # Apply using Supabase CLI
|
|
96
97
|
```
|
|
97
98
|
|
|
98
|
-
|
|
99
|
-
> [!INFO]
|
|
99
|
+
> [!TIP]
|
|
100
100
|
> To reduce noise in PR's, consider adding `migration-templates/*srtd*.sql linguist-generated=true` to your [`.gitattributes` file.](https://docs.github.com/en/repositories/working-with-files/managing-files/customizing-how-changed-files-appear-on-github) (unless you manually edit the generated files)
|
|
101
101
|
|
|
102
102
|
|
|
@@ -110,7 +110,8 @@ Without templates, the smallest change to a function would show up as a complete
|
|
|
110
110
|
โ
Database functions:
|
|
111
111
|
```diff
|
|
112
112
|
-- Event notifications
|
|
113
|
-
|
|
113
|
+
DROP FUNCTION IF EXISTS notify_changes;
|
|
114
|
+
CREATE FUNCTION notify_changes()
|
|
114
115
|
RETURNS trigger AS $$
|
|
115
116
|
BEGIN
|
|
116
117
|
PERFORM pg_notify(
|
|
@@ -173,12 +174,31 @@ Without templates, the smallest change to a function would show up as a complete
|
|
|
173
174
|
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'push';
|
|
174
175
|
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'pusher';
|
|
175
176
|
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'webhook';
|
|
176
|
-
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS '
|
|
177
|
+
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'whatsapp';
|
|
177
178
|
END $$;
|
|
178
179
|
```
|
|
179
180
|
|
|
180
|
-
|
|
181
|
+
โ
Triggers
|
|
182
|
+
```
|
|
183
|
+
DROP TRIGGER IF EXISTS on_new_user ON auth.users;
|
|
184
|
+
DROP FUNCTION IF EXISTS public.setup_new_user;
|
|
185
|
+
|
|
186
|
+
CREATE FUNCTION public.setup_new_user() RETURNS TRIGGER LANGUAGE plpgsql SECURITY DEFINER
|
|
187
|
+
SET search_path = public AS $$
|
|
188
|
+
BEGIN
|
|
189
|
+
-- Existing logic for new users
|
|
190
|
+
|
|
191
|
+
+ -- Your new changes go here..
|
|
192
|
+
END;
|
|
193
|
+
$$;
|
|
194
|
+
|
|
195
|
+
CREATE TRIGGER on_new_user AFTER INSERT ON auth.users FOR EACHW EXECUTE PROCEDURE public.setup_new_user ();
|
|
196
|
+
```
|
|
181
197
|
|
|
198
|
+
> [!TIP]
|
|
199
|
+
> You don't need to specifying parameters in drop functions. E.g `DROP FUNCTION IF EXISTS public.my_function;`. This ensures you don't end up with multiple functions with the same name, but different parameters.
|
|
200
|
+
|
|
201
|
+
### Not Recommended Fo
|
|
182
202
|
* โ Table structures
|
|
183
203
|
* โ Indexes
|
|
184
204
|
* โ Data modifications
|
|
@@ -191,13 +211,13 @@ Use regular [Supabase](https://supabase.com) migrations for these cases.
|
|
|
191
211
|
|
|
192
212
|
### Interactive Mode
|
|
193
213
|
|
|
194
|
-
Running `npx @t1mmen/srtd` without arguments opens an interactive menu:
|
|
214
|
+
Running `npx @t1mmen/srtd` without arguments opens an interactive menu. All commands can also be run directly:
|
|
195
215
|
|
|
216
|
+
- ๐ `srtd watch` - Watch and auto-apply changes
|
|
196
217
|
- ๐๏ธ `srtd build [--force]` - Generate migrations from templates
|
|
197
218
|
- โถ๏ธ `srtd apply [--force]` - Apply templates directly to local database
|
|
198
219
|
- โ๏ธ `srtd register [file.sql...]` - Mark templates as already built
|
|
199
220
|
- ๐ `srtd promote - [file.sql ...]` - Promote WIP template to buildable templates
|
|
200
|
-
- ๐ `srtd watch` - Watch and auto-apply changes
|
|
201
221
|
- ๐งน `srtd clean` - Remove all logs and reset config
|
|
202
222
|
|
|
203
223
|
> [!IMPORTANT]
|
|
@@ -205,7 +225,7 @@ Running `npx @t1mmen/srtd` without arguments opens an interactive menu:
|
|
|
205
225
|
|
|
206
226
|
## Configuration ๐
|
|
207
227
|
|
|
208
|
-
`srtd.config.json` created
|
|
228
|
+
`srtd.config.json` can be created with `init` command. It is not necessary, if the defaults suit your needs.
|
|
209
229
|
|
|
210
230
|
```jsonc
|
|
211
231
|
{
|
|
@@ -245,7 +265,7 @@ Add `.wip.sql` extension to prevent migration generation:
|
|
|
245
265
|
my_function.wip.sql # Only applied locally, never built
|
|
246
266
|
```
|
|
247
267
|
|
|
248
|
-
Make a WIP
|
|
268
|
+
Make a WIP template buildable as migration by renaming it, or using the `promote` command:
|
|
249
269
|
```bash
|
|
250
270
|
npx @t1mmen/srtd promote my_function.wip.sql
|
|
251
271
|
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface TestContext {
|
|
2
|
+
timestamp: number;
|
|
3
|
+
testDir: string;
|
|
4
|
+
testFunctionName: string;
|
|
5
|
+
templateCounter: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Creates a test context with all the goodies we need! ๐
|
|
9
|
+
*/
|
|
10
|
+
export declare function createTestContext(name?: string): TestContext;
|
|
11
|
+
/**
|
|
12
|
+
* Get unique template names - perfect for testing! ๐ท๏ธ
|
|
13
|
+
*/
|
|
14
|
+
export declare function getNextTemplateName(context: TestContext, prefix?: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Create a template file with whatever content you want! ๐
|
|
17
|
+
*/
|
|
18
|
+
export declare function createTemplate(context: TestContext, name: string, content: string, dir?: string): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Create a template with a basic Postgres function - the bread and butter of testing! ๐
|
|
21
|
+
*/
|
|
22
|
+
export declare function createTemplateWithFunc(context: TestContext, prefix: string, funcSuffix?: string, dir?: string): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Clean up after our tests like good citizens! ๐งน
|
|
25
|
+
*/
|
|
26
|
+
export declare function cleanupTestContext(context: TestContext): Promise<void>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// src/__tests__/helpers.ts
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { TEST_FN_PREFIX } from './vitest.setup.js';
|
|
5
|
+
/**
|
|
6
|
+
* Creates a test context with all the goodies we need! ๐
|
|
7
|
+
*/
|
|
8
|
+
export function createTestContext(name = 'test') {
|
|
9
|
+
return {
|
|
10
|
+
timestamp: Date.now(),
|
|
11
|
+
testDir: path.join(process.env.TMPDIR || '/tmp', `srtd-${name}-${Date.now()}`),
|
|
12
|
+
testFunctionName: `${TEST_FN_PREFIX}${Date.now()}`,
|
|
13
|
+
templateCounter: 0,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get unique template names - perfect for testing! ๐ท๏ธ
|
|
18
|
+
*/
|
|
19
|
+
export function getNextTemplateName(context, prefix = 'template') {
|
|
20
|
+
context.templateCounter++;
|
|
21
|
+
return `${prefix}_${context.timestamp}_${context.templateCounter}`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a template file with whatever content you want! ๐
|
|
25
|
+
*/
|
|
26
|
+
export async function createTemplate(context, name, content, dir) {
|
|
27
|
+
const fullPath = dir
|
|
28
|
+
? path.join(context.testDir, 'test-templates', dir, name)
|
|
29
|
+
: path.join(context.testDir, 'test-templates', name);
|
|
30
|
+
try {
|
|
31
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
32
|
+
await fs.writeFile(fullPath, content);
|
|
33
|
+
return fullPath;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error('Error creating template:', error);
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a template with a basic Postgres function - the bread and butter of testing! ๐
|
|
42
|
+
*/
|
|
43
|
+
export async function createTemplateWithFunc(context, prefix, funcSuffix = '', dir) {
|
|
44
|
+
const name = `${getNextTemplateName(context, prefix)}.sql`;
|
|
45
|
+
const funcName = `${context.testFunctionName}${funcSuffix}`;
|
|
46
|
+
const content = `CREATE OR REPLACE FUNCTION ${funcName}() RETURNS void AS $$ BEGIN NULL; END; $$ LANGUAGE plpgsql;`;
|
|
47
|
+
return createTemplate(context, name, content, dir);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Clean up after our tests like good citizens! ๐งน
|
|
51
|
+
*/
|
|
52
|
+
export async function cleanupTestContext(context) {
|
|
53
|
+
await fs.rm(context.testDir, { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASnD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAI,GAAG,MAAM;IAC7C,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,EAAE,QAAQ,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC9E,gBAAgB,EAAE,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;QAClD,eAAe,EAAE,CAAC;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAoB,EAAE,MAAM,GAAG,UAAU;IAC3E,OAAO,CAAC,eAAe,EAAE,CAAC;IAC1B,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAoB,EACpB,IAAY,EACZ,OAAe,EACf,GAAY;IAEZ,MAAM,QAAQ,GAAG,GAAG;QAClB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAoB,EACpB,MAAc,EACd,UAAU,GAAG,EAAE,EACf,GAAY;IAEZ,MAAM,IAAI,GAAG,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;IAC3D,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,gBAAgB,GAAG,UAAU,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,8BAA8B,QAAQ,6DAA6D,CAAC;IACpH,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAoB;IAC3D,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -8,6 +8,7 @@ import Branding from '../components/Branding.js';
|
|
|
8
8
|
import Quittable from '../components/Quittable.js';
|
|
9
9
|
import { COLOR_ERROR, COLOR_SUCCESS, COLOR_WARNING } from '../components/customTheme.js';
|
|
10
10
|
import { useTemplateState } from '../hooks/useTemplateState.js';
|
|
11
|
+
import { findProjectRoot } from '../utils/findProjectRoot.js';
|
|
11
12
|
import { registerTemplate } from '../utils/registerTemplate.js';
|
|
12
13
|
// Support both array of filenames as arguments and interactive selection
|
|
13
14
|
export const args = zod
|
|
@@ -33,14 +34,24 @@ export default function Register({ args: templateArgs }) {
|
|
|
33
34
|
setErrorMessage('');
|
|
34
35
|
let successCount = 0;
|
|
35
36
|
let failCount = 0;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
try {
|
|
38
|
+
const projectRoot = await findProjectRoot();
|
|
39
|
+
for (const path of templates) {
|
|
40
|
+
try {
|
|
41
|
+
await registerTemplate(path, projectRoot);
|
|
42
|
+
successCount++;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
console.error(err);
|
|
46
|
+
failCount++;
|
|
47
|
+
}
|
|
40
48
|
}
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (err instanceof Error) {
|
|
52
|
+
setErrorMessage(err.message);
|
|
43
53
|
}
|
|
54
|
+
process.exit(1);
|
|
44
55
|
}
|
|
45
56
|
if (failCount > 0) {
|
|
46
57
|
setErrorMessage(`Failed to register ${failCount} template(s).`);
|
|
@@ -103,7 +114,9 @@ export default function Register({ args: templateArgs }) {
|
|
|
103
114
|
React.createElement(Box, { gap: 2 }, options.length === 0 ? (React.createElement(Box, { flexDirection: "column" },
|
|
104
115
|
React.createElement(Text, { color: COLOR_WARNING },
|
|
105
116
|
figures.warning,
|
|
106
|
-
" No templates
|
|
117
|
+
" No templates ",
|
|
118
|
+
!showAll && 'unregistered',
|
|
119
|
+
" found"),
|
|
107
120
|
!showAll && !!items.length && (React.createElement(Text, { dimColor: true },
|
|
108
121
|
figures.info,
|
|
109
122
|
" Press r to show registered templates")),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,yEAAyE;AACzE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG;KACpB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;KACnB,QAAQ,EAAE;KACV,QAAQ,CACP,QAAQ,CAAC;IACP,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,uCAAuC;CACrD,CAAC,CACH,CAAC;AAMJ,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAS;IAC5D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC5C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAW,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,0BAA0B,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,SAAmB,EAAE,EAAE;QACjF,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACtB,eAAe,CAAC,EAAE,CAAC,CAAC;QAEpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { TemplateManager } from '../lib/templateManager.js';
|
|
4
4
|
import { getConfig } from '../utils/config.js';
|
|
5
|
-
|
|
5
|
+
import { findProjectRoot } from '../utils/findProjectRoot.js';
|
|
6
|
+
export function useTemplateManager(baseDir) {
|
|
6
7
|
const [templates, setTemplates] = useState([]);
|
|
7
8
|
const [updates, setUpdates] = useState([]);
|
|
8
9
|
const [errors, setErrors] = useState(new Map());
|
|
@@ -29,6 +30,7 @@ export function useTemplateManager(cwd = process.cwd()) {
|
|
|
29
30
|
let mounted = true;
|
|
30
31
|
async function init() {
|
|
31
32
|
try {
|
|
33
|
+
const cwd = baseDir || (await findProjectRoot());
|
|
32
34
|
const config = await getConfig(cwd);
|
|
33
35
|
setTemplateDir(config.templateDir);
|
|
34
36
|
managerRef.current = await TemplateManager.create(cwd, { silent: true });
|
|
@@ -110,7 +112,7 @@ export function useTemplateManager(cwd = process.cwd()) {
|
|
|
110
112
|
mounted = false;
|
|
111
113
|
managerRef.current?.[Symbol.dispose]();
|
|
112
114
|
};
|
|
113
|
-
}, [
|
|
115
|
+
}, [baseDir]);
|
|
114
116
|
return {
|
|
115
117
|
templates: sortedTemplates,
|
|
116
118
|
updates,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTemplateManager.js","sourceRoot":"","sources":["../../src/hooks/useTemplateManager.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"useTemplateManager.js","sourceRoot":"","sources":["../../src/hooks/useTemplateManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
52
52
|
});
|
|
53
53
|
import { useEffect, useRef, useState } from 'react';
|
|
54
54
|
import { TemplateManager } from '../lib/templateManager.js';
|
|
55
|
+
import { findProjectRoot } from '../utils/findProjectRoot.js';
|
|
55
56
|
export function useTemplateProcessor(options) {
|
|
56
57
|
const [result, setResult] = useState({
|
|
57
58
|
applied: [],
|
|
@@ -69,7 +70,8 @@ export function useTemplateProcessor(options) {
|
|
|
69
70
|
try {
|
|
70
71
|
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
71
72
|
try {
|
|
72
|
-
const
|
|
73
|
+
const projectRoot = await findProjectRoot();
|
|
74
|
+
const manager = __addDisposableResource(env_1, await TemplateManager.create(projectRoot, { silent: true }), false);
|
|
73
75
|
const result = await manager.processTemplates(options);
|
|
74
76
|
setResult(result);
|
|
75
77
|
setIsProcessing(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTemplateProcessor.js","sourceRoot":"","sources":["../../src/hooks/useTemplateProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"useTemplateProcessor.js","sourceRoot":"","sources":["../../src/hooks/useTemplateProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAS9D,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC5D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA0B;QAC5D,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,OAAO;YAAE,OAAO;QAC9B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAEzB,KAAK,UAAU,YAAY;YACzB,IAAI,CAAC;;;oBACH,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;oBAC5C,MAAM,OAAO,kCAAG,MAAM,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,QAAA,CAAC;oBAC5E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBACvD,SAAS,CAAC,MAAM,CAAC,CAAC;oBAClB,eAAe,CAAC,KAAK,CAAC,CAAC;oBACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;;;;;;;;;aACxB;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;gBACxC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACjB,GAAG,IAAI;oBACP,MAAM,EAAE;wBACN,GAAG,IAAI,CAAC,MAAM;wBACd;4BACE,IAAI,EAAE,SAAS;4BACf,YAAY,EAAE,QAAQ;4BACtB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD;qBACF;iBACF,CAAC,CAAC,CAAC;gBACJ,eAAe,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,KAAK,YAAY,EAAE,CAAC;IACtB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// hooks/useTemplateState.ts
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
3
|
import { TemplateManager } from '../lib/templateManager.js';
|
|
4
|
+
import { findProjectRoot } from '../utils/findProjectRoot.js';
|
|
4
5
|
export function useTemplateState() {
|
|
5
6
|
const [loading, setLoading] = useState(true);
|
|
6
7
|
const [error, setError] = useState(null);
|
|
@@ -8,7 +9,7 @@ export function useTemplateState() {
|
|
|
8
9
|
useEffect(() => {
|
|
9
10
|
async function fetchStatus() {
|
|
10
11
|
try {
|
|
11
|
-
const baseDir =
|
|
12
|
+
const baseDir = await findProjectRoot();
|
|
12
13
|
const manager = await TemplateManager.create(baseDir);
|
|
13
14
|
const templates = await manager.findTemplates();
|
|
14
15
|
const statuses = await Promise.all(templates.map(t => manager.getTemplateStatus(t)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTemplateState.js","sourceRoot":"","sources":["../../src/hooks/useTemplateState.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"useTemplateState.js","sourceRoot":"","sources":["../../src/hooks/useTemplateState.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,UAAU,WAAW;YACxB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;gBACxC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;gBAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrF,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACjE,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,WAAW,EAAE,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function findProjectRoot(startDir?: string): Promise<string>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileExists } from './fileExists.js';
|
|
3
|
+
async function isProjectDir(dir) {
|
|
4
|
+
// Check for srtd config files
|
|
5
|
+
if (await fileExists(path.join(dir, 'srtd.config.json')))
|
|
6
|
+
return true;
|
|
7
|
+
// Check for package.json
|
|
8
|
+
if (await fileExists(path.join(dir, 'package.json')))
|
|
9
|
+
return true;
|
|
10
|
+
// Check for supabase directory
|
|
11
|
+
if (await fileExists(path.join(dir, 'supabase')))
|
|
12
|
+
return true;
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
export async function findProjectRoot(startDir) {
|
|
16
|
+
let currentDir = startDir || process.cwd();
|
|
17
|
+
while (currentDir !== path.parse(currentDir).root) {
|
|
18
|
+
if (await isProjectDir(currentDir)) {
|
|
19
|
+
return currentDir;
|
|
20
|
+
}
|
|
21
|
+
currentDir = path.dirname(currentDir);
|
|
22
|
+
}
|
|
23
|
+
throw new Error('Could not find project root. Are you in a Supabase project directory?');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=findProjectRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findProjectRoot.js","sourceRoot":"","sources":["../../src/utils/findProjectRoot.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,8BAA8B;IAC9B,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtE,yBAAyB;IACzB,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAElE,+BAA+B;IAC/B,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAiB;IACrD,IAAI,UAAU,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE3C,OAAO,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -7,10 +7,11 @@ import { fileExists } from './fileExists.js';
|
|
|
7
7
|
import { loadBuildLog } from './loadBuildLog.js';
|
|
8
8
|
import { saveBuildLog } from './saveBuildLog.js';
|
|
9
9
|
export async function registerTemplate(templatePath, baseDir) {
|
|
10
|
-
const config = await getConfig(
|
|
11
|
-
// Try multiple path resolutions
|
|
10
|
+
const config = await getConfig();
|
|
12
11
|
const pathsToTry = [
|
|
13
|
-
path.
|
|
12
|
+
path.resolve(templatePath),
|
|
13
|
+
path.resolve(baseDir, templatePath),
|
|
14
|
+
path.join(baseDir, templatePath),
|
|
14
15
|
];
|
|
15
16
|
let resolvedPath = null;
|
|
16
17
|
for (const p of pathsToTry) {
|
|
@@ -26,6 +27,9 @@ export async function registerTemplate(templatePath, baseDir) {
|
|
|
26
27
|
}
|
|
27
28
|
throw new Error(`Template ${templatePath} not found`);
|
|
28
29
|
}
|
|
30
|
+
if (!resolvedPath.startsWith(path.resolve(baseDir, config.templateDir))) {
|
|
31
|
+
throw new Error(`Template in wrong directly, must be located inside of configured templateDir: ${config.templateDir}/*`);
|
|
32
|
+
}
|
|
29
33
|
const content = await fs.readFile(resolvedPath, 'utf-8');
|
|
30
34
|
const hash = await calculateMD5(content);
|
|
31
35
|
const relativePath = path.relative(baseDir, resolvedPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerTemplate.js","sourceRoot":"","sources":["../../src/utils/registerTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAoB,EAAE,OAAe;IAC1E,MAAM,MAAM,GAAG,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"registerTemplate.js","sourceRoot":"","sources":["../../src/utils/registerTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAoB,EAAE,OAAe;IAC1E,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;KACjC,CAAC;IAEF,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,YAAY,GAAG,CAAC,CAAC;YACjB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,iCAAiC,CAAC,CAAC;QACpE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,YAAY,YAAY,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb,iFAAiF,MAAM,CAAC,WAAW,IAAI,CACxG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,mBAAmB;IACnB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG;QACjC,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,GAAG;QAClB,iBAAiB,EAAE,EAAE,EAAE,4CAA4C;KACpE,CAAC;IAEF,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
4
|
+
import { TEST_ROOT } from '../__tests__/vitest.setup.js';
|
|
5
|
+
import { calculateMD5 } from '../utils/calculateMD5.js';
|
|
6
|
+
import { getConfig } from '../utils/config.js';
|
|
7
|
+
import { registerTemplate } from '../utils/registerTemplate.js';
|
|
8
|
+
describe('registerTemplate', () => {
|
|
9
|
+
const testContext = {
|
|
10
|
+
testId: 0,
|
|
11
|
+
testDir: '',
|
|
12
|
+
templateCounter: 0,
|
|
13
|
+
};
|
|
14
|
+
beforeEach(async () => {
|
|
15
|
+
testContext.testId = Math.floor(Math.random() * 1000000);
|
|
16
|
+
testContext.testDir = path.join(TEST_ROOT, `register-template-${testContext.testId}`);
|
|
17
|
+
testContext.templateCounter = 0;
|
|
18
|
+
// Create test directories using config paths
|
|
19
|
+
const config = await getConfig(testContext.testDir);
|
|
20
|
+
await fs.mkdir(path.join(testContext.testDir, config.templateDir), { recursive: true });
|
|
21
|
+
});
|
|
22
|
+
afterEach(async () => {
|
|
23
|
+
await fs.rm(testContext.testDir, { recursive: true, force: true });
|
|
24
|
+
});
|
|
25
|
+
const getNextTemplateName = (prefix = 'template') => {
|
|
26
|
+
testContext.templateCounter++;
|
|
27
|
+
return `${prefix}_${testContext.testId}_${testContext.templateCounter}`;
|
|
28
|
+
};
|
|
29
|
+
const createTemplate = async (name, content, dir) => {
|
|
30
|
+
const config = await getConfig(testContext.testDir);
|
|
31
|
+
const fullPath = dir
|
|
32
|
+
? path.join(testContext.testDir, config.templateDir, dir, name)
|
|
33
|
+
: path.join(testContext.testDir, config.templateDir, name);
|
|
34
|
+
try {
|
|
35
|
+
await fs.mkdir(path.dirname(fullPath), { recursive: true });
|
|
36
|
+
await fs.writeFile(fullPath, content);
|
|
37
|
+
return fullPath;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('Error creating template:', error);
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
it('successfully registers a valid template ๐ฏ', async () => {
|
|
45
|
+
const templateName = getNextTemplateName('success');
|
|
46
|
+
const templateContent = `
|
|
47
|
+
CREATE FUNCTION test()
|
|
48
|
+
RETURNS void AS $$
|
|
49
|
+
BEGIN
|
|
50
|
+
NULL;
|
|
51
|
+
END;
|
|
52
|
+
$$ LANGUAGE plpgsql;
|
|
53
|
+
`;
|
|
54
|
+
const templatePath = await createTemplate(`${templateName}.sql`, templateContent);
|
|
55
|
+
const config = await getConfig(testContext.testDir);
|
|
56
|
+
await registerTemplate(templatePath, testContext.testDir);
|
|
57
|
+
const buildLog = JSON.parse(await fs.readFile(path.join(testContext.testDir, config.buildLog), 'utf-8'));
|
|
58
|
+
const relPath = path.relative(testContext.testDir, templatePath);
|
|
59
|
+
expect(buildLog.templates[relPath]).toBeDefined();
|
|
60
|
+
expect(buildLog.templates[relPath].lastBuildHash).toBe(await calculateMD5(templateContent));
|
|
61
|
+
expect(buildLog.templates[relPath].lastBuildDate).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
|
|
62
|
+
expect(buildLog.templates[relPath].lastMigrationFile).toBe('');
|
|
63
|
+
});
|
|
64
|
+
it('prevents registering templates outside templateDir ๐', async () => {
|
|
65
|
+
// Try to register a template from outside the configured template directory
|
|
66
|
+
const outsideContent = 'SELECT 1;';
|
|
67
|
+
const outsidePath = path.join(testContext.testDir, 'outside.sql');
|
|
68
|
+
await fs.writeFile(outsidePath, outsideContent);
|
|
69
|
+
await expect(registerTemplate(outsidePath, testContext.testDir)).rejects.toThrow(/Template in wrong directly/);
|
|
70
|
+
// Also try with a path that looks like it's in templateDir but isn't
|
|
71
|
+
const sneakyPath = path.join(testContext.testDir, 'fake-test-templates', 'sneaky.sql');
|
|
72
|
+
await fs.mkdir(path.dirname(sneakyPath), { recursive: true });
|
|
73
|
+
await fs.writeFile(sneakyPath, outsideContent);
|
|
74
|
+
await expect(registerTemplate(sneakyPath, testContext.testDir)).rejects.toThrow(/Template in wrong directly/);
|
|
75
|
+
});
|
|
76
|
+
it('handles templates in nested directories ๐', async () => {
|
|
77
|
+
const templateName = getNextTemplateName('nested');
|
|
78
|
+
const templatePath = await createTemplate(`${templateName}.sql`, 'SELECT 1;', 'deep/nested/dir');
|
|
79
|
+
await registerTemplate(templatePath, testContext.testDir);
|
|
80
|
+
const config = await getConfig(testContext.testDir);
|
|
81
|
+
const buildLog = JSON.parse(await fs.readFile(path.join(testContext.testDir, config.buildLog), 'utf-8'));
|
|
82
|
+
const relPath = path.relative(testContext.testDir, templatePath);
|
|
83
|
+
expect(buildLog.templates[relPath]).toBeDefined();
|
|
84
|
+
});
|
|
85
|
+
it('updates existing template registration ๐', async () => {
|
|
86
|
+
const templateName = getNextTemplateName('update');
|
|
87
|
+
const templatePath = await createTemplate(`${templateName}.sql`, 'SELECT 1;');
|
|
88
|
+
const config = await getConfig(testContext.testDir);
|
|
89
|
+
await registerTemplate(templatePath, testContext.testDir);
|
|
90
|
+
const initialBuildLog = JSON.parse(await fs.readFile(path.join(testContext.testDir, config.buildLog), 'utf-8'));
|
|
91
|
+
const relPath = path.relative(testContext.testDir, templatePath);
|
|
92
|
+
const initialHash = initialBuildLog.templates[relPath].lastBuildHash;
|
|
93
|
+
const newContent = 'SELECT 2;';
|
|
94
|
+
await fs.writeFile(templatePath, newContent);
|
|
95
|
+
await registerTemplate(templatePath, testContext.testDir);
|
|
96
|
+
const updatedBuildLog = JSON.parse(await fs.readFile(path.join(testContext.testDir, config.buildLog), 'utf-8'));
|
|
97
|
+
expect(updatedBuildLog.templates[relPath].lastBuildHash).toBe(await calculateMD5(newContent));
|
|
98
|
+
expect(updatedBuildLog.templates[relPath].lastBuildHash).not.toBe(initialHash);
|
|
99
|
+
});
|
|
100
|
+
it('handles empty template files ๐', async () => {
|
|
101
|
+
const templateName = getNextTemplateName('empty');
|
|
102
|
+
const templatePath = await createTemplate(`${templateName}.sql`, '');
|
|
103
|
+
await registerTemplate(templatePath, testContext.testDir);
|
|
104
|
+
const config = await getConfig(testContext.testDir);
|
|
105
|
+
const buildLog = JSON.parse(await fs.readFile(path.join(testContext.testDir, config.buildLog), 'utf-8'));
|
|
106
|
+
const relPath = path.relative(testContext.testDir, templatePath);
|
|
107
|
+
expect(buildLog.templates[relPath].lastBuildHash).toBe(await calculateMD5(''));
|
|
108
|
+
});
|
|
109
|
+
it('handles large template files efficiently ๐', async () => {
|
|
110
|
+
const templateName = getNextTemplateName('large');
|
|
111
|
+
const largeContent = `
|
|
112
|
+
SELECT ${`'x'`.repeat(100 * 1024)};
|
|
113
|
+
`;
|
|
114
|
+
const templatePath = await createTemplate(`${templateName}.sql`, largeContent);
|
|
115
|
+
const startTime = Date.now();
|
|
116
|
+
await registerTemplate(templatePath, testContext.testDir);
|
|
117
|
+
const duration = Date.now() - startTime;
|
|
118
|
+
expect(duration).toBeLessThan(1000);
|
|
119
|
+
const config = await getConfig(testContext.testDir);
|
|
120
|
+
const buildLog = JSON.parse(await fs.readFile(path.join(testContext.testDir, config.buildLog), 'utf-8'));
|
|
121
|
+
const relPath = path.relative(testContext.testDir, templatePath);
|
|
122
|
+
expect(buildLog.templates[relPath].lastBuildHash).toBe(await calculateMD5(largeContent));
|
|
123
|
+
});
|
|
124
|
+
it('gracefully handles non-existent templates ๐ซ', async () => {
|
|
125
|
+
const config = await getConfig(testContext.testDir);
|
|
126
|
+
const nonExistentPath = path.join(testContext.testDir, config.templateDir, 'nope.sql');
|
|
127
|
+
await expect(registerTemplate(nonExistentPath, testContext.testDir)).rejects.toThrow(/Template.*not found/);
|
|
128
|
+
});
|
|
129
|
+
it('fails gracefully with filesystem errors ๐ฅ', async () => {
|
|
130
|
+
const templateName = getNextTemplateName('permission');
|
|
131
|
+
const templatePath = await createTemplate(`${templateName}.sql`, 'SELECT 1;', 'locked');
|
|
132
|
+
const templateDir = path.dirname(templatePath);
|
|
133
|
+
try {
|
|
134
|
+
await fs.chmod(templateDir, 0o000);
|
|
135
|
+
await expect(registerTemplate(templatePath, testContext.testDir)).rejects.toThrow();
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
await fs.chmod(templateDir, 0o755);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=registerTemplate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerTemplate.test.js","sourceRoot":"","sources":["../../src/utils/registerTemplate.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t1mmen/srtd",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Supabase Repeatable Template Definitions (srtd): ๐ช Live-reloading SQL templates for Supabase DX. Make your database changes reviewable and migrations maintainable! ๐",
|
|
6
6
|
"bin": {
|