@t1mmen/srtd 0.4.0 → 0.4.2

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 (53) hide show
  1. package/README.md +24 -22
  2. package/dist/__tests__/apply.test.d.ts +1 -0
  3. package/dist/__tests__/apply.test.js +69 -0
  4. package/dist/__tests__/apply.test.js.map +1 -0
  5. package/dist/__tests__/build.test.d.ts +1 -0
  6. package/dist/__tests__/build.test.js +67 -0
  7. package/dist/__tests__/build.test.js.map +1 -0
  8. package/dist/__tests__/watch.test.js +9 -3
  9. package/dist/__tests__/watch.test.js.map +1 -1
  10. package/dist/commands/_app.js +11 -17
  11. package/dist/commands/_app.js.map +1 -1
  12. package/dist/commands/apply.d.ts +2 -1
  13. package/dist/commands/apply.js +16 -19
  14. package/dist/commands/apply.js.map +1 -1
  15. package/dist/commands/build.d.ts +5 -1
  16. package/dist/commands/build.js +25 -9
  17. package/dist/commands/build.js.map +1 -1
  18. package/dist/commands/index.js +2 -1
  19. package/dist/commands/index.js.map +1 -1
  20. package/dist/commands/register.js +6 -5
  21. package/dist/commands/register.js.map +1 -1
  22. package/dist/commands/watch.js +35 -23
  23. package/dist/commands/watch.js.map +1 -1
  24. package/dist/components/Branding.js +7 -7
  25. package/dist/components/Branding.js.map +1 -1
  26. package/dist/components/Debug.d.ts +2 -0
  27. package/dist/components/Debug.js +160 -0
  28. package/dist/components/Debug.js.map +1 -0
  29. package/dist/components/ProcessingResults.d.ts +9 -0
  30. package/dist/components/ProcessingResults.js +32 -0
  31. package/dist/components/ProcessingResults.js.map +1 -0
  32. package/dist/components/Quittable.js +1 -1
  33. package/dist/components/customTheme.d.ts +10 -0
  34. package/dist/components/customTheme.js +66 -0
  35. package/dist/components/customTheme.js.map +1 -0
  36. package/dist/hooks/useDatabaseConnection.js +21 -32
  37. package/dist/hooks/useDatabaseConnection.js.map +1 -1
  38. package/dist/hooks/useTemplateProcessor.d.ts +11 -0
  39. package/dist/hooks/useTemplateProcessor.js +71 -0
  40. package/dist/hooks/useTemplateProcessor.js.map +1 -0
  41. package/dist/lib/templateManager.d.ts +4 -0
  42. package/dist/lib/templateManager.js +29 -6
  43. package/dist/lib/templateManager.js.map +1 -1
  44. package/dist/lib/templateManager.test.js +54 -31
  45. package/dist/lib/templateManager.test.js.map +1 -1
  46. package/dist/types.d.ts +3 -0
  47. package/dist/utils/databaseConnection.d.ts +5 -0
  48. package/dist/utils/databaseConnection.js +36 -21
  49. package/dist/utils/databaseConnection.js.map +1 -1
  50. package/dist/utils/store.d.ts +5 -0
  51. package/dist/utils/store.js +10 -0
  52. package/dist/utils/store.js.map +1 -0
  53. package/package.json +2 -1
