@codemarc/blt 1.6.4 → 1.7.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.
Files changed (43) hide show
  1. package/README.md +62 -0
  2. package/dist/blt +2 -0
  3. package/dist/blt.d.ts.map +1 -1
  4. package/dist/blt.js.map +1 -1
  5. package/dist/commands/data/apply.d.ts +6 -0
  6. package/dist/commands/data/apply.d.ts.map +1 -0
  7. package/dist/commands/data/apply.js +363 -0
  8. package/dist/commands/data/apply.js.map +1 -0
  9. package/dist/commands/data/helpers.d.ts +5 -0
  10. package/dist/commands/data/helpers.d.ts.map +1 -0
  11. package/dist/commands/data/helpers.js +19 -0
  12. package/dist/commands/data/helpers.js.map +1 -0
  13. package/dist/commands/data/pull.d.ts +11 -0
  14. package/dist/commands/data/pull.d.ts.map +1 -0
  15. package/dist/commands/data/pull.js +101 -0
  16. package/dist/commands/data/pull.js.map +1 -0
  17. package/dist/commands/data/remove.d.ts +7 -0
  18. package/dist/commands/data/remove.d.ts.map +1 -0
  19. package/dist/commands/data/remove.js +29 -0
  20. package/dist/commands/data/remove.js.map +1 -0
  21. package/dist/commands/data.d.ts +3 -0
  22. package/dist/commands/data.d.ts.map +1 -0
  23. package/dist/commands/data.js +100 -0
  24. package/dist/commands/data.js.map +1 -0
  25. package/dist/lib/data-pull-extra-tables.d.ts +26 -0
  26. package/dist/lib/data-pull-extra-tables.d.ts.map +1 -0
  27. package/dist/lib/data-pull-extra-tables.js +212 -0
  28. package/dist/lib/data-pull-extra-tables.js.map +1 -0
  29. package/dist/lib/data-pull-manifest.d.ts +97 -0
  30. package/dist/lib/data-pull-manifest.d.ts.map +1 -0
  31. package/dist/lib/data-pull-manifest.js +603 -0
  32. package/dist/lib/data-pull-manifest.js.map +1 -0
  33. package/dist/lib/database-runner.d.ts +28 -2
  34. package/dist/lib/database-runner.d.ts.map +1 -1
  35. package/dist/lib/database-runner.js +112 -49
  36. package/dist/lib/database-runner.js.map +1 -1
  37. package/dist/lib/repositories.js +4 -4
  38. package/dist/lib/repositories.js.map +1 -1
  39. package/dist/lib/yaml-converter.d.ts +25 -1
  40. package/dist/lib/yaml-converter.d.ts.map +1 -1
  41. package/dist/lib/yaml-converter.js +98 -15
  42. package/dist/lib/yaml-converter.js.map +1 -1
  43. package/package.json +2 -1
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Manifest for `blt data pull` → rows shaped like instance YAML
3
+ * (function / procedure / table + `{ row }[]`).
4
+ */
5
+ import { dumpPublicTableForCuratedPull } from "./data-pull-extra-tables";
6
+ /** Physical `public` tables already exported by {@link FULL_PULL_SEQUENCE}. */
7
+ export const MANIFEST_COVERED_PUBLIC_TABLES = [
8
+ "role_props",
9
+ "modules",
10
+ "settings",
11
+ "payment_providers",
12
+ "nodes",
13
+ "taxes",
14
+ "menus",
15
+ "categories",
16
+ "items",
17
+ "groups",
18
+ ];
19
+ // --- shared helpers ---
20
+ function num(v, fallback = 0) {
21
+ if (v === null || v === undefined)
22
+ return fallback;
23
+ if (typeof v === "number")
24
+ return v;
25
+ const n = parseInt(String(v), 10);
26
+ return Number.isNaN(n) ? fallback : n;
27
+ }
28
+ export function jsonProps(props) {
29
+ if (props === null || props === undefined)
30
+ return {};
31
+ if (typeof props === "object" && !Array.isArray(props)) {
32
+ return props;
33
+ }
34
+ return {};
35
+ }
36
+ function firstTag(props) {
37
+ const tags = props.tags;
38
+ if (Array.isArray(tags) && tags.length > 0 && typeof tags[0] === "string") {
39
+ return tags[0];
40
+ }
41
+ return "untagged";
42
+ }
43
+ function hasCategory(props) {
44
+ const c = props.category;
45
+ return Array.isArray(c) && c.length > 0;
46
+ }
47
+ const SETTINGS_KIND_MAP = {
48
+ meta: { ord: "00", slug: "meta" },
49
+ concept: { ord: "01", slug: "concept" },
50
+ location: { ord: "02", slug: "location" },
51
+ hours: { ord: "03", slug: "hours" },
52
+ branding: { ord: "04", slug: "branding" },
53
+ };
54
+ function partitionSettings(rows) {
55
+ const byKind = new Map();
56
+ for (const r of rows) {
57
+ const kind = String(r.row.kind ?? "unknown");
58
+ let bucket = byKind.get(kind);
59
+ if (!bucket) {
60
+ bucket = [];
61
+ byKind.set(kind, bucket);
62
+ }
63
+ bucket.push(r);
64
+ }
65
+ const kinds = [...byKind.keys()].sort((a, b) => {
66
+ const ma = SETTINGS_KIND_MAP[a];
67
+ const mb = SETTINGS_KIND_MAP[b];
68
+ if (ma && mb)
69
+ return ma.ord.localeCompare(mb.ord);
70
+ if (ma)
71
+ return -1;
72
+ if (mb)
73
+ return 1;
74
+ return a.localeCompare(b);
75
+ });
76
+ return kinds.map((kind) => {
77
+ const m = SETTINGS_KIND_MAP[kind] ?? {
78
+ ord: "90",
79
+ slug: kind.replace(/[^a-z0-9-]/gi, "-").toLowerCase() || "unknown",
80
+ };
81
+ const stem = `10-020-settings-${m.ord}-${m.slug}`;
82
+ return {
83
+ assetId: stem,
84
+ snapshotStem: stem,
85
+ rows: byKind.get(kind) ?? [],
86
+ };
87
+ });
88
+ }
89
+ function partitionItems(rows) {
90
+ const menu = [];
91
+ const byTag = new Map();
92
+ for (const r of rows) {
93
+ const props = jsonProps(r.row.props);
94
+ if (hasCategory(props)) {
95
+ menu.push(r);
96
+ }
97
+ else {
98
+ const tag = firstTag(props);
99
+ let bucket = byTag.get(tag);
100
+ if (!bucket) {
101
+ bucket = [];
102
+ byTag.set(tag, bucket);
103
+ }
104
+ bucket.push(r);
105
+ }
106
+ }
107
+ const out = [];
108
+ if (menu.length > 0) {
109
+ out.push({
110
+ assetId: "10-121-items-menu",
111
+ snapshotStem: "10-121-items-menu",
112
+ rows: menu,
113
+ });
114
+ }
115
+ const tags = [...byTag.keys()].sort((a, b) => a.localeCompare(b));
116
+ tags.forEach((tag, i) => {
117
+ const nn = String(i + 1).padStart(2, "0");
118
+ const stem = `10-125-items-${nn}-${tag}`;
119
+ out.push({
120
+ assetId: stem,
121
+ snapshotStem: stem,
122
+ rows: byTag.get(tag) ?? [],
123
+ });
124
+ });
125
+ return out;
126
+ }
127
+ function partitionGroups(rows) {
128
+ const byTag = new Map();
129
+ for (const r of rows) {
130
+ const props = jsonProps(r.row.props);
131
+ const tag = firstTag(props);
132
+ let bucket = byTag.get(tag);
133
+ if (!bucket) {
134
+ bucket = [];
135
+ byTag.set(tag, bucket);
136
+ }
137
+ bucket.push(r);
138
+ }
139
+ const tags = [...byTag.keys()].sort((a, b) => a.localeCompare(b));
140
+ return tags.map((tag, i) => {
141
+ const nn = String(i + 1).padStart(2, "0");
142
+ const stem = `10-135-groups-${nn}-${tag}`;
143
+ return {
144
+ assetId: stem,
145
+ snapshotStem: stem,
146
+ rows: byTag.get(tag) ?? [],
147
+ };
148
+ });
149
+ }
150
+ /** FK-safe TRUNCATE order before replaying function-mode snapshot assets (child → parent) */
151
+ export const APPLY_TRUNCATE_TABLES = [
152
+ "public.groups",
153
+ "public.items",
154
+ "public.categories",
155
+ "public.menus",
156
+ "public.taxes",
157
+ ];
158
+ /** Curated table-mode assets that replace rows in `truncateTable` before apply (same idea as {@link SNAPSHOT_FUNCTION_TRUNCATE_TABLE}). */
159
+ const SNAPSHOT_TABLE_ASSET_TRUNCATE = {
160
+ "public.items": "public.items",
161
+ };
162
+ /** Map snapshot function target → table truncated before replay */
163
+ export const SNAPSHOT_FUNCTION_TRUNCATE_TABLE = {
164
+ insert_modifier_group: "public.groups",
165
+ insert_item: "public.items",
166
+ insert_category: "public.categories",
167
+ insert_menu: "public.menus",
168
+ insert_tax: "public.taxes",
169
+ };
170
+ /**
171
+ * FK-safe replay order for `blt data apply` (ascending phase).
172
+ * Ensures `auth.users` exist before `settings.authid` upserts even when an older
173
+ * manifest listed settings before users.
174
+ */
175
+ const APPLY_ASSET_PHASE = {
176
+ role_props: 10,
177
+ modules: 20,
178
+ create_user: 30,
179
+ add_profile_role_by_email: 40,
180
+ settings: 50,
181
+ payment_providers: 55,
182
+ nodes: 58,
183
+ insert_tax: 70,
184
+ insert_menu: 80,
185
+ insert_category: 85,
186
+ /** @deprecated legacy manifests used `insert_item` (no stable ids); keep phase aligned. */
187
+ insert_item: 90,
188
+ /** Table-mode items pull (stable `id` for `order_items` and other FKs). */
189
+ "public.items": 90,
190
+ insert_modifier_group: 95,
191
+ };
192
+ export function sortManifestAssetsForApply(assets) {
193
+ return assets
194
+ .map((a, i) => ({ a, i }))
195
+ .sort((x, y) => {
196
+ const px = APPLY_ASSET_PHASE[x.a.function] ?? 500;
197
+ const py = APPLY_ASSET_PHASE[y.a.function] ?? 500;
198
+ if (px !== py)
199
+ return px - py;
200
+ return x.i - y.i;
201
+ })
202
+ .map(({ a }) => a);
203
+ }
204
+ const FULL_PULL_SEQUENCE = [
205
+ {
206
+ targetName: "role_props",
207
+ sqlType: "table",
208
+ needsTruncate: false,
209
+ fetchPartitions: async (client) => {
210
+ const { rows } = await client.query(`SELECT role, display, description, perms, props
211
+ FROM public.role_props
212
+ ORDER BY role ASC`);
213
+ const rrows = rows.map((r) => ({
214
+ row: {
215
+ role: r.role,
216
+ display: r.display,
217
+ description: r.description,
218
+ perms: r.perms ?? [],
219
+ props: jsonProps(r.props),
220
+ },
221
+ }));
222
+ return [{ assetId: "10-030-roles", snapshotStem: "10-030-roles", rows: rrows }];
223
+ },
224
+ },
225
+ {
226
+ targetName: "modules",
227
+ sqlType: "table",
228
+ needsTruncate: false,
229
+ fetchPartitions: async (client) => {
230
+ const { rows } = await client.query(`SELECT id, path, name, metadata, mgroup::text AS mgroup, mstatus::text AS mstatus, is_enabled, roles
231
+ FROM public.modules
232
+ ORDER BY path ASC`);
233
+ const rrows = rows.map((r) => ({
234
+ row: {
235
+ id: r.id,
236
+ path: r.path,
237
+ name: r.name,
238
+ metadata: jsonProps(r.metadata),
239
+ mgroup: r.mgroup,
240
+ mstatus: r.mstatus,
241
+ is_enabled: r.is_enabled,
242
+ roles: r.roles ?? [],
243
+ },
244
+ }));
245
+ return [{ assetId: "10-040-modules", snapshotStem: "10-040-modules", rows: rrows }];
246
+ },
247
+ },
248
+ {
249
+ targetName: "create_user",
250
+ sqlType: "procedure",
251
+ needsTruncate: false,
252
+ skip: (ctx) => !ctx.includeUsers,
253
+ fetchPartitions: async (client) => {
254
+ const { rows } = await client.query(`SELECT p.role::text AS role, p.name, p.phone, u.email, p.avatar, u.id AS authid
255
+ FROM public.profiles p
256
+ INNER JOIN auth.users u ON u.id = p.authid
257
+ WHERE p.deleted_at IS NULL AND u.deleted_at IS NULL
258
+ ORDER BY p.id ASC`);
259
+ const rrows = rows.map((r) => ({
260
+ row: {
261
+ p_role: r.role,
262
+ p_name: r.name ?? "",
263
+ p_phone: r.phone,
264
+ p_email: r.email,
265
+ p_pin: null,
266
+ p_avatar: r.avatar ?? "",
267
+ p_authid: r.authid,
268
+ },
269
+ }));
270
+ return [{ assetId: "10-070-users", snapshotStem: "10-070-users", rows: rrows }];
271
+ },
272
+ },
273
+ {
274
+ targetName: "add_profile_role_by_email",
275
+ sqlType: "procedure",
276
+ needsTruncate: false,
277
+ skip: (ctx) => !ctx.includeUsers,
278
+ fetchPartitions: async (client) => {
279
+ const { rows } = await client.query(`SELECT u.email AS p_email, pr.role::text AS p_role
280
+ FROM public.profile_roles pr
281
+ INNER JOIN public.profiles p ON p.id = pr.profile_id
282
+ INNER JOIN auth.users u ON u.id = p.authid
283
+ WHERE pr.is_primary = false
284
+ AND p.deleted_at IS NULL
285
+ AND (u.deleted_at IS NULL)
286
+ ORDER BY u.email ASC, pr.role::text ASC`);
287
+ const rrows = rows.map((r) => ({
288
+ row: {
289
+ p_email: r.p_email,
290
+ p_role: r.p_role,
291
+ },
292
+ }));
293
+ return [{ assetId: "10-071-profile-roles-extra", snapshotStem: "10-071-profile-roles-extra", rows: rrows }];
294
+ },
295
+ },
296
+ {
297
+ targetName: "settings",
298
+ sqlType: "table",
299
+ needsTruncate: false,
300
+ fetchPartitions: async (client, ctx) => {
301
+ const authFilter = ctx.includeUsers
302
+ ? `WHERE authid IS NULL OR authid IN (
303
+ SELECT p.authid FROM public.profiles p
304
+ INNER JOIN auth.users u ON u.id = p.authid
305
+ WHERE p.deleted_at IS NULL AND u.deleted_at IS NULL
306
+ )`
307
+ : "WHERE authid IS NULL";
308
+ const { rows } = await client.query(`SELECT id, name, kind::text AS kind, authid, props
309
+ FROM public.settings
310
+ ${authFilter}
311
+ ORDER BY kind::text ASC NULLS LAST, name ASC`);
312
+ const rrows = rows.map((r) => ({
313
+ row: {
314
+ id: r.id,
315
+ name: r.name,
316
+ kind: r.kind,
317
+ ...(r.authid != null ? { authid: r.authid } : {}),
318
+ props: jsonProps(r.props),
319
+ },
320
+ }));
321
+ return partitionSettings(rrows);
322
+ },
323
+ },
324
+ {
325
+ targetName: "payment_providers",
326
+ sqlType: "table",
327
+ needsTruncate: false,
328
+ fetchPartitions: async (client, ctx) => {
329
+ try {
330
+ const { rows } = await client.query(`SELECT id, provider_type::text AS provider_type, location_id, enabled, test_mode,
331
+ api_key, secret_key_encrypted, webhook_secret_encrypted, config,
332
+ created_at, updated_at, created_by, updated_by
333
+ FROM public.payment_providers
334
+ ORDER BY provider_type::text ASC, location_id ASC NULLS FIRST`);
335
+ const rrows = rows.map((r) => {
336
+ const row = {
337
+ id: r.id,
338
+ provider_type: r.provider_type,
339
+ location_id: r.location_id,
340
+ enabled: r.enabled,
341
+ test_mode: r.test_mode,
342
+ config: jsonProps(r.config),
343
+ created_at: typeof r.created_at === "string"
344
+ ? r.created_at
345
+ : r.created_at?.toISOString?.() ?? r.created_at,
346
+ updated_at: typeof r.updated_at === "string"
347
+ ? r.updated_at
348
+ : r.updated_at?.toISOString?.() ?? r.updated_at,
349
+ created_by: r.created_by,
350
+ updated_by: r.updated_by,
351
+ };
352
+ if (ctx.includeSecrets) {
353
+ row.api_key = r.api_key;
354
+ row.secret_key_encrypted = r.secret_key_encrypted;
355
+ row.webhook_secret_encrypted = r.webhook_secret_encrypted;
356
+ }
357
+ else {
358
+ row.api_key = null;
359
+ row.secret_key_encrypted = null;
360
+ row.webhook_secret_encrypted = null;
361
+ }
362
+ return { row };
363
+ });
364
+ const globalRows = rrows.filter((r) => r.row.location_id === null || r.row.location_id === undefined);
365
+ const scopedRows = rrows.filter((r) => r.row.location_id !== null && r.row.location_id !== undefined);
366
+ const parts = [];
367
+ if (globalRows.length > 0) {
368
+ parts.push({
369
+ assetId: "10-020-settings-04-payment-providers-global",
370
+ snapshotStem: "10-020-settings-04-payment-providers-global",
371
+ rows: globalRows,
372
+ /**
373
+ * `payment_providers_unique_provider_global`: unique (`provider_type`)
374
+ * WHERE `location_id` IS NULL — not a full unique on `provider_type`.
375
+ */
376
+ primaryKey: ["provider_type"],
377
+ conflictWhere: "location_id IS NULL",
378
+ conflictUpdateExclude: ["id"],
379
+ });
380
+ }
381
+ if (scopedRows.length > 0) {
382
+ parts.push({
383
+ assetId: "10-020-settings-04-payment-providers-scoped",
384
+ snapshotStem: "10-020-settings-04-payment-providers-scoped",
385
+ rows: scopedRows,
386
+ primaryKey: ["id"],
387
+ });
388
+ }
389
+ if (parts.length === 0) {
390
+ parts.push({
391
+ assetId: "10-020-settings-04-payment-providers-global",
392
+ snapshotStem: "10-020-settings-04-payment-providers-global",
393
+ rows: [],
394
+ });
395
+ }
396
+ return parts;
397
+ }
398
+ catch {
399
+ return [
400
+ {
401
+ assetId: "10-020-settings-04-payment-providers-global",
402
+ snapshotStem: "10-020-settings-04-payment-providers-global",
403
+ rows: [],
404
+ },
405
+ ];
406
+ }
407
+ },
408
+ },
409
+ {
410
+ targetName: "nodes",
411
+ sqlType: "table",
412
+ needsTruncate: false,
413
+ fetchPartitions: async (client) => {
414
+ const { rows } = await client.query(`SELECT id, node_code, name, display_name, description, location_id, node_type,
415
+ COALESCE(status, 'active') AS status, display_order
416
+ FROM public.nodes
417
+ ORDER BY location_id ASC, display_order ASC NULLS LAST, node_code ASC`);
418
+ const rrows = rows.map((r) => ({
419
+ row: {
420
+ id: r.id,
421
+ node_code: r.node_code,
422
+ name: r.name,
423
+ display_name: r.display_name,
424
+ description: r.description,
425
+ location_id: r.location_id,
426
+ node_type: r.node_type,
427
+ status: r.status,
428
+ display_order: num(r.display_order, 0),
429
+ },
430
+ }));
431
+ return [
432
+ {
433
+ assetId: "10-095-nodes",
434
+ snapshotStem: "10-095-nodes",
435
+ rows: rrows,
436
+ /** Targets often also have `UNIQUE (node_code)`; conflict on `id` alone fails when that code exists with another id. */
437
+ primaryKey: ["node_code"],
438
+ conflictUpdateExclude: ["id"],
439
+ },
440
+ ];
441
+ },
442
+ },
443
+ {
444
+ targetName: "insert_tax",
445
+ sqlType: "function",
446
+ needsTruncate: true,
447
+ truncateTable: "public.taxes",
448
+ fetchPartitions: async (client) => {
449
+ const { rows } = await client.query(`SELECT name, description, display_name, display_order, is_active, props
450
+ FROM public.taxes
451
+ ORDER BY display_order ASC NULLS LAST, id ASC`);
452
+ const rrows = rows.map((r) => ({
453
+ row: {
454
+ name: r.name,
455
+ description: r.description,
456
+ display_name: r.display_name,
457
+ display_order: num(r.display_order),
458
+ is_active: r.is_active,
459
+ props: jsonProps(r.props),
460
+ },
461
+ }));
462
+ return [{ assetId: "10-150-taxes", snapshotStem: "10-150-taxes", rows: rrows }];
463
+ },
464
+ },
465
+ {
466
+ targetName: "insert_menu",
467
+ sqlType: "function",
468
+ needsTruncate: true,
469
+ truncateTable: "public.menus",
470
+ fetchPartitions: async (client) => {
471
+ const { rows } = await client.query(`SELECT name, description, display_name, display_order, is_active, props
472
+ FROM public.menus
473
+ ORDER BY display_order ASC NULLS LAST, id ASC`);
474
+ const rrows = rows.map((r) => ({
475
+ row: {
476
+ p_name: r.name,
477
+ p_display_name: r.display_name,
478
+ p_description: r.description,
479
+ p_display_order: num(r.display_order),
480
+ p_is_active: r.is_active,
481
+ p_props: jsonProps(r.props),
482
+ },
483
+ }));
484
+ return [{ assetId: "10-100-menus", snapshotStem: "10-100-menus", rows: rrows }];
485
+ },
486
+ },
487
+ {
488
+ targetName: "insert_category",
489
+ sqlType: "function",
490
+ needsTruncate: true,
491
+ truncateTable: "public.categories",
492
+ fetchPartitions: async (client) => {
493
+ const { rows } = await client.query(`SELECT name, description, display_name, display_order, is_active, props
494
+ FROM public.categories
495
+ ORDER BY display_order ASC NULLS LAST, id ASC`);
496
+ const rrows = rows.map((r) => ({
497
+ row: {
498
+ name: r.name,
499
+ display_name: r.display_name,
500
+ description: r.description,
501
+ display_order: num(r.display_order),
502
+ is_active: r.is_active,
503
+ props: jsonProps(r.props),
504
+ },
505
+ }));
506
+ return [{ assetId: "10-110-categories", snapshotStem: "10-110-categories", rows: rrows }];
507
+ },
508
+ },
509
+ {
510
+ targetName: "public.items",
511
+ sqlType: "table",
512
+ needsTruncate: true,
513
+ truncateTable: "public.items",
514
+ fetchPartitions: async (client) => {
515
+ const dump = await dumpPublicTableForCuratedPull(client, "items");
516
+ const pk = dump.primaryKey.length > 0 ? dump.primaryKey : ["id"];
517
+ const columnUdts = Object.keys(dump.columnUdts).length > 0 ? dump.columnUdts : undefined;
518
+ const parts = partitionItems(dump.rows);
519
+ return parts.map((p) => ({
520
+ ...p,
521
+ primaryKey: pk,
522
+ ...(columnUdts ? { columnUdts } : {}),
523
+ }));
524
+ },
525
+ },
526
+ {
527
+ targetName: "insert_modifier_group",
528
+ sqlType: "function",
529
+ needsTruncate: true,
530
+ truncateTable: "public.groups",
531
+ fetchPartitions: async (client) => {
532
+ const { rows } = await client.query(`SELECT name, description, display_name, display_order, is_active, props
533
+ FROM public.groups
534
+ ORDER BY display_order ASC NULLS LAST, id ASC`);
535
+ const rrows = rows.map((r) => ({
536
+ row: {
537
+ name: r.name,
538
+ description: r.description,
539
+ display_name: r.display_name,
540
+ display_order: num(r.display_order),
541
+ is_active: r.is_active,
542
+ props: jsonProps(r.props),
543
+ },
544
+ }));
545
+ return partitionGroups(rrows);
546
+ },
547
+ },
548
+ ];
549
+ /**
550
+ * Deletes existing rows for function-mode + selected table-mode snapshot targets (child-before-parent).
551
+ * Omits tables not referenced by any manifest asset so older menu-only snapshots
552
+ * do not truncate e.g. `taxes`.
553
+ */
554
+ export function getApplyTruncateSqlForManifest(assets) {
555
+ const needed = new Set();
556
+ for (const a of assets) {
557
+ const sqlType = a.sqlType ?? "function";
558
+ if (sqlType === "function") {
559
+ const table = SNAPSHOT_FUNCTION_TRUNCATE_TABLE[a.function];
560
+ if (table)
561
+ needed.add(table);
562
+ }
563
+ if (sqlType === "table") {
564
+ const table = SNAPSHOT_TABLE_ASSET_TRUNCATE[a.function];
565
+ if (table)
566
+ needed.add(table);
567
+ }
568
+ }
569
+ const ordered = APPLY_TRUNCATE_TABLES.filter((t) => needed.has(t));
570
+ if (ordered.length === 0)
571
+ return "";
572
+ return [
573
+ `-- Replace function-mode snapshot targets present in this manifest: truncate before replay.`,
574
+ `-- CASCADE removes rows in tables with FKs to these tables.`,
575
+ `TRUNCATE TABLE`,
576
+ ordered.map((t) => ` ${t}`).join(",\n"),
577
+ `RESTART IDENTITY CASCADE;`,
578
+ ``,
579
+ ].join("\n");
580
+ }
581
+ /** Truncate all function-mode tables (full snapshot). */
582
+ export function getApplyTruncateSql() {
583
+ return getApplyTruncateSqlForManifest(Object.entries(SNAPSHOT_FUNCTION_TRUNCATE_TABLE).map(([fn]) => ({
584
+ id: fn,
585
+ file: "",
586
+ function: fn,
587
+ sqlType: "function",
588
+ rowCount: 0,
589
+ })));
590
+ }
591
+ /** Ordered pulls: FK-safe apply order (see plan). */
592
+ export function getFullPullManifest() {
593
+ return FULL_PULL_SEQUENCE;
594
+ }
595
+ /** @deprecated Use getFullPullManifest */
596
+ export function getMenuGraphPullManifest() {
597
+ return FULL_PULL_SEQUENCE;
598
+ }
599
+ /** @deprecated Use getApplyTruncateSql */
600
+ export function getMenuGraphApplyTruncateSql() {
601
+ return getApplyTruncateSql();
602
+ }
603
+ //# sourceMappingURL=data-pull-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-pull-manifest.js","sourceRoot":"","sources":["../../src/lib/data-pull-manifest.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,38 @@
1
+ import pg from "pg";
1
2
  import { type SqlFile } from "./constants";
