@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.
- package/README.md +24 -22
- package/dist/__tests__/apply.test.d.ts +1 -0
- package/dist/__tests__/apply.test.js +69 -0
- package/dist/__tests__/apply.test.js.map +1 -0
- package/dist/__tests__/build.test.d.ts +1 -0
- package/dist/__tests__/build.test.js +67 -0
- package/dist/__tests__/build.test.js.map +1 -0
- package/dist/__tests__/watch.test.js +9 -3
- package/dist/__tests__/watch.test.js.map +1 -1
- package/dist/commands/_app.js +11 -17
- package/dist/commands/_app.js.map +1 -1
- package/dist/commands/apply.d.ts +2 -1
- package/dist/commands/apply.js +16 -19
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/build.d.ts +5 -1
- package/dist/commands/build.js +25 -9
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/index.js +2 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/register.js +6 -5
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/watch.js +35 -23
- package/dist/commands/watch.js.map +1 -1
- package/dist/components/Branding.js +7 -7
- package/dist/components/Branding.js.map +1 -1
- package/dist/components/Debug.d.ts +2 -0
- package/dist/components/Debug.js +160 -0
- package/dist/components/Debug.js.map +1 -0
- package/dist/components/ProcessingResults.d.ts +9 -0
- package/dist/components/ProcessingResults.js +32 -0
- package/dist/components/ProcessingResults.js.map +1 -0
- package/dist/components/Quittable.js +1 -1
- package/dist/components/customTheme.d.ts +10 -0
- package/dist/components/customTheme.js +66 -0
- package/dist/components/customTheme.js.map +1 -0
- package/dist/hooks/useDatabaseConnection.js +21 -32
- package/dist/hooks/useDatabaseConnection.js.map +1 -1
- package/dist/hooks/useTemplateProcessor.d.ts +11 -0
- package/dist/hooks/useTemplateProcessor.js +71 -0
- package/dist/hooks/useTemplateProcessor.js.map +1 -0
- package/dist/lib/templateManager.d.ts +4 -0
- package/dist/lib/templateManager.js +29 -6
- package/dist/lib/templateManager.js.map +1 -1
- package/dist/lib/templateManager.test.js +54 -31
- package/dist/lib/templateManager.test.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/utils/databaseConnection.d.ts +5 -0
- package/dist/utils/databaseConnection.js +36 -21
- package/dist/utils/databaseConnection.js.map +1 -1
- package/dist/utils/store.d.ts +5 -0
- package/dist/utils/store.js +10 -0
- package/dist/utils/store.js.map +1 -0
- 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
|
-
|
|
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
|
|
25
|
+
2. Designing and iterating on database changes locally was full of friction, no matter which workflow we tried
|
|
26
26
|
|
|
27
|
-
|
|
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":"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"}
|
|
@@ -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
|
|
19
|
-
|
|
20
|
-
expect(
|
|
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,
|
|
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"}
|
package/dist/commands/_app.js
CHANGED
|
@@ -1,35 +1,29 @@
|
|
|
1
|
-
|
|
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:
|
|
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
|
-
//
|
|
21
|
+
// Fullscreen behavior
|
|
29
22
|
const enterAltScreenCommand = '\x1b[?1049h';
|
|
30
23
|
const leaveAltScreenCommand = '\x1b[?1049l';
|
|
31
24
|
process.stdout.write(enterAltScreenCommand);
|
|
32
|
-
|
|
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,
|
|
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"}
|
package/dist/commands/apply.d.ts
CHANGED
|
@@ -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):
|
|
13
|
+
export default function Apply({ options }: Props): React.JSX.Element;
|
|
13
14
|
export {};
|
package/dist/commands/apply.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
// commands/
|
|
2
|
-
import {
|
|
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
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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,
|
|
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"}
|
package/dist/commands/build.d.ts
CHANGED
|
@@ -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):
|
|
16
|
+
export default function Build({ options }: Props): React.JSX.Element;
|
|
13
17
|
export {};
|
package/dist/commands/build.js
CHANGED
|
@@ -1,25 +1,41 @@
|
|
|
1
1
|
// commands/build.tsx
|
|
2
|
-
import {
|
|
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
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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;
|
|
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"}
|
package/dist/commands/index.js
CHANGED
|
@@ -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:
|
|
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,
|
|
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:
|
|
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:
|
|
77
|
-
!!successMessage && React.createElement(Text, { color:
|
|
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:
|
|
82
|
-
!!successMessage && React.createElement(Text, { color:
|
|
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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,yEAAyE;AACzE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG;KACpB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;KACnB,QAAQ,EAAE;KACV,QAAQ,CACP,QAAQ,CAAC;IACP,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,uCAAuC;CACrD,CAAC,CACH,CAAC;AAMJ,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAS;IAC5D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC5C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAW,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3D,MAAM,0BAA0B,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,SAAmB,EAAE,EAAE;QACjF,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACtB,eAAe,CAAC,EAAE,CAAC,CAAC;QAEpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC5C,YAAY,EAAE,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,eAAe,CAAC,sBAAsB,SAAS,eAAe,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,iBAAiB,CAAC,2BAA2B,YAAY,eAAe,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,kEAAkE;QAClE,IAAI,YAAY,EAAE,MAAM,EAAE,CAAC;YACzB,KAAK,0BAA0B,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,EAAE,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,oBAAC,IAAI,IAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.tsx"],"names":[],"mappings":"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"}
|