@t1mmen/srtd 0.4.4 โ 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 +79 -31
- 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/__tests__/promote.test.d.ts +1 -0
- package/dist/__tests__/promote.test.js +9 -0
- package/dist/__tests__/promote.test.js.map +1 -0
- package/dist/commands/apply.js +4 -5
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/build.js +2 -6
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/index.js +6 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.js +7 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/promote.d.ts +8 -0
- package/dist/commands/promote.js +159 -0
- package/dist/commands/promote.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.d.ts +1 -0
- package/dist/hooks/useTemplateProcessor.js +84 -41
- 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/lib/templateManager.test.js +3 -0
- package/dist/lib/templateManager.test.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 +4 -2
package/README.md
CHANGED
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
> Live-reloading SQL templates for [Supabase](https://supabase.com) projects. DX supercharged! ๐
|
|
6
6
|
|
|
7
|
-

|
|
7
|
+
[](https://www.npmjs.com/package/@t1mmen/srtd)
|
|
8
|
+
[](https://www.npmjs.com/package/@t1mmen/srtd)
|
|
8
9
|
[](https://opensource.org/licenses/MIT)
|
|
9
10
|
[](https://github.com/t1mmen/srtd/actions/workflows/ci.yml)
|
|
10
11
|
[](https://codecov.io/gh/t1mmen/srtd)
|
|
11
12
|
|
|
12
13
|
|
|
13
|
-
[](./readme-demo.gif)
|
|
15
|
+
|
|
14
16
|
|
|
15
17
|
`srtd` enhances the [Supabase](https://supabase.com) DX by adding live-reloading SQL templates into local db. The single-source-of-truth template โก๏ธ migrations system brings sanity to code reviews, making `git blame` useful.
|
|
16
18
|
|
|
@@ -28,22 +30,24 @@ I spent [nearly two years looking](https://news.ycombinator.com/item?id=37755076
|
|
|
28
30
|
|
|
29
31
|
Say hello to `srtd`.
|
|
30
32
|
|
|
33
|
+
[](./readme-screenshot.png)
|
|
34
|
+
|
|
31
35
|
## Key Features โจ
|
|
32
36
|
|
|
33
37
|
- **Live Reload**: Changes to your SQL templates instantly update your local database
|
|
34
|
-
- **
|
|
35
|
-
- **Just SQL**: Templates build
|
|
36
|
-
- **
|
|
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.
|
|
37
42
|
|
|
38
43
|
Built specifically for projects using the standard [Supabase](https://supabase.com) stack (but probably works alright for other Postgres-based projects, too).
|
|
39
44
|
|
|
40
|
-
##
|
|
45
|
+
## Quick Start ๐
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
- [Supabase](https://supabase.com) CLI installed and project initialized (with `/supabase` directory)
|
|
44
|
-
- Local Postgres instance running (typically via `supabase start`)
|
|
47
|
+
### Requirements
|
|
45
48
|
|
|
46
|
-
|
|
49
|
+
- Node.js v20.x or higher
|
|
50
|
+
- [Supabase](https://supabase.com) project initialized (in `/supabase`).
|
|
47
51
|
|
|
48
52
|
### Installation
|
|
49
53
|
|
|
@@ -62,7 +66,7 @@ npx @t1mmen/srtd
|
|
|
62
66
|
|
|
63
67
|
```bash
|
|
64
68
|
cd your-supabase-project
|
|
65
|
-
srtd init
|
|
69
|
+
npx @t1mmen/srtd init # Creates srtd.config.json, not required
|
|
66
70
|
```
|
|
67
71
|
|
|
68
72
|
### Create Your First Template
|
|
@@ -70,7 +74,8 @@ srtd init
|
|
|
70
74
|
Create `supabase/migrations-templates/my_function.sql`:
|
|
71
75
|
|
|
72
76
|
```sql
|
|
73
|
-
|
|
77
|
+
DROP FUNCTION IF EXISTS public.my_function; -- Makes it easier to change args later
|
|
78
|
+
CREATE FUNCTION my_function()
|
|
74
79
|
RETURNS void AS $$
|
|
75
80
|
BEGIN
|
|
76
81
|
-- Your function logic here
|
|
@@ -82,15 +87,18 @@ $$ LANGUAGE plpgsql;
|
|
|
82
87
|
|
|
83
88
|
1. Start watch mode:
|
|
84
89
|
```bash
|
|
85
|
-
srtd watch # Changes auto-apply to local database
|
|
90
|
+
npx @t1mmen/srtd watch # Changes auto-apply to local database
|
|
86
91
|
```
|
|
87
92
|
|
|
88
93
|
2. When ready to deploy:
|
|
89
94
|
```bash
|
|
90
|
-
srtd build
|
|
91
|
-
supabase migration up
|
|
95
|
+
npx @t1mmen/srtd build # Creates timestamped migration file
|
|
96
|
+
supabase migration up # Apply using Supabase CLI
|
|
92
97
|
```
|
|
93
98
|
|
|
99
|
+
> [!TIP]
|
|
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
|
+
|
|
94
102
|
|
|
95
103
|
## The Power of Templates ๐ช
|
|
96
104
|
|
|
@@ -102,7 +110,8 @@ Without templates, the smallest change to a function would show up as a complete
|
|
|
102
110
|
โ
Database functions:
|
|
103
111
|
```diff
|
|
104
112
|
-- Event notifications
|
|
105
|
-
|
|
113
|
+
DROP FUNCTION IF EXISTS notify_changes;
|
|
114
|
+
CREATE FUNCTION notify_changes()
|
|
106
115
|
RETURNS trigger AS $$
|
|
107
116
|
BEGIN
|
|
108
117
|
PERFORM pg_notify(
|
|
@@ -165,12 +174,31 @@ Without templates, the smallest change to a function would show up as a complete
|
|
|
165
174
|
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'push';
|
|
166
175
|
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'pusher';
|
|
167
176
|
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'webhook';
|
|
168
|
-
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS '
|
|
177
|
+
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'whatsapp';
|
|
169
178
|
END $$;
|
|
170
179
|
```
|
|
171
180
|
|
|
172
|
-
|
|
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
|
+
```
|
|
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.
|
|
173
200
|
|
|
201
|
+
### Not Recommended Fo
|
|
174
202
|
* โ Table structures
|
|
175
203
|
* โ Indexes
|
|
176
204
|
* โ Data modifications
|
|
@@ -183,14 +211,13 @@ Use regular [Supabase](https://supabase.com) migrations for these cases.
|
|
|
183
211
|
|
|
184
212
|
### Interactive Mode
|
|
185
213
|
|
|
186
|
-
Running `srtd` without arguments opens an interactive menu:
|
|
187
|
-
|
|
188
|
-
### CLI Mode
|
|
214
|
+
Running `npx @t1mmen/srtd` without arguments opens an interactive menu. All commands can also be run directly:
|
|
189
215
|
|
|
216
|
+
- ๐ `srtd watch` - Watch and auto-apply changes
|
|
190
217
|
- ๐๏ธ `srtd build [--force]` - Generate migrations from templates
|
|
191
218
|
- โถ๏ธ `srtd apply [--force]` - Apply templates directly to local database
|
|
192
|
-
- โ๏ธ `srtd register [file.sql]` - Mark templates as already built
|
|
193
|
-
-
|
|
219
|
+
- โ๏ธ `srtd register [file.sql...]` - Mark templates as already built
|
|
220
|
+
- ๐ `srtd promote - [file.sql ...]` - Promote WIP template to buildable templates
|
|
194
221
|
- ๐งน `srtd clean` - Remove all logs and reset config
|
|
195
222
|
|
|
196
223
|
> [!IMPORTANT]
|
|
@@ -198,7 +225,7 @@ Running `srtd` without arguments opens an interactive menu:
|
|
|
198
225
|
|
|
199
226
|
## Configuration ๐
|
|
200
227
|
|
|
201
|
-
`srtd.config.json` created
|
|
228
|
+
`srtd.config.json` can be created with `init` command. It is not necessary, if the defaults suit your needs.
|
|
202
229
|
|
|
203
230
|
```jsonc
|
|
204
231
|
{
|
|
@@ -238,6 +265,11 @@ Add `.wip.sql` extension to prevent migration generation:
|
|
|
238
265
|
my_function.wip.sql # Only applied locally, never built
|
|
239
266
|
```
|
|
240
267
|
|
|
268
|
+
Make a WIP template buildable as migration by renaming it, or using the `promote` command:
|
|
269
|
+
```bash
|
|
270
|
+
npx @t1mmen/srtd promote my_function.wip.sql
|
|
271
|
+
```
|
|
272
|
+
|
|
241
273
|
### Template State Management
|
|
242
274
|
|
|
243
275
|
Two state tracking files:
|
|
@@ -246,13 +278,14 @@ Two state tracking files:
|
|
|
246
278
|
|
|
247
279
|
### Register Existing Objects
|
|
248
280
|
|
|
249
|
-
|
|
281
|
+
Registering a template is useful when you're creating templates for what is already in your database. This avoids generating migrations on `build` (until they're changed)
|
|
282
|
+
|
|
250
283
|
```bash
|
|
251
284
|
# Register specific template
|
|
252
|
-
srtd register my_function.sql
|
|
285
|
+
npx @t1mmen/srtd register my_function.sql another_fn.sql
|
|
253
286
|
|
|
254
287
|
# Interactive multi-select UI
|
|
255
|
-
srtd register
|
|
288
|
+
npx @t1mmen/srtd register
|
|
256
289
|
```
|
|
257
290
|
|
|
258
291
|
## Development ๐ ๏ธ
|
|
@@ -266,13 +299,15 @@ cd srtd
|
|
|
266
299
|
npm install
|
|
267
300
|
|
|
268
301
|
# Development
|
|
269
|
-
npm run dev
|
|
270
|
-
npm test
|
|
271
|
-
npm start
|
|
302
|
+
npm run dev # Watch mode
|
|
303
|
+
npm test # Run tests
|
|
304
|
+
npm start # Run CLI
|
|
305
|
+
npm start:link # Build, npm link, and run CLI
|
|
272
306
|
|
|
273
307
|
# Quality Checks
|
|
274
|
-
npm run typecheck
|
|
308
|
+
npm run typecheck # Type checking
|
|
275
309
|
npm run lint # Lint and fix
|
|
310
|
+
npm run format # Format code
|
|
276
311
|
npm run test:coverage # Test coverage
|
|
277
312
|
```
|
|
278
313
|
|
|
@@ -294,6 +329,19 @@ While feature-complete for our needs, we welcome:
|
|
|
294
329
|
|
|
295
330
|
Note: New features are evaluated based on alignment with project scope.
|
|
296
331
|
|
|
332
|
+
## Built With ๐ ๏ธ
|
|
333
|
+
|
|
334
|
+
### Terminal UI
|
|
335
|
+
- [Ink](https://github.com/vadimdemedes/ink) - React for CLI interfaces
|
|
336
|
+
- [Pastel](https://github.com/vadimdemedes/pastel) - Next-like framework for Ink
|
|
337
|
+
- [Figures](https://github.com/sindresorhus/figures) - Unicode symbols
|
|
338
|
+
- [Chokidar](https://github.com/paulmillr/chokidar) - File watcher
|
|
339
|
+
- [update-notifier](https://github.com/sindresorhus/update-notifier) - Version checks
|
|
340
|
+
- [Zod](https://zod.dev/) - Schema validation
|
|
341
|
+
- [Conf](https://github.com/sindresorhus/conf) - Config management
|
|
342
|
+
- [vhs](https://github.com/charmbracelet/vhs) - Video recording
|
|
343
|
+
|
|
344
|
+
|
|
297
345
|
## License
|
|
298
346
|
|
|
299
347
|
MIT License - see [LICENSE](LICENSE) file.
|
|
@@ -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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { render } from 'ink-testing-library';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { expect, it } from 'vitest';
|
|
4
|
+
import Promote from '../commands/promote.js';
|
|
5
|
+
it('renders promote command', () => {
|
|
6
|
+
const { lastFrame } = render(React.createElement(Promote, { args: undefined }));
|
|
7
|
+
expect(lastFrame()).toContain('Promote WIP template');
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=promote.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.test.js","sourceRoot":"","sources":["../../src/__tests__/promote.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAE7C,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACjC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,OAAO,IAAC,IAAI,EAAE,SAAS,GAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC"}
|
package/dist/commands/apply.js
CHANGED
|
@@ -15,11 +15,10 @@ export const options = zod.object({
|
|
|
15
15
|
});
|
|
16
16
|
export default function Apply({ options }) {
|
|
17
17
|
const { exit } = useApp();
|
|
18
|
-
const { result, isProcessing } = useTemplateProcessor({
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
18
|
+
const { result, isProcessing } = useTemplateProcessor({
|
|
19
|
+
force: options.force,
|
|
20
|
+
apply: true,
|
|
21
|
+
onComplete: () => exit(), // Move exit here
|
|
23
22
|
});
|
|
24
23
|
return (React.createElement(Box, { flexDirection: "column", gap: 1 },
|
|
25
24
|
React.createElement(Branding, { subtitle: "\u25B6\uFE0F Apply migrations" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.tsx"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAC3B,MAAM,CAAC;QACL,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,GAAG;KACX,CAAC,CACH;CACF,CAAC,CAAC;AAMH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAAE,OAAO,EAAS;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.tsx"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAC3B,MAAM,CAAC;QACL,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,GAAG;KACX,CAAC,CACH;CACF,CAAC,CAAC;AAMH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAAE,OAAO,EAAS;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAAC;QACpD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,iBAAiB;KAC5C,CAAC,CAAC;IAEH,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC;QAChC,oBAAC,QAAQ,IAAC,QAAQ,EAAC,gCAAsB,GAAG;QAC3C,YAAY,CAAC,CAAC,CAAC,CACd,oBAAC,OAAO,IAAC,KAAK,EAAC,uBAAuB,GAAG,CAC1C,CAAC,CAAC,CAAC,CACF,oBAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAG,CAChD,CACG,CACP,CAAC;AACJ,CAAC"}
|
package/dist/commands/build.js
CHANGED
|
@@ -24,13 +24,9 @@ export default function Build({ options }) {
|
|
|
24
24
|
const { exit } = useApp();
|
|
25
25
|
const { result, isProcessing } = useTemplateProcessor({
|
|
26
26
|
force: options.force,
|
|
27
|
-
generateFiles: true,
|
|
28
27
|
apply: options.apply,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (!isProcessing) {
|
|
32
|
-
exit();
|
|
33
|
-
}
|
|
28
|
+
generateFiles: true,
|
|
29
|
+
onComplete: () => exit(), // Move exit here
|
|
34
30
|
});
|
|
35
31
|
const forced = options.force ? '(forced)' : '';
|
|
36
32
|
return (React.createElement(Box, { flexDirection: "column", gap: 1 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAC3B,MAAM,CAAC;QACL,WAAW,EAAE,0DAA0D;QACvE,KAAK,EAAE,GAAG;KACX,CAAC,CACH;IACD,KAAK,EAAE,GAAG;SACP,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,MAAM,CAAC;QACL,WAAW,EAAE,2BAA2B;QACxC,KAAK,EAAE,GAAG;KACX,CAAC,CACH;CACJ,CAAC,CAAC;AAMH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAAE,OAAO,EAAS;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAAC;QACpD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAC3B,MAAM,CAAC;QACL,WAAW,EAAE,0DAA0D;QACvE,KAAK,EAAE,GAAG;KACX,CAAC,CACH;IACD,KAAK,EAAE,GAAG;SACP,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,MAAM,CAAC;QACL,WAAW,EAAE,2BAA2B;QACxC,KAAK,EAAE,GAAG;KACX,CAAC,CACH;CACJ,CAAC,CAAC;AAMH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAAE,OAAO,EAAS;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAAC;QACpD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,iBAAiB;KAC5C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC;QAChC,oBAAC,QAAQ,IAAC,QAAQ,EAAE,yBAAyB,MAAM,EAAE,GAAI;QACxD,YAAY,CAAC,CAAC,CAAC,CACd,oBAAC,OAAO,IAAC,KAAK,EAAE,uBAAuB,GAAI,CAC5C,CAAC,CAAC,CAAC,CACF,oBAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,QAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,GAAI,CAC3E,CACG,CACP,CAAC;AACJ,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import Quittable from '../components/Quittable.js';
|
|
|
7
7
|
import Apply from './apply.js';
|
|
8
8
|
import Build from './build.js';
|
|
9
9
|
import Clear from './clear.js';
|
|
10
|
+
import Promote from './promote.js';
|
|
10
11
|
import Register from './register.js';
|
|
11
12
|
import Watch from './watch.js';
|
|
12
13
|
export default function UI() {
|
|
@@ -29,6 +30,9 @@ export default function UI() {
|
|
|
29
30
|
if (selectedCommand === 'clear') {
|
|
30
31
|
return React.createElement(Clear, null);
|
|
31
32
|
}
|
|
33
|
+
if (selectedCommand === 'promote') {
|
|
34
|
+
return React.createElement(Promote, null);
|
|
35
|
+
}
|
|
32
36
|
const menuItems = [
|
|
33
37
|
{
|
|
34
38
|
label: '๐ watch - Watch for changes, apply directly to db',
|
|
@@ -37,11 +41,12 @@ export default function UI() {
|
|
|
37
41
|
{ label: 'โถ๏ธ apply - Apply templates directly to db', value: 'apply' },
|
|
38
42
|
{ label: '๐๏ธ build - Build templates as Supabase migrations', value: 'build' },
|
|
39
43
|
{ label: 'โ๏ธ register - Register templates as already built', value: 'register' },
|
|
44
|
+
{ label: '๐ promote - Promote WIP template to buildable templates', value: 'promote' },
|
|
40
45
|
{ label: '๐งน maintenance - Clear build logs and reset config', value: 'clear' },
|
|
41
46
|
];
|
|
42
47
|
return (React.createElement(Box, { flexDirection: "column" },
|
|
43
48
|
React.createElement(Branding, null),
|
|
44
|
-
React.createElement(Select, { options: menuItems, onChange: handleOnChange }),
|
|
49
|
+
React.createElement(Select, { visibleOptionCount: 10, options: menuItems, onChange: handleOnChange }),
|
|
45
50
|
React.createElement(Quittable, null)));
|
|
46
51
|
}
|
|
47
52
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,CAAC,OAAO,UAAU,EAAE;IACxB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAElF,MAAM,cAAc,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC7C,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,oBAAC,QAAQ,IAAC,IAAI,EAAE,SAAS,GAAI,CAAC;IACvC,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAI,CAAC;IAC9C,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAI,CAAC;IAC9C,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,OAAG,CAAC;IACnB,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,OAAG,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG;QAChB;YACE,KAAK,EAAE,qDAAqD;YAC5D,KAAK,EAAE,OAAO;SACf;QACD,EAAE,KAAK,EAAE,4CAA4C,EAAE,KAAK,EAAE,OAAO,EAAE;QACvE,EAAE,KAAK,EAAE,qDAAqD,EAAE,KAAK,EAAE,OAAO,EAAE;QAChF,EAAE,KAAK,EAAE,oDAAoD,EAAE,KAAK,EAAE,UAAU,EAAE;QAClF,EAAE,KAAK,EAAE,qDAAqD,EAAE,KAAK,EAAE,OAAO,EAAE;KACjF,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,QAAQ,OAAG;QACZ,oBAAC,MAAM,IAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAI;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,CAAC,OAAO,UAAU,EAAE;IACxB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAElF,MAAM,cAAc,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC7C,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,oBAAC,QAAQ,IAAC,IAAI,EAAE,SAAS,GAAI,CAAC;IACvC,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAI,CAAC;IAC9C,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAI,CAAC;IAC9C,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,OAAG,CAAC;IACnB,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,oBAAC,KAAK,OAAG,CAAC;IACnB,CAAC;IAED,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,oBAAC,OAAO,OAAG,CAAC;IACrB,CAAC;IAED,MAAM,SAAS,GAAG;QAChB;YACE,KAAK,EAAE,qDAAqD;YAC5D,KAAK,EAAE,OAAO;SACf;QACD,EAAE,KAAK,EAAE,4CAA4C,EAAE,KAAK,EAAE,OAAO,EAAE;QACvE,EAAE,KAAK,EAAE,qDAAqD,EAAE,KAAK,EAAE,OAAO,EAAE;QAChF,EAAE,KAAK,EAAE,oDAAoD,EAAE,KAAK,EAAE,UAAU,EAAE;QAClF,EAAE,KAAK,EAAE,2DAA2D,EAAE,KAAK,EAAE,SAAS,EAAE;QACxF,EAAE,KAAK,EAAE,qDAAqD,EAAE,KAAK,EAAE,OAAO,EAAE;KACjF,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,QAAQ,OAAG;QACZ,oBAAC,MAAM,IAAC,kBAAkB,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAI;QAChF,oBAAC,SAAS,OAAG,CACT,CACP,CAAC;AACJ,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
|
+
import { useApp } from 'ink';
|
|
4
5
|
import React from 'react';
|
|
5
6
|
import { CONFIG_FILE } from '../constants.js';
|
|
6
7
|
import { getConfig, saveConfig } from '../utils/config.js';
|
|
@@ -9,6 +10,7 @@ import { ensureDirectories } from '../utils/ensureDirectories.js';
|
|
|
9
10
|
import { fileExists } from '../utils/fileExists.js';
|
|
10
11
|
import { logger } from '../utils/logger.js';
|
|
11
12
|
export default function Init() {
|
|
13
|
+
const { exit } = useApp();
|
|
12
14
|
React.useEffect(() => {
|
|
13
15
|
async function doInit() {
|
|
14
16
|
console.log(`${chalk.green('\nโจ Initializing srtd\n')}`);
|
|
@@ -67,14 +69,17 @@ export default function Init() {
|
|
|
67
69
|
else {
|
|
68
70
|
logger.skip(`.gitignore already contains ${ignoreEntry}`);
|
|
69
71
|
}
|
|
72
|
+
exit();
|
|
70
73
|
}
|
|
71
74
|
catch (error) {
|
|
72
75
|
logger.error(`Failed to initialize: ${JSON.stringify(error)}`);
|
|
73
|
-
|
|
76
|
+
if (error instanceof Error) {
|
|
77
|
+
exit(error);
|
|
78
|
+
}
|
|
74
79
|
}
|
|
75
80
|
}
|
|
76
81
|
doInit();
|
|
77
|
-
}, []);
|
|
82
|
+
}, [exit]);
|
|
78
83
|
return null;
|
|
79
84
|
}
|
|
80
85
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import zod from 'zod';
|
|
3
|
+
export declare const args: zod.ZodOptional<zod.ZodArray<zod.ZodString, "many">>;
|
|
4
|
+
interface Props {
|
|
5
|
+
args?: zod.infer<typeof args>;
|
|
6
|
+
}
|
|
7
|
+
export default function Promote({ args: templateArgs }: Props): React.JSX.Element;
|
|
8
|
+
export {};
|