@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.
Files changed (39) hide show
  1. package/README.md +79 -31
  2. package/dist/__tests__/helpers.d.ts +27 -0
  3. package/dist/__tests__/helpers.js +55 -0
  4. package/dist/__tests__/helpers.js.map +1 -0
  5. package/dist/__tests__/promote.test.d.ts +1 -0
  6. package/dist/__tests__/promote.test.js +9 -0
  7. package/dist/__tests__/promote.test.js.map +1 -0
  8. package/dist/commands/apply.js +4 -5
  9. package/dist/commands/apply.js.map +1 -1
  10. package/dist/commands/build.js +2 -6
  11. package/dist/commands/build.js.map +1 -1
  12. package/dist/commands/index.js +6 -1
  13. package/dist/commands/index.js.map +1 -1
  14. package/dist/commands/init.js +7 -2
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/promote.d.ts +8 -0
  17. package/dist/commands/promote.js +159 -0
  18. package/dist/commands/promote.js.map +1 -0
  19. package/dist/commands/register.js +20 -7
  20. package/dist/commands/register.js.map +1 -1
  21. package/dist/hooks/useTemplateManager.d.ts +1 -1
  22. package/dist/hooks/useTemplateManager.js +4 -2
  23. package/dist/hooks/useTemplateManager.js.map +1 -1
  24. package/dist/hooks/useTemplateProcessor.d.ts +1 -0
  25. package/dist/hooks/useTemplateProcessor.js +84 -41
  26. package/dist/hooks/useTemplateProcessor.js.map +1 -1
  27. package/dist/hooks/useTemplateState.js +2 -1
  28. package/dist/hooks/useTemplateState.js.map +1 -1
  29. package/dist/lib/templateManager.test.js +3 -0
  30. package/dist/lib/templateManager.test.js.map +1 -1
  31. package/dist/utils/findProjectRoot.d.ts +1 -0
  32. package/dist/utils/findProjectRoot.js +25 -0
  33. package/dist/utils/findProjectRoot.js.map +1 -0
  34. package/dist/utils/registerTemplate.js +7 -3
  35. package/dist/utils/registerTemplate.js.map +1 -1
  36. package/dist/utils/registerTemplate.test.d.ts +1 -0
  37. package/dist/utils/registerTemplate.test.js +142 -0
  38. package/dist/utils/registerTemplate.test.js.map +1 -0
  39. 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
- ![NPM Version](https://img.shields.io/npm/v/%40t1mmen%2Fsrtd)
7
+ [![NPM Version](https://img.shields.io/npm/v/%40t1mmen%2Fsrtd)](https://www.npmjs.com/package/@t1mmen/srtd)
8
+ [![Downloads](https://img.shields.io/npm/dt/%40t1mmen%2Fsrtd)](https://www.npmjs.com/package/@t1mmen/srtd)
8
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
10
  [![CI/CD](https://github.com/t1mmen/srtd/actions/workflows/ci.yml/badge.svg)](https://github.com/t1mmen/srtd/actions/workflows/ci.yml)
10
11
  [![codecov](https://codecov.io/gh/t1mmen/srtd/graph/badge.svg?token=CIMAZ55KCJ)](https://codecov.io/gh/t1mmen/srtd)
11
12
 
12
13
 
13
- [![screenshot of srtd](./readme-screenshot.png)](./readme-screenshot.png)
14
+ [![video demo](./readme-demo.gif)](./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
+ [![screenshot of srtd](./readme-screenshot.png)](./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
- - **Single Source of Truth**: Templates are the source of all (non-mutable) database objects, improving code-review clarity
35
- - **Just SQL**: Templates build as standard [Supabase](https://supabase.com) migrations when you're ready to deploy
36
- - **Developer Friendly**: Interactive CLI with visual feedback for all operations
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
- ## Requirements
45
+ ## Quick Start ๐Ÿš€
41
46
 
42
- - Node.js v20.x or higher
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
- ## Quick Start ๐Ÿš€
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
- CREATE OR REPLACE FUNCTION my_function()
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 # Creates timestamped migration file
91
- supabase migration up # Apply using Supabase CLI
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
- CREATE OR REPLACE FUNCTION notify_changes()
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 'email';
177
+ + ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'whatsapp';
169
178
  END $$;
170
179
  ```
171
180
 
172
- ### Not Recommended For
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
- - ๐Ÿ‘€ `srtd watch` - Watch and auto-apply changes
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 during initialization:
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
- Import existing database objects:
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 # Watch mode
270
- npm test # Run tests
271
- npm start # Build, link, run
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 # Type checking
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"}
@@ -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({ force: options.force, apply: true });
19
- React.useEffect(() => {
20
- if (!isProcessing) {
21
- exit();
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,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7F,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,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"}
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"}
@@ -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
- React.useEffect(() => {
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,aAAa,EAAE,IAAI;QACnB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,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"}
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"}
@@ -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;QACxD,oBAAC,SAAS,OAAG,CACT,CACP,CAAC;AACJ,CAAC"}
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"}
@@ -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
- process.exit(1);
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 {};