@t1mmen/srtd 0.3.0 โ†’ 0.4.0

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 CHANGED
@@ -1,15 +1,19 @@
1
1
  # `srtd` ๐Ÿช„ Supabase Repeatable Template Definitions
2
2
 
3
- Live-reloading SQL templates for [Supabase](https://supabase.com) projects. DX supercharged! ๐Ÿš€
3
+
4
+
5
+ > Live-reloading SQL templates for [Supabase](https://supabase.com) projects. DX supercharged! ๐Ÿš€
4
6
 
5
7
  [![npm version](https://badge.fury.io/js/@t1mmen%2Fsrtd.svg)](https://www.npmjs.com/package/@t1mmen/srtd)
6
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
9
  [![CI/CD](https://github.com/t1mmen/srtd/actions/workflows/ci.yml/badge.svg)](https://github.com/t1mmen/srtd/actions/workflows/ci.yml)
8
10
  [![codecov](https://codecov.io/gh/t1mmen/srtd/graph/badge.svg?token=CIMAZ55KCJ)](https://codecov.io/gh/t1mmen/srtd)
9
11
 
12
+
13
+ [![screenshot of srtd](./readme-screenshot.png)](./readme-screenshot.png)
14
+
10
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.
11
16
 
12
- Built specifically for projects using the standard [Supabase](https://supabase.com) stack (but probably works alright for other Postgres-based projects, too).
13
17
 
14
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)**
15
19
 
@@ -17,7 +21,7 @@ Built specifically for projects using the standard [Supabase](https://supabase.c
17
21
 
18
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:
19
23
 
20
- 1. Code reviews were painful - function changes showed up as complete rewrites rather than helpful diffs
24
+ 1. Code reviews were painful - function changes showed up as complete rewrites, `git blame` was useless
21
25
  2. Designing and iterating on database changes locally meant constant friction, like the dance around copy-pasting into SQL console
22
26
 
23
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`.
@@ -29,6 +33,8 @@ After over a year of looking-but-not-finding a better way, I paired up with [Cla
29
33
  - **Just SQL**: Templates build as standard [Supabase](https://supabase.com) migrations when you're ready to deploy
30
34
  - **Developer Friendly**: Interactive CLI with visual feedback for all operations
31
35
 
36
+ Built specifically for projects using the standard [Supabase](https://supabase.com) stack (but probably works alright for other Postgres-based projects, too).
37
+
32
38
  ## Requirements
33
39
 
34
40
  - Node.js v20.x or higher
@@ -89,94 +95,94 @@ supabase migration up # Apply using Supabase CLI
89
95
 
90
96
  Running `srtd` without arguments opens an interactive menu:
91
97
 
92
- ```
93
- โฏ ๐Ÿ—๏ธ build - Build Supabase migrations from templates
94
- โ–ถ๏ธ apply - Apply migration templates directly to database
95
- โœ๏ธ register - Register templates as already built
96
- ๐Ÿ‘€ watch - Watch templates for changes, apply directly to database
97
- ```
98
-
99
98
  ### CLI Mode
100
99
 
101
- - ๐Ÿ—๏ธ `build [--force]` - Generate migrations from templates
102
- - โ–ถ๏ธ `apply [--force]` - Apply templates directly to local database
103
- - โœ๏ธ `register [file.sql]` - Mark templates as already built
104
- - ๐Ÿ‘€ `watch` - Watch and auto-apply changes
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
105
 
106
106
  > [!IMPORTANT]
107
107
  > `watch` and `apply` commands modify your local database directly and don't clean up after themselves. Use with caution!
108
108
 
109
- ## Perfect For ๐ŸŽฏ
109
+ ## The Power of Templates ๐Ÿ’ช
110
110
 
111
- ### Ideal Use Cases
111
+
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
+
116
+ ### Perfect For ๐ŸŽฏ
112
117
 
113
118
  โœ… Database functions:
114
- ```sql
115
- -- Reusable auth helper
116
- CREATE OR REPLACE FUNCTION auth.user_id()
117
- RETURNS uuid AS $$
118
- SELECT auth.uid()::uuid;
119
- $$ LANGUAGE sql SECURITY DEFINER;
120
-
121
- -- Event notifications
122
- CREATE OR REPLACE FUNCTION notify_changes()
123
- RETURNS trigger AS $$
124
- BEGIN
125
- PERFORM pg_notify(
126
- 'changes',
127
- json_build_object('table', TG_TABLE_NAME, 'id', NEW.id)::text
128
- );
129
- RETURN NEW;
130
- END;
131
- $$ LANGUAGE plpgsql;
119
+ ```diff
120
+ -- Event notifications
121
+ CREATE OR REPLACE FUNCTION notify_changes()
122
+ RETURNS trigger AS $$
123
+ BEGIN
124
+ PERFORM pg_notify(
125
+ 'changes',
126
+ json_build_object('table', TG_TABLE_NAME, 'id', NEW.id)::text
127
+ );
128
+ + RAISE NOTICE 'Notified changes for %', TG_TABLE_NAME; -- Debug logging
129
+ RETURN NEW;
130
+ END;
131
+ $$ LANGUAGE plpgsql;
132
132
  ```
133
133
 
134
134
  โœ… Row-Level Security (RLS):
135
- ```sql
136
- -- Replace/update policies safely
137
- DROP POLICY IF EXISTS "workspace_access" ON resources;
138
- CREATE POLICY "workspace_access" ON resources
139
- USING (workspace_id IN (
140
- SELECT id FROM workspaces
141
- WHERE organization_id = auth.organization_id()
142
- ));
135
+ ```diff
136
+ -- Replace/update policies safely
137
+ DROP POLICY IF EXISTS "workspace_access" ON resources;
138
+ CREATE POLICY "workspace_access" ON resources
139
+ USING (workspace_id IN (
140
+ SELECT id FROM workspaces
141
+ WHERE organization_id = auth.organization_id()
142
+ + AND auth.user_role() NOT IN ('pending')
143
+ ));
143
144
  ```
144
145
 
145
146
  โœ… Views for data abstraction:
146
- ```sql
147
- CREATE OR REPLACE VIEW active_subscriptions AS
148
- SELECT
149
- s.*,
150
- p.name as plan_name,
151
- p.features
152
- FROM subscriptions s
153
- JOIN plans p ON p.id = s.plan_id
154
- WHERE s.status = 'active'
155
- AND s.expires_at > CURRENT_TIMESTAMP;
147
+ ```diff
148
+ CREATE OR REPLACE VIEW active_subscriptions AS
149
+ SELECT
150
+ s.*,
151
+ p.name as plan_name,
152
+ p.features
153
+ FROM subscriptions s
154
+ JOIN plans p ON p.id = s.plan_id
155
+ - WHERE s.status = 'active';
156
+ + WHERE s.status = 'active'
157
+ + AND s.expires_at > CURRENT_TIMESTAMP;
156
158
  ```
157
159
 
158
160
  โœ… Roles and Permissions:
159
- ```sql
160
- -- Revoke all first for clean state
161
- REVOKE ALL ON ALL TABLES IN SCHEMA public FROM public;
161
+ ```diff
162
+ -- Revoke all first for clean state
163
+ REVOKE ALL ON ALL TABLES IN SCHEMA public FROM public;
162
164
 
163
- -- Grant specific access
164
- GRANT USAGE ON SCHEMA public TO authenticated;
165
- GRANT SELECT ON ALL TABLES IN SCHEMA public TO authenticated;
165
+ -- Grant specific access
166
+ GRANT USAGE ON SCHEMA public TO authenticated;
167
+ GRANT SELECT ON ALL TABLES IN SCHEMA public TO authenticated;
168
+ + GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO admin;
166
169
  ```
167
170
 
168
171
  โœ… Safe Type Extensions:
169
- ```sql
170
- DO $$
171
- BEGIN
172
- -- Add new enum values idempotently
173
- IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'notification_type') THEN
174
- CREATE TYPE notification_type AS ENUM ('email', 'sms');
175
- END IF;
176
-
177
- -- Extend existing enum safely
178
- ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'push';
179
- END $$;
172
+ ```diff
173
+ DO $$
174
+ BEGIN
175
+ -- Add new enum values idempotently
176
+ IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'notification_type') THEN
177
+ CREATE TYPE notification_type AS ENUM ('email', 'sms');
178
+ END IF;
179
+
180
+ -- Extend existing enum safely
181
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'push';
182
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'pusher';
183
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'webhook';
184
+ + ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'email';
185
+ END $$;
180
186
  ```
181
187
 
182
188
  ### Not Recommended For
@@ -188,47 +194,6 @@ END $$;
188
194
 
189
195
  Use regular [Supabase](https://supabase.com) migrations for these cases.
190
196
 
191
- ## The Power of Templates ๐Ÿ’ช
192
-
193
- Templates make code reviews meaningful. Consider this PR adding priority to a notification function:
194
-
195
- ```diff
196
- CREATE OR REPLACE FUNCTION dispatch_notification(
197
- user_id uuid,
198
- type text,
199
- payload jsonb
200
- ) RETURNS uuid AS $$
201
- DECLARE
202
- notification_id uuid;
203
- user_settings jsonb;
204
- BEGIN
205
- -- Get user notification settings
206
- SELECT settings INTO user_settings
207
- FROM user_preferences
208
- WHERE id = user_id;
209
-
210
- -- Create notification record
211
- + -- Include priority based on notification type
212
- INSERT INTO notifications (
213
- id,
214
- user_id,
215
- type,
216
- payload,
217
- + priority,
218
- created_at
219
- ) VALUES (
220
- gen_random_uuid(),
221
- dispatch_notification.user_id,
222
- type,
223
- payload,
224
- + COALESCE((SELECT priority FROM notification_types WHERE name = type), 'normal'),
225
- CURRENT_TIMESTAMP
226
- )
227
- RETURNING id INTO notification_id;
228
- ```
229
-
230
- Without templates, this would appear as a complete rewrite in your PR.
231
-
232
197
  ## Configuration ๐Ÿ“
233
198
 
234
199
  `srtd.config.json` created during initialization:
@@ -5,19 +5,35 @@ import { afterAll, beforeAll, vi } from 'vitest';
5
5
  import { connect, disconnect } from '../utils/databaseConnection.js';
6
6
  export const TEST_FN_PREFIX = 'srtd_scoped_test_func_';
7
7
  export const TEST_ROOT = join(tmpdir(), `srtd-test-${Date.now()}`);
8
- if (process.env.CI) {
9
- let consoleLogMock;
10
- beforeAll(() => {
11
- consoleLogMock = vi.spyOn(console, 'log').mockImplementation(() => {
12
- // Do nothing
13
- });
14
- });
15
- afterAll(() => {
16
- consoleLogMock.mockRestore();
17
- });
18
- }
8
+ vi.mock('../utils/logger', () => ({
9
+ logger: {
10
+ info: () => {
11
+ /** noop */
12
+ },
13
+ success: () => {
14
+ /** noop */
15
+ },
16
+ warn: () => {
17
+ /** noop */
18
+ },
19
+ error: () => {
20
+ /** noop */
21
+ },
22
+ skip: () => {
23
+ /** noop */
24
+ },
25
+ debug: () => {
26
+ /** noop */
27
+ },
28
+ },
29
+ }));
19
30
  beforeAll(async () => {
20
- await fs.mkdir(TEST_ROOT, { recursive: true });
31
+ try {
32
+ await fs.mkdir(TEST_ROOT, { recursive: true });
33
+ }
34
+ catch (error) {
35
+ console.error('Error creating test root:', error, ', retrying once.');
36
+ }
21
37
  });
22
38
  afterAll(async () => {
23
39
  await fs.rm(TEST_ROOT, { recursive: true, force: true });
@@ -26,19 +42,19 @@ afterAll(async () => {
26
42
  try {
27
43
  await client.query('BEGIN');
28
44
  await client.query(`
29
- DO $$
30
- DECLARE
31
- r record;
32
- BEGIN
33
- FOR r IN
34
- SELECT quote_ident(proname) AS func_name
35
- FROM pg_proc
36
- WHERE proname LIKE '${TEST_FN_PREFIX}%'
37
- LOOP
38
- EXECUTE 'DROP FUNCTION IF EXISTS ' || r.func_name;
39
- END LOOP;
40
- END;
41
- $$
45
+ DO $$
46
+ DECLARE
47
+ r record;
48
+ BEGIN
49
+ FOR r IN
50
+ SELECT quote_ident(proname) AS func_name
51
+ FROM pg_proc
52
+ WHERE proname LIKE '${TEST_FN_PREFIX}%'
53
+ LOOP
54
+ EXECUTE 'DROP FUNCTION IF EXISTS ' || r.func_name;
55
+ END LOOP;
56
+ END;
57
+ $$;
42
58
  `);
43
59
  await client.query('COMMIT');
44
60
  }
@@ -1 +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,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACnB,IAAI,cAA2C,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAChE,aAAa;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,cAAc,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,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;;;;;;;;gCAQS,cAAc;;;;;;KAMzC,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"}
1
+ {"version":3,"file":"vitest.setup.js","sourceRoot":"","sources":["../../src/__tests__/vitest.setup.ts"],"names":[],"mappings":"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"}
@@ -16,12 +16,20 @@ const customTheme = extendTheme(defaultTheme, {
16
16
  export default function App({ Component, commandProps }) {
17
17
  const { error } = useDatabaseConnection();
18
18
  return (React.createElement(ThemeProvider, { theme: customTheme },
19
- !!error && (React.createElement(Static, { items: [error] }, error => (React.createElement(Box, { key: error },
20
- React.createElement(Alert, { variant: "error" },
21
- React.createElement(Text, { bold: true, color: "red" },
22
- "Error:",
23
- ' '),
24
- error))))),
25
- React.createElement(Component, { ...commandProps })));
19
+ React.createElement(Box, { flexDirection: "column", padding: 1 },
20
+ !!error && (React.createElement(Static, { items: [error] }, error => (React.createElement(Box, { key: error },
21
+ React.createElement(Alert, { variant: "error" },
22
+ React.createElement(Text, { bold: true, color: "red" },
23
+ "Error:",
24
+ ' '),
25
+ error))))),
26
+ React.createElement(Component, { ...commandProps }))));
26
27
  }
28
+ // Mimick fullscreen behavior
29
+ const enterAltScreenCommand = '\x1b[?1049h';
30
+ const leaveAltScreenCommand = '\x1b[?1049l';
31
+ process.stdout.write(enterAltScreenCommand);
32
+ process.on('exit', () => {
33
+ process.stdout.write(leaveAltScreenCommand);
34
+ });
27
35
  //# 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;QAC9B,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;YACb,oBAAC,KAAK,IAAC,OAAO,EAAC,OAAO;gBACpB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK;;oBACb,GAAG,CACL;gBACN,KAAK,CACA,CACJ,CACP,CACM,CACV;QACD,oBAAC,SAAS,OAAK,YAAY,GAAI,CACjB,CACjB,CAAC;AACJ,CAAC"}
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"}
@@ -23,6 +23,7 @@ export default function Apply({ options }) {
23
23
  if (err instanceof Error) {
24
24
  exit(err);
25
25
  }
26
+ exit();
26
27
  }
27
28
  }
28
29
  void doApply();
@@ -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;YACH,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,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"}
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export default function Clear(): React.JSX.Element;
@@ -0,0 +1,45 @@
1
+ import { Select, Spinner } from '@inkjs/ui';
2
+ import Branding from 'components/Branding.js';
3
+ import Quittable from 'components/Quittable.js';
4
+ // commands/build.tsx
5
+ import { Box, useApp } from 'ink';
6
+ import React from 'react';
7
+ import { clearBuildLogs, resetConfig } from '../utils/config.js';
8
+ const clearOptions = [
9
+ { label: 'Clear local build logs', value: 'local' },
10
+ { label: 'Clear shared build logs', value: 'shared' },
11
+ { label: 'Reset config and logs to initial defaults', value: 'full_reset' },
12
+ ];
13
+ export default function Clear() {
14
+ const { exit } = useApp();
15
+ const [isResetting, setIsResetting] = React.useState(false);
16
+ const handleSelect = async (value) => {
17
+ try {
18
+ setIsResetting(true);
19
+ switch (value) {
20
+ case 'local':
21
+ await clearBuildLogs(process.cwd(), 'local');
22
+ break;
23
+ case 'shared':
24
+ await clearBuildLogs(process.cwd(), 'shared');
25
+ break;
26
+ case 'full_reset':
27
+ await resetConfig(process.cwd());
28
+ await clearBuildLogs(process.cwd(), 'both');
29
+ break;
30
+ default:
31
+ throw new Error('Invalid option');
32
+ }
33
+ exit();
34
+ }
35
+ catch (err) {
36
+ exit(err instanceof Error ? err : new Error('Unknown error occurred'));
37
+ }
38
+ };
39
+ return (React.createElement(React.Fragment, null,
40
+ React.createElement(Branding, { subtitle: "\uD83E\uDDF9 Maintenance" }),
41
+ React.createElement(Select, { options: clearOptions, onChange: handleSelect }),
42
+ isResetting ? (React.createElement(Box, { marginY: 1 },
43
+ React.createElement(Spinner, { label: "Resetting..." }))) : (React.createElement(Quittable, null))));
44
+ }
45
+ //# sourceMappingURL=clear.js.map
@@ -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"}
@@ -7,6 +7,7 @@ import Quittable from '../components/Quittable.js';
7
7
  import { useDatabaseConnection } from '../hooks/useDatabaseConnection.js';
8
8
  import Apply from './apply.js';
9
9
  import Build from './build.js';
10
+ import Clear from './clear.js';
10
11
  import Register from './register.js';
11
12
  import Watch from './watch.js';
12
13
  export default function UI() {
@@ -27,14 +28,18 @@ export default function UI() {
27
28
  if (selectedCommand === 'watch') {
28
29
  return React.createElement(Watch, null);
29
30
  }
31
+ if (selectedCommand === 'clear') {
32
+ return React.createElement(Clear, null);
33
+ }
30
34
  const menuItems = [
31
- { label: '๐Ÿ—๏ธ build - Build Supabase migrations from templates', value: 'build' },
32
- { label: 'โ–ถ๏ธ apply - Apply migration templates directly to database', value: 'apply' },
33
- { label: 'โœ๏ธ register - Register templates as already built', value: 'register' },
34
35
  {
35
- label: '๐Ÿ‘€ watch - Watch templates for changes and apply directly to database',
36
+ label: '๐Ÿ‘€ watch - Watch for changes, apply directly to db',
36
37
  value: 'watch',
37
38
  },
39
+ { label: 'โ–ถ๏ธ apply - Apply templates directly to db', value: 'apply' },
40
+ { label: '๐Ÿ—๏ธ build - Build templates as Supabase migrations', value: 'build' },
41
+ { label: 'โœ๏ธ register - Register templates as already built', value: 'register' },
42
+ { label: '๐Ÿงน maintenance - Clear build logs and reset config', value: 'clear' },
38
43
  ];
39
44
  return (React.createElement(Box, { flexDirection: "column" },
40
45
  React.createElement(Branding, 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,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,MAAM,SAAS,GAAG;QAChB,EAAE,KAAK,EAAE,sDAAsD,EAAE,KAAK,EAAE,OAAO,EAAE;QACjF,EAAE,KAAK,EAAE,2DAA2D,EAAE,KAAK,EAAE,OAAO,EAAE;QACtF,EAAE,KAAK,EAAE,mDAAmD,EAAE,KAAK,EAAE,UAAU,EAAE;QACjF;YACE,KAAK,EAAE,uEAAuE;YAC9E,KAAK,EAAE,OAAO;SACf;KACF,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":"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"}
@@ -8,7 +8,8 @@ import Quittable from '../components/Quittable.js';
8
8
  import { TimeSince } from '../components/TimeSince.js';
9
9
  import { useDatabaseConnection } from '../hooks/useDatabaseConnection.js';
10
10
  import { useTemplateManager } from '../hooks/useTemplateManager.js';
11
- const MAX_FILES = 30;
11
+ const MAX_FILES = 10;
12
+ const MAX_CHANGES = 15;
12
13
  const PATH_DISPLAY_LENGTH = 15;
13
14
  function StatBadge({ label, value, color }) {
14
15
  return (React.createElement(Box, { marginRight: 1 },
@@ -53,9 +54,23 @@ const TemplateRow = React.memo(({ template, isLatest, templateDir, }) => {
53
54
  });
54
55
  TemplateRow.displayName = 'TemplateRow';
55
56
  const UpdateLog = React.memo(({ updates, templateDir, }) => {
56
- const sortedUpdates = useMemo(() => [...updates].reverse().slice(0, 5), [updates]);
57
+ const sortedUpdates = useMemo(() => {
58
+ return [...updates]
59
+ .sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime())
60
+ .slice(0, MAX_CHANGES);
61
+ }, [updates]);
62
+ const formatError = (error) => {
63
+ if (error instanceof Error)
64
+ return error.message;
65
+ if (typeof error === 'string')
66
+ return error;
67
+ if (typeof error === 'object' && error && 'error' in error) {
68
+ return String(error.error);
69
+ }
70
+ return String(error);
71
+ };
57
72
  return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
58
- React.createElement(Text, { bold: true }, "Recent Updates:"),
73
+ React.createElement(Text, { bold: true }, "Changelog:"),
59
74
  sortedUpdates.map(update => (React.createElement(Box, { key: `${update.template.path}-${update.timestamp}`, marginLeft: 2 },
60
75
  React.createElement(Text, { color: update.type === 'error' ? 'red' : update.type === 'applied' ? 'green' : 'blue' },
61
76
  update.type === 'error' ? 'โŒ' : update.type === 'applied' ? 'โœจ' : '๐Ÿ“',
@@ -64,7 +79,7 @@ const UpdateLog = React.memo(({ updates, templateDir, }) => {
64
79
  ":",
65
80
  ' ',
66
81
  update.type === 'error'
67
- ? update.error
82
+ ? formatError(update.error)
68
83
  : update.type === 'applied'
69
84
  ? 'applied successfully'
70
85
  : 'changed and reapplied'))))));
@@ -89,27 +104,28 @@ export default function Watch() {
89
104
  return (React.createElement(Box, { flexDirection: "column" },
90
105
  React.createElement(Branding, { subtitle: "\uD83D\uDC40 Watch Mode" }),
91
106
  React.createElement(Box, { marginY: 1 },
92
- React.createElement(StatBadge, { label: "Total", value: stats.total, color: "#3ecf8e" }),
107
+ React.createElement(StatBadge, { label: "Total", value: stats.total, color: "green" }),
93
108
  stats.needsBuild > 0 && (React.createElement(StatBadge, { label: "Needs Build", value: stats.needsBuild, color: "yellow" })),
94
109
  stats.recentlyChanged > 0 && (React.createElement(StatBadge, { label: "Recent Changes", value: stats.recentlyChanged, color: "blue" })),
95
110
  hasErrors && React.createElement(StatBadge, { label: "Errors", value: stats.errors, color: "red" })),
96
111
  isLoading ? (React.createElement(Text, null, "\uD83D\uDD0D Finding templates...")) : (React.createElement(Box, { flexDirection: "column" },
97
112
  activeTemplates.map(template => (React.createElement(TemplateRow, { key: template.path, template: template, isLatest: template.path === latestPath, templateDir: templateDir }))),
98
113
  showUpdates && updates.length > 0 && (React.createElement(UpdateLog, { updates: updates, templateDir: templateDir })),
99
- !showUpdates && hasErrors && (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
114
+ hasErrors && (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
100
115
  React.createElement(Text, { bold: true, color: "red" }, "Errors:"),
101
116
  Array.from(errors.entries()).map(([path, error]) => (React.createElement(Box, { key: path, marginLeft: 2, marginTop: 1 },
102
117
  React.createElement(Text, { color: "red", wrap: "wrap" },
103
118
  formatTemplateDisplay(path, templateDir ?? ''),
104
119
  ": ",
105
- error)))))))),
120
+ String(error))))))))),
106
121
  React.createElement(Box, { marginY: 1, flexDirection: "row", gap: 1 },
107
- React.createElement(Box, { marginY: 1 },
108
- React.createElement(Text, { dimColor: true }, "press "),
109
- React.createElement(Text, { underline: showUpdates }, "u"),
110
- React.createElement(Text, { dimColor: true }, " to toggle updates")),
111
- React.createElement(Box, { marginY: 1 },
112
- React.createElement(Text, { dimColor: true }, "\u2022")),
113
- React.createElement(Quittable, null))));
122
+ React.createElement(Quittable, null),
123
+ updates.length > 0 && (React.createElement(React.Fragment, null,
124
+ React.createElement(Box, { marginY: 1 },
125
+ React.createElement(Text, { dimColor: true }, "\u2022")),
126
+ React.createElement(Box, { marginY: 1 },
127
+ React.createElement(Text, { dimColor: true }, "press "),
128
+ React.createElement(Text, { underline: showUpdates }, "u"),
129
+ React.createElement(Text, { dimColor: true }, " to toggle updates")))))));
114
130
  }
115
131
  //# sourceMappingURL=watch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.tsx"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIpE,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,SAAS,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAmD;IACzF,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAE,CAAC;QACjB,oBAAC,KAAK,IAAC,KAAK,EAAE,KAAK;YAChB,GAAG;YACH,KAAK;;YAAI,KAAK;YAAE,GAAG,CACd,CACJ,CACP,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAoB,EAAE,WAAmB;IACtE,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,OAAO,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9F,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC;YAC/D,OAAO,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,CAAC,EACC,QAAQ,EACR,QAAQ,EACR,WAAW,GAKZ,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;IAE5E,OAAO,CACL,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;QAChB,oBAAC,GAAG,IAAC,KAAK,EAAE,CAAC;YACX,oBAAC,IAAI,QAAE,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAQ,CAC7E;QACN,oBAAC,GAAG,IAAC,KAAK,EAAE,EAAE;YACZ,oBAAC,IAAI,QAAE,WAAW,CAAQ,CACtB;QACN,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,QAAQ;;gBACJ,oBAAC,SAAS,IAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,eAAe,GAAI;;gBAC/D,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa;oBACnC,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAC3D,gEAAmB,CACpB,CAAC,CAAC,CAAC,CACF;oBACG,GAAG;;oBACI,oBAAC,SAAS,IAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,aAAa,GAAI;2BAC7D,CACJ,CACI,CACH,CACF,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAC1B,CAAC,EACC,OAAO,EACP,WAAW,GAIZ,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,OAAO,CAAC,GAAG,OAAO,CAAC;aAChB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;aACjF,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,WAAW,GAAG,CAAC,KAAc,EAAE,EAAE;QACrC,IAAI,KAAK,YAAY,KAAK;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC;QACtC,oBAAC,IAAI,IAAC,IAAI,uBAAkB;QAC3B,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAC3B,oBAAC,GAAG,IAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,CAAC;YACpE,oBAAC,IAAI,IACH,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBAEpF,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;gBAAE,GAAG;gBAC3E,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC;;gBAAG,GAAG;gBACpE,MAAM,CAAC,IAAI,KAAK,OAAO;oBACtB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC3B,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;wBACzB,CAAC,CAAC,sBAAsB;wBACxB,CAAC,CAAC,uBAAuB,CACxB,CACH,CACP,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,CAAC,OAAO,UAAU,KAAK;IAC3B,MAAM,EAAE,WAAW,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAChD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAC7E,kBAAkB,EAAE,CAAC;IACvB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAElC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,0DAA2D;YAC5E,oBAAC,SAAS,OAAG,CACT,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,QAAQ,IAAC,QAAQ,EAAC,yBAAe,GAAG;QAErC,oBAAC,GAAG,IAAC,OAAO,EAAE,CAAC;YACb,oBAAC,SAAS,IAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAC,OAAO,GAAG;YAC5D,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,CACvB,oBAAC,SAAS,IAAC,KAAK,EAAC,aAAa,EAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAC,QAAQ,GAAG,CAC1E;YACA,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,CAC5B,oBAAC,SAAS,IAAC,KAAK,EAAC,gBAAgB,EAAC,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,EAAC,MAAM,GAAG,CAChF;YACA,SAAS,IAAI,oBAAC,SAAS,IAAC,KAAK,EAAC,QAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAC,KAAK,GAAG,CACvE;QAEL,SAAS,CAAC,CAAC,CAAC,CACX,oBAAC,IAAI,4CAA+B,CACrC,CAAC,CAAC,CAAC,CACF,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACxB,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC/B,oBAAC,WAAW,IACV,GAAG,EAAE,QAAQ,CAAC,IAAI,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,CAAC,IAAI,KAAK,UAAU,EACtC,WAAW,EAAE,WAAW,GACxB,CACH,CAAC;YAED,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACpC,oBAAC,SAAS,IAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAI,CAC1D;YAEA,SAAS,IAAI,CACZ,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC;gBACtC,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK,cAEf;gBACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACnD,oBAAC,GAAG,IAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;oBACzC,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM;wBAC1B,qBAAqB,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC;;wBAAI,MAAM,CAAC,KAAK,CAAC,CAC3D,CACH,CACP,CAAC,CACE,CACP,CACG,CACP;QAED,oBAAC,GAAG,IAAC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC;YACzC,oBAAC,SAAS,OAAG;YACZ,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB;gBACE,oBAAC,GAAG,IAAC,OAAO,EAAE,CAAC;oBACb,oBAAC,IAAI,IAAC,QAAQ,mBAAS,CACnB;gBACN,oBAAC,GAAG,IAAC,OAAO,EAAE,CAAC;oBACb,oBAAC,IAAI,IAAC,QAAQ,mBAAc;oBAC5B,oBAAC,IAAI,IAAC,SAAS,EAAE,WAAW,QAAU;oBACtC,oBAAC,IAAI,IAAC,QAAQ,+BAA0B,CACpC,CACL,CACJ,CACG,CACF,CACP,CAAC;AACJ,CAAC"}
@@ -4,18 +4,16 @@ export type TemplateUpdate = {
4
4
  template: TemplateStatus;
5
5
  timestamp: string;
6
6
  error?: string;
7
- path: string;
8
7
  };
9
- export interface TemplateStats {
10
- total: number;
11
- needsBuild: number;
12
- recentlyChanged: number;
13
- errors: number;
14
- }
15
8
  export interface UseTemplateManager {
16
9
  templates: TemplateStatus[];
17
10
  updates: TemplateUpdate[];
18
- stats: TemplateStats;
11
+ stats: {
12
+ total: number;
13
+ needsBuild: number;
14
+ recentlyChanged: number;
15
+ errors: number;
16
+ };
19
17
  isLoading: boolean;
20
18
  errors: Map<string, string>;
21
19
  latestPath?: string;