@t1mmen/srtd 0.0.0-next-20251227013823 → 0.0.0-next-20251227065529
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 +99 -278
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,363 +1,184 @@
|
|
|
1
|
-
# `srtd`
|
|
1
|
+
# `srtd` — Live-Reloading SQL Templates for Supabase
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
> Live-reloading SQL templates for [Supabase](https://supabase.com) projects. DX supercharged! 🚀
|
|
3
|
+
> Edit `my_function.sql` → save → it's running on your local database. No migration dance, no restart. When you're ready to ship, build to migrations that show real diffs in PRs.
|
|
6
4
|
|
|
7
5
|
[](https://www.npmjs.com/package/@t1mmen/srtd)
|
|
8
6
|
[](https://www.npmjs.com/package/@t1mmen/srtd)
|
|
9
7
|
[](https://opensource.org/licenses/MIT)
|
|
10
8
|
[](https://github.com/t1mmen/srtd/actions/workflows/ci.yml)
|
|
11
|
-
[](https://codecov.io/gh/t1mmen/srtd)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
[](./readme-demo.gif)
|
|
15
|
-
|
|
16
9
|
|
|
17
|
-
|
|
10
|
+
[](./readme-demo.gif)
|
|
18
11
|
|
|
19
|
-
**Templates act as single-source-of-truth of your database objects**, that `build` to regular SQL migrations; This makes for sane code reviews and functional change history, (e.g `git blame` works as expected).
|
|
20
12
|
|
|
13
|
+
## Why This Exists
|
|
21
14
|
|
|
22
|
-
|
|
15
|
+
Two things drove me crazy while building [Timely](https://www.timely.com)'s [Memory Engine](https://www.timely.com/memory-app) on Supabase:
|
|
23
16
|
|
|
24
|
-
|
|
17
|
+
**1. Iterating on database logic was painfully slow.**
|
|
18
|
+
Change a function → create migration → apply → hit an error → create another migration → apply → repeat. I was spending more time on migration ceremony than actual logic.
|
|
25
19
|
|
|
26
|
-
|
|
20
|
+
**2. Code reviews for database changes were useless.**
|
|
21
|
+
Every function change showed up as a complete rewrite in git. Reviewers couldn't see what actually changed. `git blame` was worthless.
|
|
27
22
|
|
|
28
|
-
|
|
29
|
-
2. Designing and iterating on database changes locally was full of friction, no matter which workflow we tried
|
|
23
|
+
After [searching](https://news.ycombinator.com/item?id=37755076) for [two years](https://news.ycombinator.com/item?id=36007640), I built `srtd`.
|
|
30
24
|
|
|
31
|
-
I spent [nearly two](https://news.ycombinator.com/item?id=37755076) [years looking](https://news.ycombinator.com/item?id=36007640) for something pre-existing, to no avail. Sufficiently fed up, I paired with [Claude](https://claude.ai) to eliminate these annoyances.
|
|
32
25
|
|
|
33
|
-
|
|
26
|
+
## How It Works
|
|
34
27
|
|
|
35
|
-
|
|
28
|
+
Your functions, views, RLS policies, and triggers live in **template files**—plain SQL that's the source of truth.
|
|
36
29
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
- **Developer Friendly**: Interactive CLI with visual feedback for all operations.
|
|
44
|
-
|
|
45
|
-
Built specifically for projects using the standard [Supabase](https://supabase.com) stack (but probably works alright for other Postgres-based projects, too).
|
|
30
|
+
```
|
|
31
|
+
supabase/migrations-templates/
|
|
32
|
+
├── notify_changes.sql
|
|
33
|
+
├── user_policies.sql
|
|
34
|
+
└── active_subscriptions.sql
|
|
35
|
+
```
|
|
46
36
|
|
|
47
|
-
|
|
37
|
+
**During development:** `srtd watch` monitors your templates. Save a file, it applies to your local database instantly. Like hot reload, but for Postgres.
|
|
48
38
|
|
|
49
|
-
|
|
39
|
+
**When you're ready to ship:** `srtd build` generates timestamped migrations from your templates.
|
|
50
40
|
|
|
51
|
-
|
|
52
|
-
|
|
41
|
+
```
|
|
42
|
+
Edit template → Instantly applies locally → Build migration → Deploy
|
|
43
|
+
```
|
|
53
44
|
|
|
54
|
-
### Installation
|
|
55
45
|
|
|
46
|
+
## Quick Start
|
|
56
47
|
|
|
57
48
|
```bash
|
|
58
|
-
# Global installation
|
|
59
49
|
npm install -g @t1mmen/srtd
|
|
60
|
-
|
|
61
|
-
# Project installation
|
|
62
|
-
npm install --save-dev @t1mmen/srtd
|
|
63
|
-
|
|
64
|
-
# Or run directly
|
|
65
|
-
npx @t1mmen/srtd
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Setup
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
50
|
cd your-supabase-project
|
|
72
|
-
npx @t1mmen/srtd init # Creates srtd.config.json, not required
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Create Your First Template
|
|
76
51
|
|
|
77
|
-
Create
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
DROP FUNCTION IF EXISTS
|
|
81
|
-
CREATE FUNCTION
|
|
82
|
-
|
|
83
|
-
BEGIN
|
|
84
|
-
-- Your function logic here
|
|
85
|
-
END;
|
|
52
|
+
# Create a template
|
|
53
|
+
mkdir -p supabase/migrations-templates
|
|
54
|
+
cat > supabase/migrations-templates/hello.sql << 'EOF'
|
|
55
|
+
DROP FUNCTION IF EXISTS hello;
|
|
56
|
+
CREATE FUNCTION hello() RETURNS text AS $$
|
|
57
|
+
BEGIN RETURN 'Hello from srtd!'; END;
|
|
86
58
|
$$ LANGUAGE plpgsql;
|
|
59
|
+
EOF
|
|
60
|
+
|
|
61
|
+
# Start watch mode
|
|
62
|
+
srtd watch
|
|
87
63
|
```
|
|
88
64
|
|
|
89
|
-
|
|
65
|
+
Edit `hello.sql`, save, and it's live on your local database. No migration file, no restart, no waiting.
|
|
90
66
|
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
npx @t1mmen/srtd watch # Changes auto-apply to local database
|
|
94
|
-
```
|
|
67
|
+
When ready to deploy:
|
|
95
68
|
|
|
96
|
-
2. When ready to deploy:
|
|
97
69
|
```bash
|
|
98
|
-
|
|
99
|
-
supabase migration up
|
|
70
|
+
srtd build # Creates supabase/migrations/20241226_srtd-hello.sql
|
|
71
|
+
supabase migration up # Deploy with Supabase CLI
|
|
100
72
|
```
|
|
101
73
|
|
|
102
|
-
> [!TIP]
|
|
103
|
-
> To reduce noise in PR's, consider adding `supabase/migrations/*srtd*.sql linguist-generated=true` to your [`.gitattributes` file.](https://docs.github.com/en/repositories/working-with-files/managing-files/customizing-how-changed-files-appear-on-github) (unless you manually edit the generated files)
|
|
104
|
-
|
|
105
74
|
|
|
106
|
-
## The
|
|
75
|
+
## The Diff Problem, Solved
|
|
107
76
|
|
|
108
|
-
Without templates,
|
|
77
|
+
Without templates, changing one line in a function means your PR shows a complete rewrite—the old `DROP` + `CREATE` replaced by a new one. Reviewers have to read the whole thing to spot your change.
|
|
109
78
|
|
|
79
|
+
With templates, your PR shows what you actually changed:
|
|
110
80
|
|
|
111
|
-
### Perfect For 🎯
|
|
112
|
-
|
|
113
|
-
✅ Database functions:
|
|
114
81
|
```diff
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
CREATE FUNCTION notify_changes()
|
|
118
|
-
RETURNS trigger AS $$
|
|
82
|
+
CREATE FUNCTION calculate_total(order_id uuid)
|
|
83
|
+
RETURNS numeric AS $$
|
|
119
84
|
BEGIN
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
json_build_object('table', TG_TABLE_NAME, 'id', NEW.id)::text
|
|
123
|
-
);
|
|
124
|
-
+ RAISE NOTICE 'Notified changes for %', TG_TABLE_NAME; -- Debug logging
|
|
125
|
-
RETURN NEW;
|
|
85
|
+
- RETURN (SELECT SUM(price) FROM order_items WHERE order_id = $1);
|
|
86
|
+
+ RETURN (SELECT SUM(price * quantity) FROM order_items WHERE order_id = $1);
|
|
126
87
|
END;
|
|
127
88
|
$$ LANGUAGE plpgsql;
|
|
128
89
|
```
|
|
129
90
|
|
|
130
|
-
|
|
131
|
-
```diff
|
|
132
|
-
-- Replace/update policies safely
|
|
133
|
-
DROP POLICY IF EXISTS "workspace_access" ON resources;
|
|
134
|
-
CREATE POLICY "workspace_access" ON resources
|
|
135
|
-
USING (workspace_id IN (
|
|
136
|
-
SELECT id FROM workspaces
|
|
137
|
-
WHERE organization_id = auth.organization_id()
|
|
138
|
-
+ AND auth.user_role() NOT IN ('pending')
|
|
139
|
-
));
|
|
140
|
-
```
|
|
91
|
+
`git blame` works. Code reviews are useful. Your database logic is treated like real code.
|
|
141
92
|
|
|
142
|
-
✅ Views for data abstraction:
|
|
143
|
-
```diff
|
|
144
|
-
CREATE OR REPLACE VIEW active_subscriptions AS
|
|
145
|
-
SELECT
|
|
146
|
-
s.*,
|
|
147
|
-
p.name as plan_name,
|
|
148
|
-
p.features
|
|
149
|
-
FROM subscriptions s
|
|
150
|
-
JOIN plans p ON p.id = s.plan_id
|
|
151
|
-
- WHERE s.status = 'active';
|
|
152
|
-
+ WHERE s.status = 'active'
|
|
153
|
-
+ AND s.expires_at > CURRENT_TIMESTAMP;
|
|
154
|
-
```
|
|
155
93
|
|
|
156
|
-
|
|
157
|
-
```diff
|
|
158
|
-
-- Revoke all first for clean state
|
|
159
|
-
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM public;
|
|
94
|
+
## Commands
|
|
160
95
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
96
|
+
| Command | What it does |
|
|
97
|
+
|---------|--------------|
|
|
98
|
+
| `srtd` | Interactive menu |
|
|
99
|
+
| `srtd watch` | Live reload—applies templates on save |
|
|
100
|
+
| `srtd build` | Generate migration files |
|
|
101
|
+
| `srtd apply` | Apply all templates once (no watch) |
|
|
102
|
+
| `srtd register` | Mark templates as already deployed |
|
|
103
|
+
| `srtd promote` | Convert `.wip` template to buildable |
|
|
104
|
+
| `srtd clear` | Reset build state |
|
|
166
105
|
|
|
167
|
-
|
|
168
|
-
```diff
|
|
169
|
-
DO $$
|
|
170
|
-
BEGIN
|
|
171
|
-
-- Add new enum values idempotently
|
|
172
|
-
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'notification_type') THEN
|
|
173
|
-
CREATE TYPE notification_type AS ENUM ('email', 'sms');
|
|
174
|
-
END IF;
|
|
175
|
-
|
|
176
|
-
-- Extend existing enum safely
|
|
177
|
-
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'push';
|
|
178
|
-
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'pusher';
|
|
179
|
-
ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'webhook';
|
|
180
|
-
+ ALTER TYPE notification_type ADD VALUE IF NOT EXISTS 'whatsapp';
|
|
181
|
-
END $$;
|
|
182
|
-
```
|
|
106
|
+
Options: `build --force` rebuilds all, `build --bundle` combines into single migration.
|
|
183
107
|
|
|
184
|
-
✅ Triggers
|
|
185
|
-
```diff
|
|
186
|
-
DROP TRIGGER IF EXISTS on_new_user ON auth.users;
|
|
187
|
-
DROP FUNCTION IF EXISTS public.setup_new_user;
|
|
188
|
-
|
|
189
|
-
CREATE FUNCTION public.setup_new_user() RETURNS TRIGGER LANGUAGE plpgsql SECURITY DEFINER
|
|
190
|
-
SET search_path = public AS $$
|
|
191
|
-
BEGIN
|
|
192
|
-
-- Existing logic for new users
|
|
193
|
-
|
|
194
|
-
+ -- Your new changes go here..
|
|
195
|
-
END;
|
|
196
|
-
$$;
|
|
197
|
-
|
|
198
|
-
CREATE TRIGGER on_new_user AFTER INSERT ON auth.users FOR EACH ROW EXECUTE PROCEDURE public.setup_new_user ();
|
|
199
|
-
```
|
|
200
108
|
|
|
201
|
-
|
|
202
|
-
> You don't need to specifying parameters in drop functions. E.g `DROP FUNCTION IF EXISTS public.my_function;`. This ensures you don't end up with multiple functions with the same name, but different parameters.
|
|
109
|
+
## What Works as Templates
|
|
203
110
|
|
|
204
|
-
|
|
205
|
-
* ❌ Table structures
|
|
206
|
-
* ❌ Indexes
|
|
207
|
-
* ❌ Data modifications
|
|
208
|
-
* ❌ Non-idempotent operations
|
|
111
|
+
Templates need to be **idempotent**—safe to run multiple times. This works great for:
|
|
209
112
|
|
|
210
|
-
|
|
113
|
+
| Object | Pattern |
|
|
114
|
+
|--------|---------|
|
|
115
|
+
| Functions | `DROP FUNCTION IF EXISTS` + `CREATE FUNCTION` |
|
|
116
|
+
| Views | `CREATE OR REPLACE VIEW` |
|
|
117
|
+
| RLS Policies | `DROP POLICY IF EXISTS` + `CREATE POLICY` |
|
|
118
|
+
| Triggers | Drop + recreate trigger and function |
|
|
119
|
+
| Roles | `REVOKE ALL` + `GRANT` |
|
|
120
|
+
| Enums | `ADD VALUE IF NOT EXISTS` |
|
|
211
121
|
|
|
122
|
+
**Not for templates:** Table structures, indexes, data modifications—use regular migrations for those.
|
|
212
123
|
|
|
213
|
-
## Commands 🎮
|
|
214
124
|
|
|
215
|
-
|
|
125
|
+
## WIP Templates
|
|
216
126
|
|
|
217
|
-
|
|
127
|
+
Experimenting? Add `.wip.sql` extension:
|
|
218
128
|
|
|
219
|
-
- 👀 `srtd watch` - Watch and auto-apply changes
|
|
220
|
-
- 🏗️ `srtd build [--force] [--bundle]` - Generate migrations from templates
|
|
221
|
-
- ▶️ `srtd apply [--force]` - Apply templates directly to local database
|
|
222
|
-
- ✍️ `srtd register [file.sql...]` - Mark templates as already built
|
|
223
|
-
- 🚀 `srtd promote - [file.sql ...]` - Promote WIP template to buildable templates
|
|
224
|
-
- 🧹 `srtd clear` - Clear build logs or reset configuration
|
|
225
|
-
|
|
226
|
-
> [!IMPORTANT]
|
|
227
|
-
> `watch` and `apply` commands modify your local database directly and don't clean up after themselves. Use with caution!
|
|
228
|
-
|
|
229
|
-
## Configuration 📝
|
|
230
|
-
|
|
231
|
-
`srtd.config.json` can be created with `init` command. It is not necessary, if the defaults suit your needs.
|
|
232
|
-
|
|
233
|
-
```jsonc
|
|
234
|
-
{
|
|
235
|
-
// Prevents building templates with this extension
|
|
236
|
-
"wipIndicator": ".wip",
|
|
237
|
-
|
|
238
|
-
// Migration file naming: 20211001000000_srtd-my_function.sql
|
|
239
|
-
"migrationPrefix": "srtd",
|
|
240
|
-
|
|
241
|
-
// Template discovery
|
|
242
|
-
"filter": "**/*.sql",
|
|
243
|
-
|
|
244
|
-
// Migration file comments
|
|
245
|
-
"banner": "You very likely **DO NOT** want to manually edit this generated file.",
|
|
246
|
-
"footer": "",
|
|
247
|
-
|
|
248
|
-
// Wrap migrations in transaction
|
|
249
|
-
"wrapInTransaction": true,
|
|
250
|
-
|
|
251
|
-
// File paths
|
|
252
|
-
"templateDir": "supabase/migrations-templates",
|
|
253
|
-
"migrationDir": "supabase/migrations",
|
|
254
|
-
"buildLog": "supabase/migrations-templates/.buildlog.json",
|
|
255
|
-
"localBuildLog": "supabase/migrations-templates/.buildlog.local.json",
|
|
256
|
-
|
|
257
|
-
// Database connection
|
|
258
|
-
"pgConnection": "postgresql://postgres:postgres@localhost:54322/postgres"
|
|
259
|
-
}
|
|
260
129
|
```
|
|
261
|
-
|
|
262
|
-
## Other Features 🔧
|
|
263
|
-
|
|
264
|
-
### Work in Progress Templates
|
|
265
|
-
|
|
266
|
-
Add `.wip.sql` extension to prevent migration generation:
|
|
267
|
-
```bash
|
|
268
|
-
my_function.wip.sql # Only applied locally, never built
|
|
130
|
+
my_experiment.wip.sql → Applies locally, never builds to migration
|
|
269
131
|
```
|
|
270
132
|
|
|
271
|
-
|
|
272
|
-
```bash
|
|
273
|
-
npx @t1mmen/srtd promote my_function.wip.sql
|
|
274
|
-
```
|
|
133
|
+
When it's ready: `srtd promote my_experiment.wip.sql`
|
|
275
134
|
|
|
276
|
-
### Register Existing Objects
|
|
277
135
|
|
|
278
|
-
|
|
136
|
+
## Existing Projects
|
|
279
137
|
|
|
280
|
-
|
|
281
|
-
# Register specific template
|
|
282
|
-
npx @t1mmen/srtd register my_function.sql another_fn.sql
|
|
138
|
+
Already have functions in your database? Create templates for them, then:
|
|
283
139
|
|
|
284
|
-
|
|
285
|
-
|
|
140
|
+
```bash
|
|
141
|
+
srtd register existing_function.sql another_one.sql
|
|
286
142
|
```
|
|
287
143
|
|
|
288
|
-
This
|
|
144
|
+
This tells srtd "these are already deployed—don't generate migrations until they change."
|
|
289
145
|
|
|
290
|
-
### Template State Management
|
|
291
146
|
|
|
292
|
-
|
|
147
|
+
## Configuration
|
|
293
148
|
|
|
294
|
-
|
|
295
|
-
- `.buildlog.local.json` - Local database state (add to `.gitignore`)
|
|
149
|
+
Defaults work for standard Supabase projects. Optional `srtd.config.json`:
|
|
296
150
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
git clone https://github.com/stokke/srtd.git
|
|
306
|
-
cd srtd
|
|
307
|
-
npm install
|
|
308
|
-
|
|
309
|
-
# Development
|
|
310
|
-
npm run dev # Watch mode
|
|
311
|
-
npm test # Run tests
|
|
312
|
-
npm start # Run CLI
|
|
313
|
-
npm start:link # Build, npm link, and run CLI
|
|
314
|
-
|
|
315
|
-
# Quality Checks
|
|
316
|
-
npm run typecheck # Type checking
|
|
317
|
-
npm run lint # Lint and fix
|
|
318
|
-
npm run format # Format code
|
|
319
|
-
npm run test:coverage # Test coverage
|
|
151
|
+
```jsonc
|
|
152
|
+
{
|
|
153
|
+
"templateDir": "supabase/migrations-templates",
|
|
154
|
+
"migrationDir": "supabase/migrations",
|
|
155
|
+
"pgConnection": "postgresql://postgres:postgres@localhost:54322/postgres",
|
|
156
|
+
"wipIndicator": ".wip",
|
|
157
|
+
"wrapInTransaction": true
|
|
158
|
+
}
|
|
320
159
|
```
|
|
321
160
|
|
|
322
|
-
## Contributing 🤝
|
|
323
|
-
|
|
324
|
-
While feature-complete for our needs, we welcome:
|
|
325
161
|
|
|
326
|
-
|
|
327
|
-
- 📚 Documentation improvements
|
|
328
|
-
- ✅ Test coverage enhancements
|
|
329
|
-
- ⚡️ Performance optimizations
|
|
162
|
+
## State Tracking
|
|
330
163
|
|
|
331
|
-
|
|
164
|
+
| File | Purpose | Git |
|
|
165
|
+
|------|---------|-----|
|
|
166
|
+
| `.buildlog.json` | What's been built to migrations | Commit |
|
|
167
|
+
| `.buildlog.local.json` | What's applied to your local DB | Gitignore |
|
|
332
168
|
|
|
333
|
-
1. Create a [changeset](https://github.com/changesets/changesets) (`npm run changeset`)
|
|
334
|
-
2. Ensure tests pass (`npm test`)
|
|
335
|
-
3. Follow existing code style
|
|
336
|
-
4. Update documentation
|
|
337
169
|
|
|
338
|
-
|
|
170
|
+
## Contributing
|
|
339
171
|
|
|
340
|
-
|
|
172
|
+
Bug fixes, docs, and test coverage welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|
341
173
|
|
|
342
|
-
|
|
343
|
-
- [Commander.js](https://github.com/tj/commander.js) - CLI framework
|
|
344
|
-
- [Inquirer](https://github.com/SBoudrias/Inquirer.js) - Interactive prompts
|
|
345
|
-
- [Ora](https://github.com/sindresorhus/ora) - Terminal spinners
|
|
346
|
-
- [Chalk](https://github.com/chalk/chalk) - Terminal styling
|
|
347
|
-
- [Figures](https://github.com/sindresorhus/figures) - Unicode symbols
|
|
174
|
+
For development: [CLAUDE.md](./CLAUDE.md).
|
|
348
175
|
|
|
349
|
-
### Core
|
|
350
|
-
- [Chokidar](https://github.com/paulmillr/chokidar) - File watcher
|
|
351
|
-
- [Zod](https://zod.dev/) - Schema validation
|
|
352
|
-
- [update-notifier](https://github.com/sindresorhus/update-notifier) - Version checks
|
|
353
176
|
|
|
177
|
+
## More
|
|
354
178
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
MIT License - see [LICENSE](LICENSE) file.
|
|
179
|
+
- [Blog post](https://timm.stokke.me/blog/srtd-live-reloading-and-sql-templates-for-supabase)
|
|
180
|
+
- [MIT License](./LICENSE)
|
|
358
181
|
|
|
359
182
|
---
|
|
360
183
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
[](https://www.buymeacoffee.com/t1mmen)
|
|
184
|
+
Built by [Timm Stokke](https://timm.stokke.me) with [Claude](https://claude.ai), after two years of being annoyed.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t1mmen/srtd",
|
|
3
|
-
"version": "0.0.0-next-
|
|
3
|
+
"version": "0.0.0-next-20251227065529",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Supabase Repeatable Template Definitions (srtd): 🪄 Live-reloading SQL templates for Supabase DX. Make your database changes reviewable and migrations maintainable! 🚀",
|
|
6
6
|
"bin": {
|