2
3
  /**
3
4
  * Get the latest SQL file from the dist directory
4
5
  */
5
6
  export declare function getLatestSqlFile(): SqlFile;
7
+ export interface RunSqlMeta {
8
+ readonly name: string;
9
+ readonly path: string;
10
+ readonly version: string;
11
+ }
6
12
  /**
7
- * Execute a SQL file against the database
13
+ * Execute ad-hoc SQL (e.g. snapshot apply bundle).
8
14
  */
9
- export declare function runSqlFile(filePath?: string): Promise<void>;
15
+ export declare function runSqlContent(sqlContent: string, meta: RunSqlMeta, connectionOverride?: string): Promise<void>;
16
+ /**
17
+ * Execute a SQL file against the database.
18
+ * Uses BLT_DATA_LOAD_URL when set (dev snapshot apply), otherwise SUPABASE_CONNECTION_STRING.
19
+ */
20
+ export declare function runSqlFile(filePath?: string, connectionOverride?: string): Promise<void>;
21
+ export declare function requireConnectionString(envHint: string): string;
22
+ /**
23
+ * Postgres URL used for snapshot pulls (`blt data pull`).
24
+ * Prefer a read replica or READ ONLY role—not a production superuser.
25
+ */
26
+ export declare function getPullConnectionString(): string;
27
+ /**
28
+ * Postgres URL used to apply snapshots (`blt data apply`).
29
+ * Defaults to SUPABASE_CONNECTION_STRING if BLT_DATA_LOAD_URL is unset.
30
+ */
31
+ export declare function getLoadConnectionString(): string;
32
+ /**
33
+ * Run queries inside BEGIN READ ONLY / COMMIT. No DML.
34
+ */
35
+ export declare function withReadOnlyClient<T>(connectionString: string, run: (client: pg.Client) => Promise<T>): Promise<T>;
10
36
  /**
11
37
  * Execute a SQL query and return results
12
38
  */
@@ -1 +1 @@
1
- {"version":3,"file":"database-runner.d.ts","sourceRoot":"","sources":["../../src/lib/database-runner.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/D;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAqC1C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuHjE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAoCvE"}
1
+ {"version":3,"file":"database-runner.d.ts","sourceRoot":"","sources":["../../src/lib/database-runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/D;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAqC1C;AAiBD,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,EAChB,kBAAkB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CA4Ef;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC/B,QAAQ,CAAC,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAWD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAU/D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAWhD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAWhD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACzC,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAqBvE"}