@rebasepro/server-postgres 0.17.3 → 0.18.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 (149) hide show
  1. package/LICENSE +0 -1
  2. package/README.md +31 -0
  3. package/dist/backup-argv.d.ts +19 -0
  4. package/dist/branch-argv.d.ts +28 -0
  5. package/dist/branch-prune.d.ts +77 -0
  6. package/dist/cli-collections-path.d.ts +31 -0
  7. package/dist/cli-errors.d.ts +123 -0
  8. package/dist/cli-flags.d.ts +101 -0
  9. package/dist/cli-helpers.d.ts +94 -10
  10. package/dist/collection-index-C7LopMyX.js +247 -0
  11. package/dist/collection-index-C7LopMyX.js.map +1 -0
  12. package/dist/databasePoolManager.d.ts +27 -0
  13. package/dist/{ensure-collection-policies-UCqgv_8c.js → ensure-collection-policies-CagOzEPS.js} +6 -6
  14. package/dist/{ensure-collection-policies-UCqgv_8c.js.map → ensure-collection-policies-CagOzEPS.js.map} +1 -1
  15. package/dist/{ensure-collection-tables-DgVixhX3.js → ensure-collection-tables-DbAhrjnG.js} +614 -52
  16. package/dist/ensure-collection-tables-DbAhrjnG.js.map +1 -0
  17. package/dist/index.d.ts +12 -0
  18. package/dist/index.es.js +19307 -3059
  19. package/dist/index.es.js.map +1 -1
  20. package/dist/{rls-enforcement-DvAbL9YJ.js → rls-enforcement-ClJoTboT.js} +53 -189
  21. package/dist/rls-enforcement-ClJoTboT.js.map +1 -0
  22. package/dist/schema/column-type-drift.d.ts +79 -0
  23. package/dist/schema/doctor.d.ts +42 -0
  24. package/dist/schema/ensure-collection-tables.d.ts +90 -0
  25. package/dist/schema/generate-next-step.d.ts +30 -0
  26. package/dist/schema/generate-postgres-ddl-logic.d.ts +28 -0
  27. package/dist/schema/generated-schema-staleness.d.ts +37 -0
  28. package/dist/schema/introspect-db-queries.d.ts +34 -0
  29. package/dist/security/rls-enforcement.d.ts +63 -2
  30. package/dist/services/BranchService.d.ts +86 -1
  31. package/dist/services/collection-helpers.d.ts +1 -1
  32. package/dist/services/realtimeService.d.ts +30 -2
  33. package/dist/services/row-pipeline.d.ts +12 -1
  34. package/dist/utils/pg-error-utils.d.ts +3 -1
  35. package/dist/utils/pg-numeric-number-patch.d.ts +31 -0
  36. package/package.json +32 -27
  37. package/dist/backup-service-DCk7KhhL.js +0 -9044
  38. package/dist/backup-service-DCk7KhhL.js.map +0 -1
  39. package/dist/collection-index-BRUg10H5.js +0 -5690
  40. package/dist/collection-index-BRUg10H5.js.map +0 -1
  41. package/dist/connection-GOKU3Hu5.js +0 -277
  42. package/dist/connection-GOKU3Hu5.js.map +0 -1
  43. package/dist/ensure-collection-tables-DgVixhX3.js.map +0 -1
  44. package/dist/rls-bootstrap-sql-B5C9LoJ6.js +0 -244
  45. package/dist/rls-bootstrap-sql-B5C9LoJ6.js.map +0 -1
  46. package/dist/rls-enforcement-DvAbL9YJ.js.map +0 -1
  47. package/dist/src-DiB5RP2Z.js +0 -541
  48. package/dist/src-DiB5RP2Z.js.map +0 -1
  49. package/dist/websocket-BZ4H5wUz.js +0 -8198
  50. package/dist/websocket-BZ4H5wUz.js.map +0 -1
  51. package/src/PostgresAdapter.ts +0 -91
  52. package/src/PostgresBackendDriver.ts +0 -1857
  53. package/src/PostgresBootstrapper.ts +0 -1157
  54. package/src/auth/ensure-tables.ts +0 -896
  55. package/src/auth/schema-version.ts +0 -260
  56. package/src/auth/services.ts +0 -1610
  57. package/src/backup/backup-cli.ts +0 -520
  58. package/src/backup/backup-cron.ts +0 -212
  59. package/src/backup/backup-logic.ts +0 -93
  60. package/src/backup/backup-service.ts +0 -485
  61. package/src/backup/index.ts +0 -12
  62. package/src/backup/pg-tools.ts +0 -403
  63. package/src/backup/retention.ts +0 -86
  64. package/src/cli-errors.ts +0 -265
  65. package/src/cli-helpers.ts +0 -569
  66. package/src/cli-output.ts +0 -43
  67. package/src/cli.ts +0 -1339
  68. package/src/collections/PostgresCollectionRegistry.ts +0 -108
  69. package/src/collections/buildRegistry.ts +0 -68
  70. package/src/collections/validate-relations.ts +0 -402
  71. package/src/connection.ts +0 -333
  72. package/src/data-transformer.ts +0 -845
  73. package/src/databasePoolManager.ts +0 -95
  74. package/src/history/HistoryService.ts +0 -254
  75. package/src/history/ensure-history-table.ts +0 -53
  76. package/src/index.ts +0 -19
  77. package/src/interfaces.ts +0 -60
  78. package/src/module-dir.ts +0 -7
  79. package/src/schema/atlas-argv.ts +0 -94
  80. package/src/schema/auth-schema.ts +0 -298
  81. package/src/schema/auth-users-columns.ts +0 -131
  82. package/src/schema/carved-out-migration.ts +0 -404
  83. package/src/schema/classify-change.ts +0 -436
  84. package/src/schema/collection-index.ts +0 -427
  85. package/src/schema/collections-schema-version.ts +0 -103
  86. package/src/schema/destructive-sql.ts +0 -94
  87. package/src/schema/doctor-cli.ts +0 -66
  88. package/src/schema/doctor-policy-checks.ts +0 -105
  89. package/src/schema/doctor.ts +0 -837
  90. package/src/schema/drizzle-ddl.ts +0 -33
  91. package/src/schema/dynamic-tables.test.ts +0 -302
  92. package/src/schema/dynamic-tables.ts +0 -293
  93. package/src/schema/ensure-collection-policies.ts +0 -198
  94. package/src/schema/ensure-collection-tables.test.ts +0 -518
  95. package/src/schema/ensure-collection-tables.ts +0 -1267
  96. package/src/schema/generate-drizzle-schema-logic.ts +0 -957
  97. package/src/schema/generate-drizzle-schema.ts +0 -143
  98. package/src/schema/generate-postgres-ddl-logic.ts +0 -1339
  99. package/src/schema/generate-postgres-ddl.ts +0 -180
  100. package/src/schema/generate-schema-commit.ts +0 -267
  101. package/src/schema/generated-schema-staleness.ts +0 -284
  102. package/src/schema/introspect-db-constraints.ts +0 -385
  103. package/src/schema/introspect-db-inference.ts +0 -255
  104. package/src/schema/introspect-db-logic.ts +0 -1387
  105. package/src/schema/introspect-db-naming.ts +0 -15
  106. package/src/schema/introspect-db-project.ts +0 -78
  107. package/src/schema/introspect-db-queries.ts +0 -326
  108. package/src/schema/introspect-db-structure.ts +0 -670
  109. package/src/schema/introspect-db-types.ts +0 -56
  110. package/src/schema/introspect-db.ts +0 -257
  111. package/src/schema/introspect-runtime.test.ts +0 -260
  112. package/src/schema/introspect-runtime.ts +0 -327
  113. package/src/schema/non-sql-collections.test.ts +0 -131
  114. package/src/schema/rls-bootstrap-sql.ts +0 -288
  115. package/src/schema/search-column.ts +0 -643
  116. package/src/schema/test-schema.ts +0 -11
  117. package/src/schema/vector-index.ts +0 -491
  118. package/src/security/anonymous-grants.test.ts +0 -73
  119. package/src/security/policy-drift.test.ts +0 -435
  120. package/src/security/policy-drift.ts +0 -473
  121. package/src/security/rls-enforcement.ts +0 -505
  122. package/src/services/BranchService.ts +0 -326
  123. package/src/services/FetchService.ts +0 -2115
  124. package/src/services/PersistService.ts +0 -557
  125. package/src/services/RelationService.ts +0 -978
  126. package/src/services/RelationWriteService.ts +0 -653
  127. package/src/services/cdc/CdcListener.ts +0 -103
  128. package/src/services/cdc/junction-tables.ts +0 -91
  129. package/src/services/cdc/trigger-cdc.ts +0 -173
  130. package/src/services/channel-bus/ChannelBus.ts +0 -44
  131. package/src/services/channel-bus/PostgresChannelBus.ts +0 -299
  132. package/src/services/channel-bus/index.ts +0 -114
  133. package/src/services/channel-history.ts +0 -424
  134. package/src/services/channel-presence.ts +0 -185
  135. package/src/services/collection-helpers.ts +0 -420
  136. package/src/services/dataService.ts +0 -256
  137. package/src/services/index.ts +0 -14
  138. package/src/services/junction-writes.ts +0 -295
  139. package/src/services/nested-path.ts +0 -145
  140. package/src/services/pg-notify-listener.ts +0 -151
  141. package/src/services/realtimeService.ts +0 -2545
  142. package/src/services/row-pipeline.ts +0 -240
  143. package/src/services/write-denial.ts +0 -55
  144. package/src/types.ts +0 -4
  145. package/src/utils/connection-string.ts +0 -58
  146. package/src/utils/drizzle-conditions.ts +0 -2743
  147. package/src/utils/pg-array-null-patch.ts +0 -42
  148. package/src/utils/pg-error-utils.ts +0 -391
  149. package/src/websocket.ts +0 -855
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * CLI entry point for `rebase doctor`.
4
- * Invoked via tsx by the server-postgres CLI plugin.
5
- */
6
- import path from "path";
7
- import chalk from "chalk";
8
- import { runDoctor } from "./doctor";
9
- import { exitCodeForPolicyGate, runPolicyChecks } from "./doctor-policy-checks";
10
-
11
- async function main() {
12
- const collectionsArg = process.argv.find((a) => a.startsWith("--collections="));
13
- const schemaArg = process.argv.find((a) => a.startsWith("--schema="));
14
- const sdkArg = process.argv.find((a) => a.startsWith("--sdk="));
15
- // --policies runs only the RLS checks: no schema diff, no SDK types. Useful
16
- // as a CI gate against a deployed database, where the collection files and
17
- // generated schema are not what you are asking about.
18
- const policiesOnly = process.argv.includes("--policies");
19
-
20
- const collectionsPath = collectionsArg?.split("=")[1] ?? path.join("..", "config", "collections");
21
- const schemaPath = schemaArg?.split("=")[1] ?? path.join("src", "schema.generated.ts");
22
- const sdkPath = sdkArg?.split("=")[1] ?? path.join("..", "generated", "sdk", "database.types.ts");
23
-
24
- // Load .env
25
- try {
26
- const dotenv = await import("dotenv");
27
- const envPath = process.env.DOTENV_CONFIG_PATH;
28
- if (envPath) {
29
- dotenv.config({ path: envPath, quiet: true });
30
- } else {
31
- dotenv.config({ quiet: true });
32
- }
33
- } catch {
34
- // dotenv may not be installed
35
- }
36
-
37
- const databaseUrl = process.env.DATABASE_URL || process.env.ADMIN_CONNECTION_STRING;
38
-
39
- if (policiesOnly) {
40
- // Non-zero so this can gate CI — the whole point of the flag, and a
41
- // check that could not run has not passed. See exitCodeForPolicyGate.
42
- process.exit(exitCodeForPolicyGate(await runPolicyChecks(collectionsPath, databaseUrl)));
43
- }
44
-
45
- const report = await runDoctor({
46
- collectionsPath: path.resolve(process.cwd(), collectionsPath),
47
- schemaPath: path.resolve(process.cwd(), schemaPath),
48
- sdkPath: path.resolve(process.cwd(), sdkPath),
49
- databaseUrl: databaseUrl ?? undefined
50
- });
51
-
52
- const policyStatus = await runPolicyChecks(collectionsPath, databaseUrl);
53
-
54
- // Exit non-zero if there are errors. A policy run that could not happen is
55
- // reported loudly above but does not fail the interactive command — the
56
- // same treatment the skipped database phase gets. `--policies` is the gate,
57
- // and that one fails closed.
58
- if (report.summary.errors > 0 || policyStatus === "problems") {
59
- process.exit(1);
60
- }
61
- }
62
-
63
- main().catch((err) => {
64
- console.error(chalk.red(" ✗ Doctor failed"), err instanceof Error ? (err.stack ?? err.message) : String(err));
65
- process.exit(1);
66
- });
@@ -1,105 +0,0 @@
1
- /**
2
- * The RLS half of `rebase doctor`, and the exit code `--policies` gates CI on.
3
- *
4
- * Lives beside `doctor-cli.ts` rather than inside it because that file runs
5
- * `main()` on import: a gate whose failure modes cannot be unit-tested is how
6
- * this one shipped reporting success for work it never did.
7
- */
8
- import path from "path";
9
- import chalk from "chalk";
10
- import { CollectionConfig } from "@rebasepro/types";
11
- import { loadCollections } from "./doctor";
12
- import { checkPolicyDrift, formatPolicyDrift, hasDrift } from "../security/policy-drift";
13
- import { validatePolicyPgRoles, warnOnAnonymousGrants } from "../security/rls-enforcement";
14
-
15
- /**
16
- * What the RLS checks concluded.
17
- *
18
- * `unchecked` exists because "we could not look" and "we looked and it is fine"
19
- * used to be reported identically: a collections path that did not resolve made
20
- * the loader return `[]` (it warns, it does not throw), `checkPolicyDrift`
21
- * early-returned an empty diff, and the gate printed
22
- * `✓ RLS policies match your collections` having compared zero policies against
23
- * zero collections. Any exception at all — a collection file that throws on
24
- * import, a `pg_policies` read the CI role is not granted, a connection reset —
25
- * did the same thing through a `warn`, and exited 0.
26
- */
27
- export type PolicyCheckStatus = "ok" | "problems" | "unchecked";
28
-
29
- /**
30
- * The exit code for `rebase doctor --policies`.
31
- *
32
- * A gate that could not run has not passed. Only a completed, clean check
33
- * exits 0 — anything else, including "we never opened a connection", is a
34
- * failure, or the flag certifies a database nobody looked at.
35
- */
36
- export function exitCodeForPolicyGate(status: PolicyCheckStatus): 0 | 1 {
37
- return status === "ok" ? 0 : 1;
38
- }
39
-
40
- /**
41
- * Policies actually deployed vs the ones the collections describe, plus policy
42
- * roles this server could never satisfy.
43
- *
44
- * Never reports `ok` for work it did not do — see {@link PolicyCheckStatus}.
45
- */
46
- export async function runPolicyChecks(collectionsPath: string, databaseUrl?: string): Promise<PolicyCheckStatus> {
47
- if (!databaseUrl) {
48
- console.error(chalk.yellow(" ⚠ No DATABASE_URL — RLS policies were NOT checked"));
49
- return "unchecked";
50
- }
51
-
52
- const resolvedPath = path.resolve(process.cwd(), collectionsPath);
53
- let problems = false;
54
- const { Pool } = await import("pg");
55
- const pool = new Pool({ connectionString: databaseUrl });
56
- try {
57
- const collections: CollectionConfig[] = await loadCollections(resolvedPath);
58
-
59
- // Zero collections is not "no drift", it is nothing to compare. The
60
- // loader returns `[]` for a path that does not exist, so the commonest
61
- // way to get here is a `--collections` path resolved against the wrong
62
- // directory — which used to render as a green tick.
63
- if (collections.length === 0) {
64
- console.error(chalk.red(` ✗ No collections found in ${resolvedPath}`));
65
- console.error(chalk.gray(" RLS policies were NOT checked. Pass --collections=<dir> if your collections live elsewhere."));
66
- return "unchecked";
67
- }
68
-
69
- const runSql = async (text: string) => (await pool.query(text)).rows as Record<string, unknown>[];
70
-
71
- // A policy naming a role the server never runs as filters every row, so
72
- // the collection reads as empty. Report it without booting a server.
73
- try {
74
- await validatePolicyPgRoles(runSql, collections as never);
75
- console.log(chalk.green(" ✓ Policy roles are usable by this server"));
76
- } catch (err) {
77
- problems = true;
78
- console.log("");
79
- console.error(chalk.red(err instanceof Error ? err.message : String(err)));
80
- }
81
-
82
- // A rule that reads as a lockdown but is true for every caller compiles
83
- // to a grant. Report it without booting a server.
84
- warnOnAnonymousGrants(collections as never);
85
-
86
- const drift = await checkPolicyDrift(pool as never, collections);
87
- console.log("");
88
- if (hasDrift(drift)) {
89
- problems = true;
90
- console.log(chalk.yellow(" RLS policies: database does not match your collections"));
91
- console.log(formatPolicyDrift(drift));
92
- } else {
93
- console.log(chalk.green(` ✓ RLS policies match your collections (${collections.length} collection(s) checked)`));
94
- }
95
- } catch (err) {
96
- // Fail closed. This catch covers every query and every collection import
97
- // above, so returning the pre-catch verdict made the documented CI gate
98
- // green on exactly the runs it exists to catch.
99
- console.error(chalk.red(" ✗ Could not check RLS policies:"), err instanceof Error ? err.message : String(err));
100
- return "unchecked";
101
- } finally {
102
- await pool.end();
103
- }
104
- return problems ? "problems" : "ok";
105
- }