@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,101 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { encode } from "@toon-format/toon";
4
+ import yaml from "js-yaml";
5
+ import { getPullConnectionString, withReadOnlyClient } from "../../lib/database-runner";
6
+ import { discoverAndSortExtraPublicTables, pullExtraPublicTablePartition } from "../../lib/data-pull-extra-tables";
7
+ import { getFullPullManifest } from "../../lib/data-pull-manifest";
8
+ import { redactedDbUrl, snapshotTimestamp } from "./helpers";
9
+ function writeSnapshotAsset(snapDir, format, part, functionName, sqlType, logger, assetsManifest) {
10
+ const rows = part.rows;
11
+ const ext = format === "yaml" ? "yaml" : format === "toon" ? "toon" : "json";
12
+ const fileName = `${part.snapshotStem}.${ext}`;
13
+ const filePath = join(snapDir, fileName);
14
+ const payload = {
15
+ assetId: part.assetId,
16
+ function: functionName,
17
+ sqlType,
18
+ rows,
19
+ };
20
+ if (part.primaryKey?.length)
21
+ payload.primaryKey = part.primaryKey;
22
+ if (part.conflictUpdateExclude?.length)
23
+ payload.conflictUpdateExclude = part.conflictUpdateExclude;
24
+ if (part.conflictWhere)
25
+ payload.conflictWhere = part.conflictWhere;
26
+ if (part.columnUdts && Object.keys(part.columnUdts).length > 0) {
27
+ payload.columnUdts = part.columnUdts;
28
+ }
29
+ const body = format === "yaml"
30
+ ? yaml.dump(payload, { lineWidth: 120, noRefs: true })
31
+ : format === "toon"
32
+ ? `${encode(payload)}\n`
33
+ : `${JSON.stringify(payload, null, 2)}\n`;
34
+ writeFileSync(filePath, body, "utf8");
35
+ assetsManifest.push({
36
+ id: part.assetId,
37
+ file: fileName,
38
+ function: functionName,
39
+ sqlType,
40
+ rowCount: rows.length,
41
+ });
42
+ logger.info(` Wrote ${fileName} (${rows.length} rows)`);
43
+ }
44
+ export async function dataPull(instanceLabel, opts, logger) {
45
+ const url = getPullConnectionString();
46
+ const stamped = snapshotTimestamp();
47
+ const snapDir = join(process.cwd(), opts.outBaseDir, instanceLabel, stamped);
48
+ mkdirSync(snapDir, { recursive: true });
49
+ logger.info(`Snapshot directory: ${snapDir}`);
50
+ logger.info(`Source (redacted): ${redactedDbUrl(url)}`);
51
+ const ctx = {
52
+ includeUsers: opts.includeUsers,
53
+ includeSecrets: opts.includeSecrets,
54
+ };
55
+ if (!ctx.includeUsers) {
56
+ logger.info("Pull: skipping users and profile_roles_extra (--skip-users)");
57
+ }
58
+ if (!ctx.includeSecrets) {
59
+ logger.info("Pull: redacting payment_providers secrets (use --include-secrets to include)");
60
+ }
61
+ if (!opts.includeExtraTables) {
62
+ logger.info("Pull: skipping extra public.* tables (--skip-extra-tables)");
63
+ }
64
+ let pgVersion = "unknown";
65
+ const assetsManifest = [];
66
+ await withReadOnlyClient(url, async (client) => {
67
+ const v = await client.query("SELECT version() AS version");
68
+ pgVersion = v.rows[0]?.version ?? "unknown";
69
+ const seq = getFullPullManifest();
70
+ for (const entry of seq) {
71
+ if (entry.skip?.(ctx)) {
72
+ continue;
73
+ }
74
+ const partitions = await entry.fetchPartitions(client, ctx);
75
+ for (const part of partitions) {
76
+ logger.info(`Pulling ${part.assetId}…`);
77
+ writeSnapshotAsset(snapDir, opts.format, part, entry.targetName, entry.sqlType, logger, assetsManifest);
78
+ }
79
+ }
80
+ if (opts.includeExtraTables) {
81
+ const extras = await discoverAndSortExtraPublicTables(client, ctx);
82
+ logger.info(`Pulling ${extras.length} additional public table(s) (not in curated manifest)…`);
83
+ for (const table of extras) {
84
+ const part = await pullExtraPublicTablePartition(client, table);
85
+ logger.info(`Pulling ${part.assetId}…`);
86
+ writeSnapshotAsset(snapDir, opts.format, part, `public.${table}`, "table", logger, assetsManifest);
87
+ }
88
+ }
89
+ });
90
+ const manifest = {
91
+ instance: instanceLabel,
92
+ pulledAt: new Date().toISOString(),
93
+ sourceHostRedacted: redactedDbUrl(url),
94
+ pgVersion,
95
+ assets: assetsManifest,
96
+ };
97
+ const mfPath = join(snapDir, "manifest.json");
98
+ writeFileSync(mfPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
99
+ logger.info(`Wrote manifest: ${mfPath}`);
100
+ }
101
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/commands/data/pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export type DataRemoveOpts = {
3
+ outBaseDir: string;
4
+ dryRun: boolean;
5
+ };
6
+ export declare function dataRemove(instance: string, opts: DataRemoveOpts, logger: Logger): void;
7
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/data/remove.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CAChB,CAAC;AAgBF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAevF"}
@@ -0,0 +1,29 @@
1
+ import { existsSync, rmSync } from "node:fs";
2
+ import { isAbsolute, relative, resolve } from "node:path";
3
+ function resolveInstanceSnapshotRoot(outBaseDir, instance) {
4
+ const inst = instance.trim();
5
+ if (!inst || inst === "." || inst === ".." || inst.includes("/") || inst.includes("\\")) {
6
+ throw new Error(`Instance must be a simple label (e.g. laf), not a path: "${instance}"`);
7
+ }
8
+ const base = resolve(process.cwd(), outBaseDir);
9
+ const target = resolve(base, inst);
10
+ const rel = relative(base, target);
11
+ if (rel.startsWith("..") || isAbsolute(rel)) {
12
+ throw new Error(`Resolved path escapes snapshot base: ${target}`);
13
+ }
14
+ return target;
15
+ }
16
+ export function dataRemove(instance, opts, logger) {
17
+ const target = resolveInstanceSnapshotRoot(opts.outBaseDir, instance);
18
+ if (!existsSync(target)) {
19
+ logger.info(`Nothing to remove (missing): ${target}`);
20
+ return;
21
+ }
22
+ if (opts.dryRun) {
23
+ logger.info(`Dry-run: would remove recursively: ${target}`);
24
+ return;
25
+ }
26
+ rmSync(target, { recursive: true, force: true });
27
+ logger.info(`Removed: ${target}`);
28
+ }
29
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/data/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQ1D,SAAS,2BAA2B,CAAC,UAAkB,EAAE,QAAgB;IACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,4DAA4D,QAAQ,GAAG,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,IAAoB,EAAE,MAAc;IAChF,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEtE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO;IACR,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,sCAAsC,MAAM,EAAE,CAAC,CAAC;QAC5D,OAAO;IACR,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Program } from "@caporal/core";
2
+ export default function dataCommand(program: Program): void;
3
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,eAAe,CAAC;AAoB5E,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO,QAwHnD"}
@@ -0,0 +1,100 @@
1
+ import { dataPull } from "./data/pull";
2
+ import { dataApply } from "./data/apply";
3
+ import { dataRemove } from "./data/remove";
4
+ const dataHelp = `
5
+ instance data snapshots (read-only pull, apply to dev)
6
+
7
+ Usage:
8
+ blt data pull <instance> [--out DIR] [--format json|yaml|toon] [--skip-users] [--include-secrets] [--skip-extra-tables]
9
+ blt data apply <snapshotDir> [--dry-run]
10
+ blt data remove <instance> [--out DIR] [--dry-run]
11
+
12
+ Pull reads from BLT_DATA_PULL_URL (recommended) or SUPABASE_CONNECTION_STRING in a READ ONLY transaction.
13
+
14
+ Apply executes generated SQL against BLT_DATA_LOAD_URL or SUPABASE_CONNECTION_STRING — use only on disposable dev databases.
15
+
16
+ See tools/cli/README.md → "Data snapshots".
17
+ `;
18
+ export default function dataCommand(program) {
19
+ program
20
+ .command("data", "Instance data snapshot pull / apply / remove")
21
+ .help(dataHelp)
22
+ .action(() => {
23
+ console.log(dataHelp);
24
+ });
25
+ program
26
+ .command("data pull", "Export full instance-shaped snapshot (read-only)")
27
+ .hide()
28
+ .argument("<instance>", "Snapshot label / folder name (e.g. laf, staging)")
29
+ .option("-o, --out <dir>", 'Base directory for snapshots under cwd', {
30
+ default: "data-snapshots",
31
+ })
32
+ .option("-f, --format <fmt>", 'Per-asset format: json, yaml, or toon (compact LLM-oriented)', {
33
+ default: "json",
34
+ validator: ["json", "yaml", "toon"],
35
+ })
36
+ .option("--skip-users", "Omit create_user and profile_roles_extra assets (e.g. prod pulls)", {
37
+ default: false,
38
+ })
39
+ .option("--include-secrets", "Include api_key / encrypted secrets in payment_providers rows", {
40
+ default: false,
41
+ })
42
+ .option("--skip-extra-tables", "Only pull the curated manifest (omit other public.* base tables discovered in the DB)", {
43
+ default: false,
44
+ })
45
+ .action(async ({ args, options, logger, }) => {
46
+ try {
47
+ const instance = args.instance;
48
+ const fmt = options.format;
49
+ const format = fmt === "yaml" ? "yaml" : fmt === "toon" ? "toon" : "json";
50
+ await dataPull(instance, {
51
+ outBaseDir: options.out || "data-snapshots",
52
+ format,
53
+ includeUsers: !options.skipUsers,
54
+ includeSecrets: !!options.includeSecrets,
55
+ includeExtraTables: !options.skipExtraTables,
56
+ }, logger);
57
+ }
58
+ catch (error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ logger.error(`data pull failed: ${message}`);
61
+ process.exit(1);
62
+ }
63
+ });
64
+ program
65
+ .command("data apply", "Replay a snapshot bundle as SQL on the load database")
66
+ .hide()
67
+ .argument("<snapshotDir>", "Path to stamped snapshot folder (contains manifest.json)")
68
+ .option("--dry-run", "Print combined SQL instead of executing", { default: false })
69
+ .action(async ({ args, options, logger, }) => {
70
+ try {
71
+ const dir = args.snapshotDir;
72
+ await dataApply(dir, { dryRun: !!options.dryRun }, logger);
73
+ }
74
+ catch (error) {
75
+ const message = error instanceof Error ? error.message : String(error);
76
+ logger.error(`data apply failed: ${message}`);
77
+ process.exit(1);
78
+ }
79
+ });
80
+ program
81
+ .command("data remove", "Delete all snapshots for an instance under data-snapshots/<instance>")
82
+ .hide()
83
+ .argument("<instance>", "Snapshot folder label (e.g. laf) — removes every stamped run under it")
84
+ .option("-o, --out <dir>", 'Snapshot base directory under cwd (must contain <instance>/)', {
85
+ default: "data-snapshots",
86
+ })
87
+ .option("--dry-run", "Print path that would be removed without deleting", { default: false })
88
+ .action(async ({ args, options, logger, }) => {
89
+ try {
90
+ const instance = args.instance;
91
+ dataRemove(instance, { outBaseDir: options.out || "data-snapshots", dryRun: !!options.dryRun }, logger);
92
+ }
93
+ catch (error) {
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ logger.error(`data remove failed: ${message}`);
96
+ process.exit(1);
97
+ }
98
+ });
99
+ }
100
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Pull remaining `public` base tables not covered by the curated snapshot manifest
3
+ * (everything in `schema/public/sql` should exist as a table in a live DB — we discover via catalog).
4
+ */
5
+ import type { Client } from "pg";
6
+ import type { PullContext, PullPartition } from "./data-pull-manifest";
7
+ export declare function listPublicBaseTables(client: Client): Promise<string[]>;
8
+ /** Insert-safe order: parents before children (FK targets first). */
9
+ export declare function topoSortTables(client: Client, tables: string[]): Promise<string[]>;
10
+ /** Column `udt_name` map for snapshot apply (json/jsonb-aware literals). */
11
+ export declare function fetchPublicTableColumnUdts(client: Client, table: string): Promise<Record<string, string>>;
12
+ /** Columns that are `GENERATED ALWAYS AS IDENTITY` — inserts need `OVERRIDING SYSTEM VALUE` when values are supplied. */
13
+ export declare function fetchPublicTableIdentityAlwaysColumns(client: Client, table: string): Promise<string[]>;
14
+ /** Columns that are `STORED` generated (`GENERATED ALWAYS AS (...)`); inserts must omit them (values are computed). */
15
+ export declare function fetchPublicTableGeneratedStoredColumnNames(client: Client, table: string): Promise<string[]>;
16
+ export declare function pullExtraPublicTablePartition(client: Client, table: string): Promise<PullPartition>;
17
+ /** Full-row pull for curated manifest assets that need stable PKs (e.g. `items.id` for `order_items` FKs). */
18
+ export declare function dumpPublicTableForCuratedPull(client: Client, table: string): Promise<{
19
+ rows: {
20
+ row: Record<string, unknown>;
21
+ }[];
22
+ columnUdts: Record<string, string>;
23
+ primaryKey: string[];
24
+ }>;
25
+ export declare function discoverAndSortExtraPublicTables(client: Client, ctx: PullContext): Promise<string[]>;
26
+ //# sourceMappingURL=data-pull-extra-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-pull-extra-tables.d.ts","sourceRoot":"","sources":["../../src/lib/data-pull-extra-tables.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA2BvE,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAa5E;AAmBD,qEAAqE;AACrE,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCxF;AAeD,4EAA4E;AAC5E,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAG/G;AAED,yHAAyH;AACzH,wBAAsB,qCAAqC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW5G;AAED,uHAAuH;AACvH,wBAAsB,0CAA0C,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAejH;AA2CD,wBAAsB,6BAA6B,CAClD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,CAoCxB;AAED,8GAA8G;AAC9G,wBAAsB,6BAA6B,CAClD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACX,OAAO,CAAC;IACV,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC,CAOD;AAED,wBAAsB,gCAAgC,CACrD,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Pull remaining `public` base tables not covered by the curated snapshot manifest
3
+ * (everything in `schema/public/sql` should exist as a table in a live DB — we discover via catalog).
4
+ */
5
+ import { MANIFEST_COVERED_PUBLIC_TABLES } from "./data-pull-manifest";
6
+ /** Never auto-pull these (noise, huge, or not data). */
7
+ const EXTRA_TABLE_BLOCKLIST = new Set([
8
+ "spatial_ref_sys",
9
+ "geometry_columns",
10
+ "geography_columns",
11
+ "raster_columns",
12
+ "raster_overviews",
13
+ ]);
14
+ function slugTableForFilename(table) {
15
+ return table.replace(/[^a-zA-Z0-9_-]/g, "_");
16
+ }
17
+ /** Tables handled by FULL_PULL_SEQUENCE (same physical table as curated assets). */
18
+ function coveredPublicTablesForPull(ctx) {
19
+ const s = new Set(MANIFEST_COVERED_PUBLIC_TABLES);
20
+ /** User-shaped assets map to profiles / profile_roles; avoid duplicate apply. */
21
+ if (ctx.includeUsers) {
22
+ s.add("profiles");
23
+ s.add("profile_roles");
24
+ }
25
+ return s;
26
+ }
27
+ export async function listPublicBaseTables(client) {
28
+ const { rows } = await client.query(`SELECT c.relname AS t
29
+ FROM pg_class c
30
+ JOIN pg_namespace n ON n.oid = c.relnamespace
31
+ WHERE n.nspname = 'public'
32
+ AND (
33
+ (c.relkind = 'r' AND NOT c.relispartition)
34
+ OR c.relkind = 'p'
35
+ )
36
+ ORDER BY c.relname ASC`);
37
+ return rows.map((r) => r.t);
38
+ }
39
+ async function publicFkEdgesAmong(client, tableSet) {
40
+ const { rows } = await client.query(`SELECT cl.relname AS child, pf.relname AS parent
41
+ FROM pg_constraint con
42
+ JOIN pg_class cl ON cl.oid = con.conrelid
43
+ JOIN pg_namespace nl ON nl.oid = cl.relnamespace
44
+ JOIN pg_class pf ON pf.oid = con.confrelid
45
+ JOIN pg_namespace nf ON nf.oid = pf.relnamespace
46
+ WHERE con.contype = 'f'
47
+ AND nl.nspname = 'public'
48
+ AND nf.nspname = 'public'`);
49
+ return rows.filter((e) => tableSet.has(e.child) && tableSet.has(e.parent));
50
+ }
51
+ /** Insert-safe order: parents before children (FK targets first). */
52
+ export async function topoSortTables(client, tables) {
53
+ const set = new Set(tables);
54
+ if (tables.length <= 1)
55
+ return [...tables];
56
+ const edges = await publicFkEdgesAmong(client, set);
57
+ const inDeg = new Map();
58
+ for (const t of tables)
59
+ inDeg.set(t, 0);
60
+ for (const e of edges) {
61
+ if (set.has(e.child))
62
+ inDeg.set(e.child, (inDeg.get(e.child) ?? 0) + 1);
63
+ }
64
+ const q = tables.filter((t) => (inDeg.get(t) ?? 0) === 0).sort((a, b) => a.localeCompare(b));
65
+ const out = [];
66
+ while (q.length > 0) {
67
+ const t = q.shift();
68
+ if (t === undefined)
69
+ break;
70
+ out.push(t);
71
+ for (const e of edges) {
72
+ if (e.parent === t && set.has(e.child)) {
73
+ const d = (inDeg.get(e.child) ?? 1) - 1;
74
+ inDeg.set(e.child, d);
75
+ if (d === 0) {
76
+ q.push(e.child);
77
+ q.sort((a, b) => a.localeCompare(b));
78
+ }
79
+ }
80
+ }
81
+ }
82
+ if (out.length !== tables.length) {
83
+ const seen = new Set(out);
84
+ for (const t of tables.sort((a, b) => a.localeCompare(b))) {
85
+ if (!seen.has(t))
86
+ out.push(t);
87
+ }
88
+ }
89
+ return out;
90
+ }
91
+ async function listTableColumns(client, table) {
92
+ const { rows } = await client.query(`SELECT column_name, udt_name
93
+ FROM information_schema.columns
94
+ WHERE table_schema = 'public' AND table_name = $1
95
+ ORDER BY ordinal_position ASC`, [table]);
96
+ return rows.map((r) => ({ name: r.column_name, udt: r.udt_name }));
97
+ }
98
+ /** Column `udt_name` map for snapshot apply (json/jsonb-aware literals). */
99
+ export async function fetchPublicTableColumnUdts(client, table) {
100
+ const cols = await listTableColumns(client, table);
101
+ return Object.fromEntries(cols.map((c) => [c.name, c.udt]));
102
+ }
103
+ /** Columns that are `GENERATED ALWAYS AS IDENTITY` — inserts need `OVERRIDING SYSTEM VALUE` when values are supplied. */
104
+ export async function fetchPublicTableIdentityAlwaysColumns(client, table) {
105
+ const { rows } = await client.query(`SELECT column_name
106
+ FROM information_schema.columns
107
+ WHERE table_schema = 'public'
108
+ AND table_name = $1
109
+ AND is_identity = 'YES'
110
+ AND identity_generation = 'ALWAYS'`, [table]);
111
+ return rows.map((r) => r.column_name);
112
+ }
113
+ /** Columns that are `STORED` generated (`GENERATED ALWAYS AS (...)`); inserts must omit them (values are computed). */
114
+ export async function fetchPublicTableGeneratedStoredColumnNames(client, table) {
115
+ const { rows } = await client.query(`SELECT a.attname AS column_name
116
+ FROM pg_attribute a
117
+ JOIN pg_class c ON c.oid = a.attrelid
118
+ JOIN pg_namespace n ON n.oid = c.relnamespace
119
+ WHERE n.nspname = 'public'
120
+ AND c.relname = $1
121
+ AND a.attnum > 0
122
+ AND NOT a.attisdropped
123
+ AND a.attgenerated = 's'
124
+ ORDER BY a.attnum`, [table]);
125
+ return rows.map((r) => r.column_name);
126
+ }
127
+ async function primaryKeyColumns(client, table) {
128
+ const { rows } = await client.query(`SELECT a.attname
129
+ FROM pg_index i
130
+ JOIN pg_class c ON c.oid = i.indrelid
131
+ JOIN pg_namespace n ON n.oid = c.relnamespace
132
+ JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY (i.indkey)
133
+ WHERE n.nspname = 'public' AND c.relname = $1 AND i.indisprimary
134
+ ORDER BY array_position(i.indkey, a.attnum)`, [table]);
135
+ return rows.map((r) => r.attname);
136
+ }
137
+ function buildSelectList(cols) {
138
+ const parts = [];
139
+ for (const c of cols) {
140
+ const q = `"${c.name.replace(/"/g, '""')}"`;
141
+ if (c.udt === "bytea") {
142
+ parts.push(`encode(${q}, 'base64') AS ${q}`);
143
+ }
144
+ else {
145
+ parts.push(q);
146
+ }
147
+ }
148
+ return parts.join(", ");
149
+ }
150
+ function normalizeCell(column, value, udtByCol) {
151
+ if (value === null || value === undefined)
152
+ return value;
153
+ if (typeof value === "bigint")
154
+ return value.toString();
155
+ if (value instanceof Date)
156
+ return value.toISOString();
157
+ if (Buffer.isBuffer(value)) {
158
+ return value.toString("base64");
159
+ }
160
+ /** After SELECT encode(..., 'base64') for bytea, driver returns string. */
161
+ if (udtByCol.get(column) === "bytea" && typeof value === "string") {
162
+ return { __blt_bytea_b64: value };
163
+ }
164
+ return value;
165
+ }
166
+ export async function pullExtraPublicTablePartition(client, table) {
167
+ const cols = await listTableColumns(client, table);
168
+ if (cols.length === 0) {
169
+ return {
170
+ assetId: `10-900-public-${slugTableForFilename(table)}`,
171
+ snapshotStem: `10-900-public-${slugTableForFilename(table)}`,
172
+ rows: [],
173
+ };
174
+ }
175
+ const pk = await primaryKeyColumns(client, table);
176
+ const udtByCol = new Map(cols.map((c) => [c.name, c.udt]));
177
+ const selectList = buildSelectList(cols);
178
+ const orderBy = pk.length > 0 ? pk.map((c) => `"${c.replace(/"/g, '""')}" ASC`).join(", ") : `"${cols[0].name.replace(/"/g, '""')}" ASC`;
179
+ const { rows: data } = await client.query(`SELECT ${selectList} FROM public."${table.replace(/"/g, '""')}" ORDER BY ${orderBy}`);
180
+ const rrows = data.map((r) => {
181
+ const row = {};
182
+ for (const c of cols) {
183
+ row[c.name] = normalizeCell(c.name, r[c.name], udtByCol);
184
+ }
185
+ return { row };
186
+ });
187
+ const stem = `10-900-public-${slugTableForFilename(table)}`;
188
+ const columnUdts = Object.fromEntries(cols.map((c) => [c.name, c.udt]));
189
+ return {
190
+ assetId: stem,
191
+ snapshotStem: stem,
192
+ rows: rrows,
193
+ primaryKey: pk.length > 0 ? pk : undefined,
194
+ columnUdts,
195
+ };
196
+ }
197
+ /** Full-row pull for curated manifest assets that need stable PKs (e.g. `items.id` for `order_items` FKs). */
198
+ export async function dumpPublicTableForCuratedPull(client, table) {
199
+ const part = await pullExtraPublicTablePartition(client, table);
200
+ return {
201
+ rows: part.rows,
202
+ columnUdts: part.columnUdts ?? {},
203
+ primaryKey: part.primaryKey ?? [],
204
+ };
205
+ }
206
+ export async function discoverAndSortExtraPublicTables(client, ctx) {
207
+ const covered = coveredPublicTablesForPull(ctx);
208
+ const all = await listPublicBaseTables(client);
209
+ const candidates = all.filter((t) => !covered.has(t) && !EXTRA_TABLE_BLOCKLIST.has(t) && !t.startsWith("pg_"));
210
+ return topoSortTables(client, candidates);
211
+ }
212
+ //# sourceMappingURL=data-pull-extra-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-pull-extra-tables.js","sourceRoot":"","sources":["../../src/lib/data-pull-extra-tables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Manifest for `blt data pull` → rows shaped like instance YAML
3
+ * (function / procedure / table + `{ row }[]`).
4
+ */
5
+ import type { Client } from "pg";
6
+ export type SqlTargetType = "function" | "procedure" | "table";
7
+ export type SnapshotManifestAsset = {
8
+ id: string;
9
+ file: string;
10
+ /** Target name: function name, procedure name, or table name */
11
+ function: string;
12
+ sqlType?: SqlTargetType;
13
+ rowCount: number;
14
+ };
15
+ /** Written next to snapshot JSON/YAML assets */
16
+ export type SnapshotManifest = {
17
+ instance: string;
18
+ pulledAt: string;
19
+ sourceHostRedacted: string;
20
+ pgVersion: string;
21
+ schemaVersion?: string;
22
+ assets: SnapshotManifestAsset[];
23
+ };
24
+ /** One exported asset file ({stem}.{json|yaml}) */
25
+ export type SnapshotAssetFile = {
26
+ assetId: string;
27
+ function: string;
28
+ sqlType?: SqlTargetType;
29
+ primaryKey?: string[];
30
+ /** Columns to omit from `ON CONFLICT DO UPDATE SET` (e.g. keep target `id` when upserting on `provider_type`). */
31
+ conflictUpdateExclude?: string[];
32
+ /**
33
+ * SQL predicate for partial unique indexes, e.g. `location_id IS NULL`.
34
+ * Emitted as `ON CONFLICT (…) WHERE …`.
35
+ */
36
+ conflictWhere?: string;
37
+ /** `information_schema.columns.udt_name` per column (extra `public.*` dumps). */
38
+ columnUdts?: Record<string, string>;
39
+ rows: {
40
+ row: Record<string, unknown>;
41
+ }[];
42
+ };
43
+ export type PullContext = {
44
+ includeUsers: boolean;
45
+ includeSecrets: boolean;
46
+ };
47
+ /** One logical partition (one file on disk) */
48
+ export type PullPartition = {
49
+ assetId: string;
50
+ snapshotStem: string;
51
+ rows: {
52
+ row: Record<string, unknown>;
53
+ }[];
54
+ /** For generic `public.*` table dumps: UPSERT target (omit when no PK). */
55
+ primaryKey?: string[];
56
+ conflictUpdateExclude?: string[];
57
+ /** Partial unique index predicate (see `SnapshotAssetFile.conflictWhere`). */
58
+ conflictWhere?: string;
59
+ columnUdts?: Record<string, string>;
60
+ };
61
+ /** Physical `public` tables already exported by {@link FULL_PULL_SEQUENCE}. */
62
+ export declare const MANIFEST_COVERED_PUBLIC_TABLES: readonly string[];
63
+ export type PullManifestEntry = {
64
+ readonly targetName: string;
65
+ readonly sqlType: SqlTargetType;
66
+ /**
67
+ * When true, `blt data apply` truncates `truncateTable` (with other function-mode
68
+ * targets) before replay. Only used when sqlType === "function".
69
+ */
70
+ readonly needsTruncate: boolean;
71
+ readonly truncateTable?: string;
72
+ readonly skip?: (ctx: PullContext) => boolean;
73
+ readonly fetchPartitions: (client: Client, ctx: PullContext) => Promise<PullPartition[]>;
74
+ };
75
+ export declare function jsonProps(props: unknown): Record<string, unknown>;
76
+ /** FK-safe TRUNCATE order before replaying function-mode snapshot assets (child → parent) */
77
+ export declare const APPLY_TRUNCATE_TABLES: readonly string[];
78
+ /** Map snapshot function target → table truncated before replay */
79
+ export declare const SNAPSHOT_FUNCTION_TRUNCATE_TABLE: Readonly<Record<string, string>>;
80
+ export declare function sortManifestAssetsForApply<T extends {
81
+ function: string;
82
+ }>(assets: readonly T[]): T[];
83
+ /**
84
+ * Deletes existing rows for function-mode + selected table-mode snapshot targets (child-before-parent).
85
+ * Omits tables not referenced by any manifest asset so older menu-only snapshots
86
+ * do not truncate e.g. `taxes`.
87
+ */
88
+ export declare function getApplyTruncateSqlForManifest(assets: SnapshotManifestAsset[]): string;
89
+ /** Truncate all function-mode tables (full snapshot). */
90
+ export declare function getApplyTruncateSql(): string;
91
+ /** Ordered pulls: FK-safe apply order (see plan). */
92
+ export declare function getFullPullManifest(): readonly PullManifestEntry[];
93
+ /** @deprecated Use getFullPullManifest */
94
+ export declare function getMenuGraphPullManifest(): readonly PullManifestEntry[];
95
+ /** @deprecated Use getApplyTruncateSql */
96
+ export declare function getMenuGraphApplyTruncateSql(): string;
97
+ //# sourceMappingURL=data-pull-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-pull-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/data-pull-manifest.ts"],"names":[],"mappings":"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"}