@t1mmen/srtd 0.4.0 → 0.4.1
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/package.json +97 -0
- package/dist/src/__tests__/apply.test.js +69 -0
- package/dist/src/__tests__/apply.test.js.map +1 -0
- package/dist/src/__tests__/build.test.js +67 -0
- package/dist/src/__tests__/build.test.js.map +1 -0
- package/dist/src/__tests__/vitest.setup.js.map +1 -0
- package/dist/{__tests__ → src/__tests__}/watch.test.js +9 -3
- package/dist/src/__tests__/watch.test.js.map +1 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/{commands → src/commands}/_app.js +11 -17
- package/dist/src/commands/_app.js.map +1 -0
- package/dist/{commands → src/commands}/apply.d.ts +2 -1
- package/dist/src/commands/apply.js +30 -0
- package/dist/src/commands/apply.js.map +1 -0
- package/dist/{commands → src/commands}/build.d.ts +5 -1
- package/dist/src/commands/build.js +41 -0
- package/dist/src/commands/build.js.map +1 -0
- package/dist/src/commands/clear.js.map +1 -0
- package/dist/{commands → src/commands}/index.js +2 -1
- package/dist/src/commands/index.js.map +1 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/{commands → src/commands}/register.js +6 -5
- package/dist/src/commands/register.js.map +1 -0
- package/dist/{commands → src/commands}/watch.js +35 -23
- package/dist/src/commands/watch.js.map +1 -0
- package/dist/{components → src/components}/Branding.js +7 -7
- package/dist/src/components/Branding.js.map +1 -0
- package/dist/src/components/Debug.d.ts +2 -0
- package/dist/src/components/Debug.js +160 -0
- package/dist/src/components/Debug.js.map +1 -0
- package/dist/src/components/ProcessingResults.d.ts +9 -0
- package/dist/src/components/ProcessingResults.js +32 -0
- package/dist/src/components/ProcessingResults.js.map +1 -0
- package/dist/{components → src/components}/Quittable.js +1 -1
- package/dist/src/components/Quittable.js.map +1 -0
- package/dist/src/components/TimeSince.js.map +1 -0
- package/dist/src/components/customTheme.d.ts +10 -0
- package/dist/src/components/customTheme.js +66 -0
- package/dist/src/components/customTheme.js.map +1 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/hooks/useDatabaseConnection.js +57 -0
- package/dist/src/hooks/useDatabaseConnection.js.map +1 -0
- package/dist/src/hooks/useTemplateManager.js.map +1 -0
- package/dist/src/hooks/useTemplateProcessor.d.ts +11 -0
- package/dist/src/hooks/useTemplateProcessor.js +71 -0
- package/dist/src/hooks/useTemplateProcessor.js.map +1 -0
- package/dist/src/hooks/useTemplateState.js.map +1 -0
- package/dist/{lib → src/lib}/templateManager.d.ts +4 -0
- package/dist/{lib → src/lib}/templateManager.js +29 -6
- package/dist/src/lib/templateManager.js.map +1 -0
- package/dist/{lib → src/lib}/templateManager.test.js +4 -1
- package/dist/src/lib/templateManager.test.js.map +1 -0
- package/dist/{types.d.ts → src/types.d.ts} +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/applyMigration.js.map +1 -0
- package/dist/src/utils/applyMigrations.test.js.map +1 -0
- package/dist/src/utils/calculateMD5.js.map +1 -0
- package/dist/src/utils/config.js.map +1 -0
- package/dist/src/utils/config.test.js.map +1 -0
- package/dist/src/utils/createEmptyBuildLog.js.map +1 -0
- package/dist/{utils → src/utils}/databaseConnection.d.ts +5 -0
- package/dist/{utils → src/utils}/databaseConnection.js +36 -21
- package/dist/src/utils/databaseConnection.js.map +1 -0
- package/dist/src/utils/databaseConnection.test.d.ts +1 -0
- package/dist/src/utils/databaseConnection.test.js.map +1 -0
- package/dist/src/utils/ensureDirectories.js.map +1 -0
- package/dist/src/utils/fileExists.js.map +1 -0
- package/dist/src/utils/getNextTimestamp.js.map +1 -0
- package/dist/src/utils/isWipTemplate.js.map +1 -0
- package/dist/src/utils/loadBuildLog.js.map +1 -0
- package/dist/src/utils/loadBuildLog.test.d.ts +1 -0
- package/dist/src/utils/loadBuildLog.test.js.map +1 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/registerTemplate.js.map +1 -0
- package/dist/src/utils/safeCreate.js.map +1 -0
- package/dist/src/utils/saveBuildLog.js.map +1 -0
- package/dist/src/utils/store.d.ts +5 -0
- package/dist/src/utils/store.js +10 -0
- package/dist/src/utils/store.js.map +1 -0
- package/package.json +3 -2
- package/dist/__tests__/vitest.setup.js.map +0 -1
- package/dist/__tests__/watch.test.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/_app.js.map +0 -1
- package/dist/commands/apply.js +0 -33
- package/dist/commands/apply.js.map +0 -1
- package/dist/commands/build.js +0 -25
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/clear.js.map +0 -1
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/register.js.map +0 -1
- package/dist/commands/watch.js.map +0 -1
- package/dist/components/Branding.js.map +0 -1
- package/dist/components/Quittable.js.map +0 -1
- package/dist/components/TimeSince.js.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/hooks/useDatabaseConnection.js +0 -68
- package/dist/hooks/useDatabaseConnection.js.map +0 -1
- package/dist/hooks/useTemplateManager.js.map +0 -1
- package/dist/hooks/useTemplateState.js.map +0 -1
- package/dist/lib/templateManager.js.map +0 -1
- package/dist/lib/templateManager.test.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/applyMigration.js.map +0 -1
- package/dist/utils/applyMigrations.test.js.map +0 -1
- package/dist/utils/calculateMD5.js.map +0 -1
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/config.test.js.map +0 -1
- package/dist/utils/createEmptyBuildLog.js.map +0 -1
- package/dist/utils/databaseConnection.js.map +0 -1
- package/dist/utils/databaseConnection.test.js.map +0 -1
- package/dist/utils/ensureDirectories.js.map +0 -1
- package/dist/utils/fileExists.js.map +0 -1
- package/dist/utils/getNextTimestamp.js.map +0 -1
- package/dist/utils/isWipTemplate.js.map +0 -1
- package/dist/utils/loadBuildLog.js.map +0 -1
- package/dist/utils/loadBuildLog.test.js.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/registerTemplate.js.map +0 -1
- package/dist/utils/safeCreate.js.map +0 -1
- package/dist/utils/saveBuildLog.js.map +0 -1
- /package/dist/{__tests__/watch.test.d.ts → src/__tests__/apply.test.d.ts} +0 -0
- /package/dist/{lib/templateManager.test.d.ts → src/__tests__/build.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/vitest.setup.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/vitest.setup.js +0 -0
- /package/dist/{utils/applyMigrations.test.d.ts → src/__tests__/watch.test.d.ts} +0 -0
- /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
- /package/dist/{cli.js → src/cli.js} +0 -0
- /package/dist/{commands → src/commands}/_app.d.ts +0 -0
- /package/dist/{commands → src/commands}/clear.d.ts +0 -0
- /package/dist/{commands → src/commands}/clear.js +0 -0
- /package/dist/{commands → src/commands}/index.d.ts +0 -0
- /package/dist/{commands → src/commands}/init.d.ts +0 -0
- /package/dist/{commands → src/commands}/init.js +0 -0
- /package/dist/{commands → src/commands}/register.d.ts +0 -0
- /package/dist/{commands → src/commands}/watch.d.ts +0 -0
- /package/dist/{components → src/components}/Branding.d.ts +0 -0
- /package/dist/{components → src/components}/Quittable.d.ts +0 -0
- /package/dist/{components → src/components}/TimeSince.d.ts +0 -0
- /package/dist/{components → src/components}/TimeSince.js +0 -0
- /package/dist/{constants.d.ts → src/constants.d.ts} +0 -0
- /package/dist/{constants.js → src/constants.js} +0 -0
- /package/dist/{hooks → src/hooks}/useDatabaseConnection.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/useTemplateManager.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/useTemplateManager.js +0 -0
- /package/dist/{hooks → src/hooks}/useTemplateState.d.ts +0 -0
- /package/dist/{hooks → src/hooks}/useTemplateState.js +0 -0
- /package/dist/{utils/config.test.d.ts → src/lib/templateManager.test.d.ts} +0 -0
- /package/dist/{types.js → src/types.js} +0 -0
- /package/dist/{utils → src/utils}/applyMigration.d.ts +0 -0
- /package/dist/{utils → src/utils}/applyMigration.js +0 -0
- /package/dist/{utils/databaseConnection.test.d.ts → src/utils/applyMigrations.test.d.ts} +0 -0
- /package/dist/{utils → src/utils}/applyMigrations.test.js +0 -0
- /package/dist/{utils → src/utils}/calculateMD5.d.ts +0 -0
- /package/dist/{utils → src/utils}/calculateMD5.js +0 -0
- /package/dist/{utils → src/utils}/config.d.ts +0 -0
- /package/dist/{utils → src/utils}/config.js +0 -0
- /package/dist/{utils/loadBuildLog.test.d.ts → src/utils/config.test.d.ts} +0 -0
- /package/dist/{utils → src/utils}/config.test.js +0 -0
- /package/dist/{utils → src/utils}/createEmptyBuildLog.d.ts +0 -0
- /package/dist/{utils → src/utils}/createEmptyBuildLog.js +0 -0
- /package/dist/{utils → src/utils}/databaseConnection.test.js +0 -0
- /package/dist/{utils → src/utils}/ensureDirectories.d.ts +0 -0
- /package/dist/{utils → src/utils}/ensureDirectories.js +0 -0
- /package/dist/{utils → src/utils}/fileExists.d.ts +0 -0
- /package/dist/{utils → src/utils}/fileExists.js +0 -0
- /package/dist/{utils → src/utils}/getNextTimestamp.d.ts +0 -0
- /package/dist/{utils → src/utils}/getNextTimestamp.js +0 -0
- /package/dist/{utils → src/utils}/isWipTemplate.d.ts +0 -0
- /package/dist/{utils → src/utils}/isWipTemplate.js +0 -0
- /package/dist/{utils → src/utils}/loadBuildLog.d.ts +0 -0
- /package/dist/{utils → src/utils}/loadBuildLog.js +0 -0
- /package/dist/{utils → src/utils}/loadBuildLog.test.js +0 -0
- /package/dist/{utils → src/utils}/logger.d.ts +0 -0
- /package/dist/{utils → src/utils}/logger.js +0 -0
- /package/dist/{utils → src/utils}/registerTemplate.d.ts +0 -0
- /package/dist/{utils → src/utils}/registerTemplate.js +0 -0
- /package/dist/{utils → src/utils}/safeCreate.d.ts +0 -0
- /package/dist/{utils → src/utils}/safeCreate.js +0 -0
- /package/dist/{utils → src/utils}/saveBuildLog.d.ts +0 -0
- /package/dist/{utils → src/utils}/saveBuildLog.js +0 -0
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,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@t1mmen/srtd",
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"description": "Supabase Repeatable Template Definitions (srtd): 🪄 Live-reloading SQL templates for Supabase DX. Make your database changes reviewable and migrations maintainable! 🚀",
|
|
6
|
+
"bin": {
|
|
7
|
+
"srtd": "dist/src/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=20"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"clean": "rm -rf dist; rm -rf build; rm -rf coverage; npm run supabase:stop",
|
|
15
|
+
"changeset": "changeset",
|
|
16
|
+
"version": "changeset version",
|
|
17
|
+
"release": "npm run build && changeset publish",
|
|
18
|
+
"build": "rm -rf dist && tsc",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"lint": "biome lint . --write",
|
|
21
|
+
"format": "biome format . --write",
|
|
22
|
+
"dev": "tsc --watch",
|
|
23
|
+
"test": "vitest",
|
|
24
|
+
"test:coverage": "vitest run --coverage --reporter=junit --outputFile=test-report.junit.xml",
|
|
25
|
+
"start": "tsx src/cli.tsx",
|
|
26
|
+
"repomix": "mkdir build; npx repomix",
|
|
27
|
+
"supabase:start": "npx supabase start",
|
|
28
|
+
"supabase:stop": "npx supabase stop"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"author": {
|
|
34
|
+
"name": "Timm Stokke",
|
|
35
|
+
"email": "timm@stokke.me",
|
|
36
|
+
"url": "https://timm.stokke.me"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public",
|
|
40
|
+
"registry": "https://registry.npmjs.org/"
|
|
41
|
+
},
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/t1mmen/srtd.git"
|
|
45
|
+
},
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/t1mmen/srtd/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/t1mmen/srtd#readme",
|
|
50
|
+
"os": [
|
|
51
|
+
"darwin",
|
|
52
|
+
"linux",
|
|
53
|
+
"win32"
|
|
54
|
+
],
|
|
55
|
+
"keywords": [
|
|
56
|
+
"cli",
|
|
57
|
+
"migrations",
|
|
58
|
+
"database",
|
|
59
|
+
"postgresql",
|
|
60
|
+
"supabase",
|
|
61
|
+
"sql-templates",
|
|
62
|
+
"live-reload",
|
|
63
|
+
"hot-reload",
|
|
64
|
+
"repeatable-migrations",
|
|
65
|
+
"database-migrations",
|
|
66
|
+
"supabase-cli"
|
|
67
|
+
],
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"@inkjs/ui": "^2.0.0",
|
|
70
|
+
"chokidar": "^4.0.3",
|
|
71
|
+
"conf": "^13.1.0",
|
|
72
|
+
"glob": "^10.0.0",
|
|
73
|
+
"ink": "^5.1.0",
|
|
74
|
+
"pastel": "^3.0.0",
|
|
75
|
+
"pg": "^8.13.1",
|
|
76
|
+
"react": "^18.3.0",
|
|
77
|
+
"update-notifier": "^7.3.1",
|
|
78
|
+
"zod": "^3.24.1"
|
|
79
|
+
},
|
|
80
|
+
"devDependencies": {
|
|
81
|
+
"@biomejs/biome": "1.9.4",
|
|
82
|
+
"@changesets/cli": "^2.27.11",
|
|
83
|
+
"@sindresorhus/tsconfig": "^7.0.0",
|
|
84
|
+
"@types/glob": "^8.1.0",
|
|
85
|
+
"@types/node": "^20.17.10",
|
|
86
|
+
"@types/pg": "^8.11.10",
|
|
87
|
+
"@types/react": "^18.3.0",
|
|
88
|
+
"@types/update-notifier": "^6.0.8",
|
|
89
|
+
"@vitest/coverage-v8": "^2.1.8",
|
|
90
|
+
"chalk": "^5.4.1",
|
|
91
|
+
"ink-testing-library": "^4.0.0",
|
|
92
|
+
"lefthook": "^1.10.1",
|
|
93
|
+
"tsx": "^4.19.2",
|
|
94
|
+
"typescript": "^5.7.2",
|
|
95
|
+
"vitest": "^2.1.8"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -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,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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.setup.js","sourceRoot":"","sources":["../../../src/__tests__/vitest.setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AACvD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAEnE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE;QACN,IAAI,EAAE,GAAG,EAAE;YACT,WAAW;QACb,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,WAAW;QACb,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,WAAW;QACb,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,WAAW;QACb,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,WAAW;QACb,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,WAAW;QACb,CAAC;KACF;CACF,CAAC,CAAC,CAAC;AAEJ,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACxE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzD,uDAAuD;IACvD,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;;8BAQO,cAAc;;;;;;KAMvC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC;IACV,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,UAAU,EAAE,CAAC;AACf,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAC,cAAc,EAAC,EAAE;IAChD,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,EAAE,CAAwC,CAAC;IAC/E,OAAO;QACL,GAAG,MAAM;QACT,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACnC,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,UAAU;YAClB,WAAW,EAAE,gBAAgB;YAC7B,YAAY,EAAE,iBAAiB;YAC/B,QAAQ,EAAE,qBAAqB;YAC/B,aAAa,EAAE,2BAA2B;YAC1C,YAAY,EACV,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,yDAAyD;YACvF,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,aAAa;YACrB,iBAAiB,EAAE,IAAI;SACxB,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -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
|
|
@@ -0,0 +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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.tsx"],"names":[],"mappings":";AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,WAAW,MAAM,iBAAiB,CAAC,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC;AAElE,cAAc,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAE9C,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,IAAI;CACxB,CAAC,CAAC;AAEH,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
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):
|
|
13
|
+
export default function Apply({ options }: Props): React.JSX.Element;
|
|
13
14
|
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/commands/apply.tsx
|
|
2
|
+
import { Spinner } from '@inkjs/ui';
|
|
3
|
+
import { Box, Text, useApp, useInput } from 'ink';
|
|
4
|
+
import { option } from 'pastel';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import zod from 'zod';
|
|
7
|
+
import Branding from '../components/Branding.js';
|
|
8
|
+
import { ProcessingResults } from '../components/ProcessingResults.js';
|
|
9
|
+
import { useTemplateProcessor } from '../hooks/useTemplateProcessor.js';
|
|
10
|
+
export const options = zod.object({
|
|
11
|
+
force: zod.boolean().describe(option({
|
|
12
|
+
description: 'Force apply of all templates, irrespective of changes',
|
|
13
|
+
alias: 'f',
|
|
14
|
+
})),
|
|
15
|
+
});
|
|
16
|
+
export default function Apply({ options }) {
|
|
17
|
+
const { exit } = useApp();
|
|
18
|
+
const { result, isProcessing } = useTemplateProcessor({ force: options.force, apply: true });
|
|
19
|
+
useInput((_input, _) => {
|
|
20
|
+
if (!isProcessing) {
|
|
21
|
+
exit();
|
|
22
|
+
}
|
|
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")))));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +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,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):
|
|
16
|
+
export default function Build({ options }: Props): React.JSX.Element;
|
|
13
17
|
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// commands/build.tsx
|
|
2
|
+
import { Spinner } from '@inkjs/ui';
|
|
3
|
+
import { Box, Text, useApp, useInput } from 'ink';
|
|
4
|
+
import { option } from 'pastel';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import zod from 'zod';
|
|
7
|
+
import Branding from '../components/Branding.js';
|
|
8
|
+
import { ProcessingResults } from '../components/ProcessingResults.js';
|
|
9
|
+
import { useTemplateProcessor } from '../hooks/useTemplateProcessor.js';
|
|
10
|
+
export const options = zod.object({
|
|
11
|
+
force: zod.boolean().describe(option({
|
|
12
|
+
description: 'Force building of all templates, irrespective of changes',
|
|
13
|
+
alias: 'f',
|
|
14
|
+
})),
|
|
15
|
+
apply: zod
|
|
16
|
+
.boolean()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe(option({
|
|
19
|
+
description: 'Apply the built templates',
|
|
20
|
+
alias: 'a',
|
|
21
|
+
})),
|
|
22
|
+
});
|
|
23
|
+
export default function Build({ options }) {
|
|
24
|
+
const { exit } = useApp();
|
|
25
|
+
const { result, isProcessing } = useTemplateProcessor({
|
|
26
|
+
force: options.force,
|
|
27
|
+
generateFiles: true,
|
|
28
|
+
apply: options.apply,
|
|
29
|
+
});
|
|
30
|
+
useInput((_input, _) => {
|
|
31
|
+
if (!isProcessing) {
|
|
32
|
+
exit();
|
|
33
|
+
}
|
|
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")))));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/commands/clear.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,qBAAqB;AACrB,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,YAAY,GAAG;IACnB,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE;IACnD,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,QAAQ,EAAE;IACrD,EAAE,KAAK,EAAE,2CAA2C,EAAE,KAAK,EAAE,YAAY,EAAE;CAC5E,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,KAAK;IAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,YAAY,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,OAAO;oBACV,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC7C,MAAM;gBACR,KAAK,QAAQ;oBACX,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;oBAC9C,MAAM;gBACR,KAAK,YAAY;oBACf,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;oBACjC,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;oBAC5C,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL;QACE,oBAAC,QAAQ,IAAC,QAAQ,EAAC,0BAAgB,GAAG;QACtC,oBAAC,MAAM,IAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAI;QACxD,WAAW,CAAC,CAAC,CAAC,CACb,oBAAC,GAAG,IAAC,OAAO,EAAE,CAAC;YACb,oBAAC,OAAO,IAAC,KAAK,EAAC,cAAc,GAAG,CAC5B,CACP,CAAC,CAAC,CAAC,CACF,oBAAC,SAAS,OAAG,CACd,CACA,CACJ,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:
|
|
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))));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.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
|
|
@@ -0,0 +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,WAAW,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC1E,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,EAAE,WAAW;;YAAU,KAAK,CAAQ,CAAC;IACzD,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;YACrE,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,GAAG;gBAC9B,KAAK,EAAE,CAAC,CAAC,IAAI;aACd,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,QAAQ,IAAC,QAAQ,EAAC,oBAAoB,GAAG;YAE1C,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC;gBACT,oBAAC,IAAI;oBACF,cAAc,CAAC,MAAM;;oBAAK,OAAO,CAAC,MAAM;gCACpC;gBACP,oBAAC,IAAI,IAAC,QAAQ,qEAAgE,CAC1E;YACN,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;gBAChC,oBAAC,WAAW,IACV,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EACzC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,0BAA0B,CAAC,IAAI,CAAC,GACvD,CACE;YACL,CAAC,CAAC,YAAY,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,IAAG,YAAY,CAAQ;YACjE,CAAC,CAAC,cAAc,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAE,aAAa,IAAG,cAAc,CAAQ;YACxE,oBAAC,SAAS,OAAG,CACT,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC;QACrC,CAAC,CAAC,YAAY,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,IAAG,YAAY,CAAQ;QACjE,CAAC,CAAC,cAAc,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAE,aAAa,IAAG,cAAc,CAAQ;QACxE,oBAAC,SAAS,OAAG,CACT,CACP,CAAC;AACJ,CAAC"}
|