package/README.md CHANGED
@@ -15,16 +15,18 @@
15
15
  `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
16
 
17
17
 
18
- **Read the introductory blog post: [Introducing `srtd`: Live-Reloading SQL Templates for Supabase](https://timm.stokke.me/blog/srtd-live-reloading-and-sql-templates-for-supabase)**
18
+ 📖 Blog: [Introducing `srtd`: Live-Reloading SQL Templates for Supabase](https://timm.stokke.me/blog/srtd-live-reloading-and-sql-templates-for-supabase)
19
19
 
20
20
  ## Why This Exists 🤔
21
21
 
22
22
  While building [Timely](https://www.timely.com)'s next-generation [Memory Engine](https://www.timely.com/memory-app) on [Supabase](https://supabase.com), we found ourselves facing two major annoyances:
23
23
 
24
24
  1. Code reviews were painful - function changes showed up as complete rewrites, `git blame` was useless
25
- 2. Designing and iterating on database changes locally meant constant friction, like the dance around copy-pasting into SQL console
25
+ 2. Designing and iterating on database changes locally was full of friction, no matter which workflow we tried
26
26
 
27
- After over a year of looking-but-not-finding a better way, I paired up with [Claude](https://claude.ai) to eliminate these annoyances. Say hello to `srtd`.
27
+ I spent [nearly two years looking](https://news.ycombinator.com/item?id=37755076) for something pre-existing, to no avail. Sufficiently fed up, I paired with [Claude](https://claude.ai) to eliminate these annoyances.
28
+
29
+ Say hello to `srtd`.
28
30
 
29
31
  ## Key Features ✨
30
32
 
@@ -89,29 +91,11 @@ srtd build # Creates timestamped migration file
89
91
  supabase migration up # Apply using Supabase CLI
90
92
  ```
91
93
 
92
- ## Commands 🎮
93
-
94
- ### Interactive Mode
95
-
96
- Running `srtd` without arguments opens an interactive menu:
97
-
98
- ### CLI Mode
99
-
100
- - 🏗️ `srtd build [--force]` - Generate migrations from templates
101
- - ▶️ `srtd apply [--force]` - Apply templates directly to local database
102
- - ✍️ `srtd register [file.sql]` - Mark templates as already built
103
- - 👀 `srtd watch` - Watch and auto-apply changes
104
- - 🧹 `srtd clean` - Remove all logs and reset config
105
-
106
- > [!IMPORTANT]
107
- > `watch` and `apply` commands modify your local database directly and don't clean up after themselves. Use with caution!
108
94
 
109
95
  ## The Power of Templates 💪
110
96
 
97
+ Without templates, the smallest change to a function would show up as a complete rewrite in your version control system. With templates, the diff is clear and concise.
111
98
 
112
- Templates make code reviews meaningful. Consider this PR adding priority to a notification function:
113
-
114
- Without templates, this would appear as a complete rewrite in your PR.
115
99
 
116
100
  ### Perfect For 🎯
117
101
 
@@ -194,6 +178,24 @@ Without templates, this would appear as a complete rewrite in your PR.
194
178
 
195
179
  Use regular [Supabase](https://supabase.com) migrations for these cases.
196
180
 
181
+
182
+ ## Commands 🎮
183
+
184
+ ### Interactive Mode
185
+
186
+ Running `srtd` without arguments opens an interactive menu:
187
+
188
+ ### CLI Mode
189
+
190
+ - 🏗️ `srtd build [--force]` - Generate migrations from templates
191
+ - ▶️ `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
194
+ - 🧹 `srtd clean` - Remove all logs and reset config
195
+
196
+ > [!IMPORTANT]
197
+ > `watch` and `apply` commands modify your local database directly and don't clean up after themselves. Use with caution!
198
+
197
199
  ## Configuration 📝
198
200
 
199
201
  `srtd.config.json` created during initialization:
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,69 @@
1
+ import fs from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { render } from 'ink-testing-library';
5
+ import React from 'react';
6
+ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
7
+ import Apply from '../commands/apply.js';
8
+ import { connect } from '../utils/databaseConnection.js';
9
+ import { TEST_FN_PREFIX } from './vitest.setup.js';
10
+ vi.mock('../hooks/useTemplateProcessor', () => ({
11
+ useTemplateProcessor: vi.fn().mockImplementation(() => ({
12
+ isProcessing: false,
13
+ result: {
14
+ built: [],
15
+ applied: ['test.sql'],
16
+ skipped: [],
17
+ errors: [],
18
+ },
19
+ })),
20
+ }));
21
+ describe('Apply Command', () => {
22
+ const testContext = {
23
+ timestamp: Date.now(),
24
+ testFunctionName: `${TEST_FN_PREFIX}${Date.now()}`,
25
+ testDir: path.join(tmpdir(), `test-apply-command-${Date.now()}`),
26
+ };
27
+ vi.mock('ink', async (importOriginal) => {
28
+ const actual = (await importOriginal());
29
+ const mockExit = vi.fn();
30
+ return {
31
+ ...actual,
32
+ useApp: () => ({ exit: mockExit }),
33
+ };
34
+ });
35
+ async function createTestTemplate(content) {
36
+ const templateDir = path.join(testContext.testDir, 'test-templates');
37
+ await fs.mkdir(templateDir, { recursive: true });
38
+ const templatePath = path.join(templateDir, `test-${testContext.timestamp}.sql`);
39
+ await fs.writeFile(templatePath, content);
40
+ }
41
+ beforeEach(async () => {
42
+ const validSQL = `
43
+ CREATE OR REPLACE FUNCTION ${testContext.testFunctionName}()
44
+ RETURNS void AS $$
45
+ BEGIN NULL; END;
46
+ $$ LANGUAGE plpgsql;
47
+ `;
48
+ await createTestTemplate(validSQL);
49
+ });
50
+ afterEach(async () => {
51
+ const client = await connect();
52
+ try {
53
+ await client.query(`DROP FUNCTION IF EXISTS ${testContext.testFunctionName}()`);
54
+ }
55
+ finally {
56
+ client.release();
57
+ }
58
+ await fs.rm(testContext.testDir, { recursive: true, force: true });
59
+ });
60
+ test('shows progress and success', async () => {
61
+ const { lastFrame } = render(React.createElement(Apply, { options: { force: false } }));
62
+ expect(lastFrame()).toMatch(/✓ test\.sql/);
63
+ });
64
+ test('handles force flag', async () => {
65
+ const { lastFrame } = render(React.createElement(Apply, { options: { force: true } }));
66
+ expect(lastFrame()).toMatch(/✓ test\.sql/);
67
+ });
68
+ });
69
+ //# sourceMappingURL=apply.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.test.js","sourceRoot":"","sources":["../../src/__tests__/apply.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE;YACN,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,CAAC,UAAU,CAAC;YACrB,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;SACX;KACF,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG;QAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,gBAAgB,EAAE,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;QAClD,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;KACjE,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAC,cAAc,EAAC,EAAE;QACpC,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,EAAE,CAAyB,CAAC;QAChE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,OAAO;YACL,GAAG,MAAM;YACT,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,kBAAkB,CAAC,OAAe;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACrE,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,WAAW,CAAC,SAAS,MAAM,CAAC,CAAC;QACjF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,QAAQ,GAAG;mCACc,WAAW,CAAC,gBAAgB;;;;KAI1D,CAAC;QACF,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,2BAA2B,WAAW,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAI,CAAC,CAAC;QACnE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAI,CAAC,CAAC;QAClE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,67 @@
1
+ import fs from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { render } from 'ink-testing-library';
5
+ import React from 'react';
6
+ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
7
+ import Build from '../commands/build.js';
8
+ import { TEST_FN_PREFIX } from './vitest.setup.js';
9
+ vi.mock('../hooks/useTemplateProcessor', () => ({
10
+ useTemplateProcessor: vi.fn().mockImplementation(({ apply }) => ({
11
+ isProcessing: false,
12
+ result: {
13
+ built: ['test.sql'],
14
+ applied: apply ? ['test.sql'] : [],
15
+ skipped: [],
16
+ errors: [],
17
+ },
18
+ })),
19
+ }));
20
+ describe('Build Command', () => {
21
+ const testContext = {
22
+ timestamp: Date.now(),
23
+ testFunctionName: `${TEST_FN_PREFIX}${Date.now()}`,
24
+ testDir: path.join(tmpdir(), `test-build-command-${Date.now()}`),
25
+ };
26
+ vi.mock('ink', async (importOriginal) => {
27
+ const actual = (await importOriginal());
28
+ return {
29
+ ...actual,
30
+ useApp: () => ({ exit: vi.fn() }),
31
+ };
32
+ });
33
+ async function createTestTemplate(content) {
34
+ const templateDir = path.join(testContext.testDir, 'test-templates');
35
+ await fs.mkdir(templateDir, { recursive: true });
36
+ const templatePath = path.join(templateDir, `test-${testContext.timestamp}.sql`);
37
+ await fs.writeFile(templatePath, content);
38
+ return templatePath;
39
+ }
40
+ beforeEach(async () => {
41
+ const validSQL = `
42
+ CREATE OR REPLACE FUNCTION ${testContext.testFunctionName}()
43
+ RETURNS void AS $$
44
+ BEGIN NULL; END;
45
+ $$ LANGUAGE plpgsql;
46
+ `;
47
+ await createTestTemplate(validSQL);
48
+ });
49
+ afterEach(async () => {
50
+ await fs.rm(testContext.testDir, { recursive: true, force: true });
51
+ });
52
+ test('shows build progress and success', async () => {
53
+ const { lastFrame } = render(React.createElement(Build, { options: { force: false } }));
54
+ expect(lastFrame()).toMatch(/✓ test\.sql/);
55
+ });
56
+ test('handles force flag', async () => {
57
+ const { lastFrame } = render(React.createElement(Build, { options: { force: true } }));
58
+ expect(lastFrame()).toMatch(/✓ test\.sql/);
59
+ });
60
+ test('handles build and apply together', async () => {
61
+ const { lastFrame } = render(React.createElement(Build, { options: { force: false, apply: true } }));
62
+ // Use more precise matching that accounts for newlines
63
+ expect(lastFrame()).toMatch(/Built:\s*\n\s*✓ test\.sql/);
64
+ expect(lastFrame()).toMatch(/Applied:\s*\n\s*✓ test\.sql/);
65
+ });
66
+ });
67
+ //# sourceMappingURL=build.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.test.js","sourceRoot":"","sources":["../../src/__tests__/build.test.tsx"],"names":[],"mappings":"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"}
@@ -9,15 +9,21 @@ vi.mock('ink', async (importOriginal) => {
9
9
  useApp: () => ({ exit: vi.fn() }),
10
10
  };
11
11
  });
12
+ const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));
12
13
  describe('Watch Command', () => {
13
14
  beforeEach(() => {
14
15
  vi.clearAllMocks();
15
16
  });
16
17
  test('renders initial state with no templates', async () => {
17
18
  const { lastFrame } = render(React.createElement(Watch, null));
18
- await new Promise(resolve => setTimeout(resolve, 100));
19
- const output = lastFrame();
20
- expect(output).toContain('Watch Mode');
19
+ await wait(100); // Allow time for UI to render and DB to initialize
20
+ expect(lastFrame()).toContain('Watch Mode');
21
+ expect(lastFrame()).toContain('No templates found');
22
+ });
23
+ test('renders with templates', async () => {
24
+ const { lastFrame } = render(React.createElement(Watch, null));
25
+ await wait(100); // Allow time for UI to render and DB to initialize
26
+ expect(lastFrame()).toContain('Watch Mode');
21
27
  });
22
28
  });
23
29
  //# sourceMappingURL=watch.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.test.js","sourceRoot":"","sources":["../../src/__tests__/watch.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAEzC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAC,cAAc,EAAC,EAAE;IACpC,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,EAAE,CAAyB,CAAC;IAChE,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,KAAK,OAAG,CAAC,CAAC;QACxC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"watch.test.js","sourceRoot":"","sources":["../../src/__tests__/watch.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAEzC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAC,cAAc,EAAC,EAAE;IACpC,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,EAAE,CAAyB,CAAC;IAChE,OAAO;QACL,GAAG,MAAM;QACT,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE7E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,KAAK,OAAG,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,mDAAmD;QAEpE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,KAAK,OAAG,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,mDAAmD;QAEpE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,35 +1,29 @@
1
- import { Alert, ThemeProvider, defaultTheme, extendTheme } from '@inkjs/ui';
1
+ // src/commands/_app.tsx
2
+ import { Alert, ThemeProvider } from '@inkjs/ui';
3
+ import Debug from 'components/Debug.js';
2
4
  import { Box, Static, Text } from 'ink';
3
5
  import React from 'react';
6
+ import { COLOR_ERROR, customTheme } from '../components/customTheme.js';
4
7
  import { useDatabaseConnection } from '../hooks/useDatabaseConnection.js';
5
- const customTheme = extendTheme(defaultTheme, {
6
- components: {
7
- Spinner: {
8
- styles: {
9
- frame: () => ({
10
- color: 'magenta',
11
- }),
12
- },
13
- },
14
- },
15
- });
16
8
  export default function App({ Component, commandProps }) {
17
9
  const { error } = useDatabaseConnection();
18
10
  return (React.createElement(ThemeProvider, { theme: customTheme },
19
11
  React.createElement(Box, { flexDirection: "column", padding: 1 },
20
12
  !!error && (React.createElement(Static, { items: [error] }, error => (React.createElement(Box, { key: error },
21
13
  React.createElement(Alert, { variant: "error" },
22
- React.createElement(Text, { bold: true, color: "red" },
14
+ React.createElement(Text, { bold: true, color: COLOR_ERROR },
23
15
  "Error:",
24
16
  ' '),
25
17
  error))))),
26
- React.createElement(Component, { ...commandProps }))));
18
+ React.createElement(Component, { ...commandProps }),
19
+ React.createElement(Debug, null))));
27
20
  }
28
- // Mimick fullscreen behavior
21
+ // Fullscreen behavior
29
22
  const enterAltScreenCommand = '\x1b[?1049h';
30
23
  const leaveAltScreenCommand = '\x1b[?1049l';
31
24
  process.stdout.write(enterAltScreenCommand);
32
- process.on('exit', () => {
25
+ const cleanup = () => {
33
26
  process.stdout.write(leaveAltScreenCommand);
34
- });
27
+ };
28
+ process.on('exit', cleanup);
35
29
  //# sourceMappingURL=_app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_app.js","sourceRoot":"","sources":["../../src/commands/_app.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAExD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,EAAE;IAC5C,UAAU,EAAE;QACV,OAAO,EAAE;YACP,MAAM,EAAE;gBACN,KAAK,EAAE,GAAc,EAAE,CAAC,CAAC;oBACvB,KAAK,EAAE,SAAS;iBACjB,CAAC;aACH;SACF;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAY;IAC/D,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAE1C,OAAO,CACL,oBAAC,aAAa,IAAC,KAAK,EAAE,WAAW;QAC/B,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC;YACnC,CAAC,CAAC,KAAK,IAAI,CACV,oBAAC,MAAM,IAAC,KAAK,EAAE,CAAC,KAAK,CAAC,IACnB,KAAK,CAAC,EAAE,CAAC,CACR,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK;gBACb,oBAAC,KAAK,IAAC,OAAO,EAAC,OAAO;oBACpB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK;;wBACb,GAAG,CACL;oBACN,KAAK,CACA,CACJ,CACP,CACM,CACV;YACD,oBAAC,SAAS,OAAK,YAAY,GAAI,CAC3B,CACQ,CACjB,CAAC;AACJ,CAAC;AAED,6BAA6B;AAC7B,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAC5C,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC5C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"_app.js","sourceRoot":"","sources":["../../src/commands/_app.tsx"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAExC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAY;IAC/D,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAE1C,OAAO,CACL,oBAAC,aAAa,IAAC,KAAK,EAAE,WAAW;QAC/B,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC;YACnC,CAAC,CAAC,KAAK,IAAI,CACV,oBAAC,MAAM,IAAC,KAAK,EAAE,CAAC,KAAK,CAAC,IACnB,KAAK,CAAC,EAAE,CAAC,CACR,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK;gBACb,oBAAC,KAAK,IAAC,OAAO,EAAC,OAAO;oBACpB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,WAAW;;wBACpB,GAAG,CACL;oBACN,KAAK,CACA,CACJ,CACP,CACM,CACV;YACD,oBAAC,SAAS,OAAK,YAAY,GAAI;YAC/B,oBAAC,KAAK,OAAG,CACL,CACQ,CACjB,CAAC;AACJ,CAAC;AAED,sBAAsB;AACtB,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAC5C,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAE5C,MAAM,OAAO,GAAG,GAAG,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  import zod from 'zod';
2
3
  export declare const options: zod.ZodObject<{
3
4
  force: zod.ZodBoolean;
@@ -9,5 +10,5 @@ export declare const options: zod.ZodObject<{
9
10
  type Props = {
10
11
  options: zod.infer<typeof options>;
11
12
  };
12
- export default function Apply({ options }: Props): null;
13
+ export default function Apply({ options }: Props): React.JSX.Element;
13
14
  export {};
@@ -1,9 +1,12 @@
1
- // commands/build.tsx
2
- import { useApp } from 'ink';
1
+ // src/commands/apply.tsx
2
+ import { Spinner } from '@inkjs/ui';
3
+ import { Box, Text, useApp, useInput } from 'ink';
3
4
  import { option } from 'pastel';
4
5
  import React from 'react';
5
6
  import zod from 'zod';
6
- import { TemplateManager } from '../lib/templateManager.js';
7
+ import Branding from '../components/Branding.js';
8
+ import { ProcessingResults } from '../components/ProcessingResults.js';
9
+ import { useTemplateProcessor } from '../hooks/useTemplateProcessor.js';
7
10
  export const options = zod.object({
8
11
  force: zod.boolean().describe(option({
9
12
  description: 'Force apply of all templates, irrespective of changes',
@@ -12,22 +15,16 @@ export const options = zod.object({
12
15
  });
13
16
  export default function Apply({ options }) {
14
17
  const { exit } = useApp();
15
- React.useEffect(() => {
16
- async function doApply() {
17
- try {
18
- const manager = await TemplateManager.create(process.cwd());
19
- await manager.processTemplates({ apply: true, force: options.force });
20
- exit();
21
- }
22
- catch (err) {
23
- if (err instanceof Error) {
24
- exit(err);
25
- }
26
- exit();
27
- }
18
+ const { result, isProcessing } = useTemplateProcessor({ force: options.force, apply: true });
19
+ useInput((_input, _) => {
20
+ if (!isProcessing) {
21
+ exit();
28
22
  }
29
- void doApply();
30
- }, [exit, options]);
31
- return null;
23
+ });
24
+ return (React.createElement(Box, { flexDirection: "column", gap: 1 },
25
+ React.createElement(Branding, { subtitle: "\u25B6\uFE0F Apply migrations" }),
26
+ isProcessing ? (React.createElement(Spinner, { label: "Applying templates..." })) : (React.createElement(React.Fragment, null,
27
+ React.createElement(ProcessingResults, { result: result, showApply: true }),
28
+ React.createElement(Text, { dimColor: true }, "Press any key to exit")))));
32
29
  }
33
30
  //# sourceMappingURL=apply.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,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,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,OAAO;YACpB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC5D,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBACtE,IAAI,EAAE,CAAC;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,GAAG,CAAC,CAAC;gBACZ,CAAC;gBACD,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,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,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAClD,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,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACrB,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;YACE,oBAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAG;YAC/C,oBAAC,IAAI,IAAC,QAAQ,kCAA6B,CAC1C,CACJ,CACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,13 +1,17 @@
1
+ import React from 'react';
1
2
  import zod from 'zod';
2
3
  export declare const options: zod.ZodObject<{
3
4
  force: zod.ZodBoolean;
5
+ apply: zod.ZodOptional<zod.ZodBoolean>;
4
6
  }, "strip", zod.ZodTypeAny, {
5
7
  force: boolean;
8
+ apply?: boolean | undefined;
6
9
  }, {
7
10
  force: boolean;
11
+ apply?: boolean | undefined;
8
12
  }>;
9
13
  type Props = {
10
14
  options: zod.infer<typeof options>;
11
15
  };
12
- export default function Build({ options }: Props): null;
16
+ export default function Build({ options }: Props): React.JSX.Element;
13
17
  export {};
@@ -1,25 +1,41 @@
1
1
  // commands/build.tsx
2
- import { useApp } from 'ink';
2
+ import { Spinner } from '@inkjs/ui';
3
+ import { Box, Text, useApp, useInput } from 'ink';
3
4
  import { option } from 'pastel';
4
5
  import React from 'react';
5
6
  import zod from 'zod';
6
- import { TemplateManager } from '../lib/templateManager.js';
7
+ import Branding from '../components/Branding.js';
8
+ import { ProcessingResults } from '../components/ProcessingResults.js';
9
+ import { useTemplateProcessor } from '../hooks/useTemplateProcessor.js';
7
10
  export const options = zod.object({
8
11
  force: zod.boolean().describe(option({
9
12
  description: 'Force building of all templates, irrespective of changes',
10
13
  alias: 'f',
11
14
  })),
15
+ apply: zod
16
+ .boolean()
17
+ .optional()
18
+ .describe(option({
19
+ description: 'Apply the built templates',
20
+ alias: 'a',
21
+ })),
12
22
  });
13
23
  export default function Build({ options }) {
14
24
  const { exit } = useApp();
15
- React.useEffect(() => {
16
- async function doBuild() {
17
- const manager = await TemplateManager.create(process.cwd());
18
- await manager.processTemplates({ generateFiles: true, force: options.force });
25
+ const { result, isProcessing } = useTemplateProcessor({
26
+ force: options.force,
27
+ generateFiles: true,
28
+ apply: options.apply,
29
+ });
30
+ useInput((_input, _) => {
31
+ if (!isProcessing) {
19
32
  exit();
20
33
  }
21
- doBuild();
22
- }, [options, exit]);
23
- return null;
34
+ });
35
+ return (React.createElement(Box, { flexDirection: "column", gap: 1 },
36
+ React.createElement(Branding, { subtitle: "\uD83C\uDFD7\uFE0F Build migrations" }),
37
+ isProcessing ? (React.createElement(Spinner, { label: "Building templates..." })) : (React.createElement(React.Fragment, null,
38
+ React.createElement(ProcessingResults, { result: result, showBuild: true, showApply: !!option.apply }),
39
+ React.createElement(Text, { dimColor: true }, "Press any key to exit")))));
24
40
  }
25
41
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,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;CACF,CAAC,CAAC;AAMH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAAE,OAAO,EAAS;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,OAAO;YACpB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5D,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,IAAI,EAAE,CAAC;QACT,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEpB,OAAO,IAAI,CAAC;AACd,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,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAClD,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,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACrB,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,sCAAuB,GAAG;QAC5C,YAAY,CAAC,CAAC,CAAC,CACd,oBAAC,OAAO,IAAC,KAAK,EAAC,uBAAuB,GAAG,CAC1C,CAAC,CAAC,CAAC,CACF;YACE,oBAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,QAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,GAAI;YAC1E,oBAAC,IAAI,IAAC,QAAQ,kCAA6B,CAC1C,CACJ,CACG,CACP,CAAC;AACJ,CAAC"}
@@ -4,6 +4,7 @@ import { Box, Text } from 'ink';
4
4
  import React from 'react';
5
5
  import Branding from '../components/Branding.js';
6
6
  import Quittable from '../components/Quittable.js';
7
+ import { COLOR_ERROR } from '../components/customTheme.js';
7
8
  import { useDatabaseConnection } from '../hooks/useDatabaseConnection.js';
8
9
  import Apply from './apply.js';
9
10
  import Build from './build.js';
@@ -44,7 +45,7 @@ export default function UI() {
44
45
  return (React.createElement(Box, { flexDirection: "column" },
45
46
  React.createElement(Branding, null),
46
47
  error ? (React.createElement(Box, { gap: 1 },
47
- React.createElement(Text, { color: "red", bold: true }, "Error"),
48
+ React.createElement(Text, { color: COLOR_ERROR, bold: true }, "Error"),
48
49
  React.createElement(Text, null, "Check your database connection and try again."))) : (React.createElement(Select, { options: menuItems, isDisabled: !isConnected, onChange: handleOnChange })),
49
50
  isChecking ? (React.createElement(Box, { marginTop: 1 },
50
51
  React.createElement(Spinner, { label: "Checking database connection..." }))) : (React.createElement(Quittable, null))));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,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,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,qBAAqB,EAAE,CAAC;IACnE,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,oDAAoD;YAC3D,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,oDAAoD,EAAE,KAAK,EAAE,OAAO,EAAE;KAChF,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,QAAQ,OAAG;QACX,KAAK,CAAC,CAAC,CAAC,CACP,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC;YACT,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,kBAEf;YACP,oBAAC,IAAI,wDAAqD,CACtD,CACP,CAAC,CAAC,CAAC,CACF,oBAAC,MAAM,IAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAI,CACnF;QAEA,UAAU,CAAC,CAAC,CAAC,CACZ,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,OAAO,IAAC,KAAK,EAAC,iCAAiC,GAAG,CAC/C,CACP,CAAC,CAAC,CAAC,CACF,oBAAC,SAAS,OAAG,CACd,CACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import React from 'react';
5
5
  import zod from 'zod';
6
6
  import Branding from '../components/Branding.js';
7
7
  import Quittable from '../components/Quittable.js';
8
+ import { COLOR_ERROR, COLOR_SUCCESS } from '../components/customTheme.js';
8
9
  import { useTemplateState } from '../hooks/useTemplateState.js';
9
10
  import { registerTemplate } from '../utils/registerTemplate.js';
10
11
  // Support both array of filenames as arguments and interactive selection
@@ -49,7 +50,7 @@ export default function Register({ args: templateArgs }) {
49
50
  }
50
51
  }, [handleTemplateRegistration, templateArgs]);
51
52
  if (error) {
52
- return React.createElement(Text, { color: "red" },
53
+ return React.createElement(Text, { color: COLOR_ERROR },
53
54
  "Error: ",
54
55
  error);
55
56
  }
@@ -73,13 +74,13 @@ export default function Register({ args: templateArgs }) {
73
74
  React.createElement(Text, { dimColor: true }, "Use arrow/space to select, then press Enter to register.")),
74
75
  React.createElement(Box, { marginTop: 1, marginBottom: 1 },
75
76
  React.createElement(MultiSelect, { options: options, onChange: vals => setSelectedValues(vals), onSubmit: vals => void handleTemplateRegistration(vals) })),
76
- !!errorMessage && React.createElement(Text, { color: "red" }, errorMessage),
77
- !!successMessage && React.createElement(Text, { color: "#3ecf8e" }, successMessage),
77
+ !!errorMessage && React.createElement(Text, { color: COLOR_ERROR }, errorMessage),
78
+ !!successMessage && React.createElement(Text, { color: COLOR_SUCCESS }, successMessage),
78
79
  React.createElement(Quittable, null)));
79
80
  }
80
81
  return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
81
- !!errorMessage && React.createElement(Text, { color: "red" }, errorMessage),
82
- !!successMessage && React.createElement(Text, { color: "#3ecf8e" }, successMessage),
82
+ !!errorMessage && React.createElement(Text, { color: COLOR_ERROR }, errorMessage),
83
+ !!successMessage && React.createElement(Text, { color: COLOR_SUCCESS }, successMessage),
83
84
  React.createElement(Quittable, null)));
84
85
  }
85
86
  //# sourceMappingURL=register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.tsx"],"names":[],"mappings":"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"}