@supatype/cli 0.1.5 → 0.1.7

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 (247) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +143 -93
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/deno.d.ts +52 -0
  5. package/dist/augmentation-generator.d.ts +22 -0
  6. package/dist/augmentation-generator.d.ts.map +1 -1
  7. package/dist/augmentation-generator.js +43 -7
  8. package/dist/augmentation-generator.js.map +1 -1
  9. package/dist/binary-cache.d.ts +14 -0
  10. package/dist/binary-cache.d.ts.map +1 -1
  11. package/dist/binary-cache.js +33 -13
  12. package/dist/binary-cache.js.map +1 -1
  13. package/dist/cache-clean.d.ts +15 -0
  14. package/dist/cache-clean.d.ts.map +1 -0
  15. package/dist/cache-clean.js +76 -0
  16. package/dist/cache-clean.js.map +1 -0
  17. package/dist/cache-pins.d.ts +51 -0
  18. package/dist/cache-pins.d.ts.map +1 -0
  19. package/dist/cache-pins.js +184 -0
  20. package/dist/cache-pins.js.map +1 -0
  21. package/dist/cli-install-method.d.ts +19 -0
  22. package/dist/cli-install-method.d.ts.map +1 -0
  23. package/dist/cli-install-method.js +60 -0
  24. package/dist/cli-install-method.js.map +1 -0
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +6 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/cloud-credentials.d.ts +34 -0
  29. package/dist/cloud-credentials.d.ts.map +1 -0
  30. package/dist/cloud-credentials.js +139 -0
  31. package/dist/cloud-credentials.js.map +1 -0
  32. package/dist/commands/admin.d.ts +11 -0
  33. package/dist/commands/admin.d.ts.map +1 -1
  34. package/dist/commands/admin.js +131 -22
  35. package/dist/commands/admin.js.map +1 -1
  36. package/dist/commands/cache.d.ts.map +1 -1
  37. package/dist/commands/cache.js +67 -71
  38. package/dist/commands/cache.js.map +1 -1
  39. package/dist/commands/cloud.d.ts.map +1 -1
  40. package/dist/commands/cloud.js +32 -8
  41. package/dist/commands/cloud.js.map +1 -1
  42. package/dist/commands/db.d.ts +1 -0
  43. package/dist/commands/db.d.ts.map +1 -1
  44. package/dist/commands/db.js +147 -1
  45. package/dist/commands/db.js.map +1 -1
  46. package/dist/commands/dev.d.ts.map +1 -1
  47. package/dist/commands/dev.js +50 -10
  48. package/dist/commands/dev.js.map +1 -1
  49. package/dist/commands/doctor.d.ts +28 -0
  50. package/dist/commands/doctor.d.ts.map +1 -1
  51. package/dist/commands/doctor.js +60 -3
  52. package/dist/commands/doctor.js.map +1 -1
  53. package/dist/commands/functions.d.ts +7 -0
  54. package/dist/commands/functions.d.ts.map +1 -1
  55. package/dist/commands/functions.js +40 -6
  56. package/dist/commands/functions.js.map +1 -1
  57. package/dist/commands/generate.d.ts.map +1 -1
  58. package/dist/commands/generate.js +5 -1
  59. package/dist/commands/generate.js.map +1 -1
  60. package/dist/commands/hooks.d.ts +12 -0
  61. package/dist/commands/hooks.d.ts.map +1 -0
  62. package/dist/commands/hooks.js +118 -0
  63. package/dist/commands/hooks.js.map +1 -0
  64. package/dist/commands/init.d.ts.map +1 -1
  65. package/dist/commands/init.js +41 -7
  66. package/dist/commands/init.js.map +1 -1
  67. package/dist/commands/internal.d.ts +6 -0
  68. package/dist/commands/internal.d.ts.map +1 -0
  69. package/dist/commands/internal.js +22 -0
  70. package/dist/commands/internal.js.map +1 -0
  71. package/dist/commands/keys.d.ts.map +1 -1
  72. package/dist/commands/keys.js +2 -0
  73. package/dist/commands/keys.js.map +1 -1
  74. package/dist/commands/link-helpers.d.ts.map +1 -1
  75. package/dist/commands/link-helpers.js +8 -2
  76. package/dist/commands/link-helpers.js.map +1 -1
  77. package/dist/commands/login.d.ts +7 -0
  78. package/dist/commands/login.d.ts.map +1 -0
  79. package/dist/commands/login.js +110 -0
  80. package/dist/commands/login.js.map +1 -0
  81. package/dist/commands/push.d.ts.map +1 -1
  82. package/dist/commands/push.js +110 -7
  83. package/dist/commands/push.js.map +1 -1
  84. package/dist/commands/self-update.d.ts +7 -0
  85. package/dist/commands/self-update.d.ts.map +1 -1
  86. package/dist/commands/self-update.js +18 -11
  87. package/dist/commands/self-update.js.map +1 -1
  88. package/dist/config.d.ts.map +1 -1
  89. package/dist/config.js +18 -3
  90. package/dist/config.js.map +1 -1
  91. package/dist/db-preflight.d.ts +78 -0
  92. package/dist/db-preflight.d.ts.map +1 -0
  93. package/dist/db-preflight.js +452 -0
  94. package/dist/db-preflight.js.map +1 -0
  95. package/dist/dev-compose.d.ts +1 -1
  96. package/dist/dev-compose.d.ts.map +1 -1
  97. package/dist/dev-compose.js +129 -72
  98. package/dist/dev-compose.js.map +1 -1
  99. package/dist/env-file.d.ts +40 -2
  100. package/dist/env-file.d.ts.map +1 -1
  101. package/dist/env-file.js +132 -11
  102. package/dist/env-file.js.map +1 -1
  103. package/dist/field-masking-tier.d.ts +50 -0
  104. package/dist/field-masking-tier.d.ts.map +1 -0
  105. package/dist/field-masking-tier.js +91 -0
  106. package/dist/field-masking-tier.js.map +1 -0
  107. package/dist/functions-deno-types.d.ts +24 -0
  108. package/dist/functions-deno-types.d.ts.map +1 -0
  109. package/dist/functions-deno-types.js +155 -0
  110. package/dist/functions-deno-types.js.map +1 -0
  111. package/dist/hook-upload.d.ts +30 -0
  112. package/dist/hook-upload.d.ts.map +1 -0
  113. package/dist/hook-upload.js +86 -0
  114. package/dist/hook-upload.js.map +1 -0
  115. package/dist/hooks-generator.d.ts +8 -0
  116. package/dist/hooks-generator.d.ts.map +1 -0
  117. package/dist/hooks-generator.js +332 -0
  118. package/dist/hooks-generator.js.map +1 -0
  119. package/dist/link.d.ts +4 -0
  120. package/dist/link.d.ts.map +1 -1
  121. package/dist/link.js +2 -0
  122. package/dist/link.js.map +1 -1
  123. package/dist/local-secrets.d.ts +71 -0
  124. package/dist/local-secrets.d.ts.map +1 -0
  125. package/dist/local-secrets.js +100 -0
  126. package/dist/local-secrets.js.map +1 -0
  127. package/dist/model-hooks.d.ts +73 -0
  128. package/dist/model-hooks.d.ts.map +1 -0
  129. package/dist/model-hooks.js +211 -0
  130. package/dist/model-hooks.js.map +1 -0
  131. package/dist/postgres-ctl.d.ts +11 -0
  132. package/dist/postgres-ctl.d.ts.map +1 -1
  133. package/dist/postgres-ctl.js +25 -2
  134. package/dist/postgres-ctl.js.map +1 -1
  135. package/dist/project-config.d.ts +121 -1
  136. package/dist/project-config.d.ts.map +1 -1
  137. package/dist/project-config.js +150 -1
  138. package/dist/project-config.js.map +1 -1
  139. package/dist/resolve-target.d.ts +4 -0
  140. package/dist/resolve-target.d.ts.map +1 -1
  141. package/dist/resolve-target.js +69 -73
  142. package/dist/resolve-target.js.map +1 -1
  143. package/dist/schema-ast-v2.d.ts +2 -1
  144. package/dist/schema-ast-v2.d.ts.map +1 -1
  145. package/dist/schema-ast-v2.js +4 -2
  146. package/dist/schema-ast-v2.js.map +1 -1
  147. package/dist/schema-push-lock.d.ts.map +1 -1
  148. package/dist/schema-push-lock.js +43 -16
  149. package/dist/schema-push-lock.js.map +1 -1
  150. package/dist/self-host-compose.d.ts +24 -0
  151. package/dist/self-host-compose.d.ts.map +1 -1
  152. package/dist/self-host-compose.js +301 -69
  153. package/dist/self-host-compose.js.map +1 -1
  154. package/dist/service-role-check.d.ts +21 -0
  155. package/dist/service-role-check.d.ts.map +1 -0
  156. package/dist/service-role-check.js +85 -0
  157. package/dist/service-role-check.js.map +1 -0
  158. package/dist/target-client.d.ts +17 -0
  159. package/dist/target-client.d.ts.map +1 -1
  160. package/dist/target-client.js +69 -17
  161. package/dist/target-client.js.map +1 -1
  162. package/dist/type-extractor.d.ts.map +1 -1
  163. package/dist/type-extractor.js +736 -32
  164. package/dist/type-extractor.js.map +1 -1
  165. package/dist/ui/runtime/command-chrome.js +1 -1
  166. package/dist/ui/runtime/command-chrome.js.map +1 -1
  167. package/dist/ui/runtime/stdin-after-ink.d.ts.map +1 -1
  168. package/dist/ui/runtime/stdin-after-ink.js +3 -1
  169. package/dist/ui/runtime/stdin-after-ink.js.map +1 -1
  170. package/package.json +4 -1
  171. package/scripts/generate-homebrew-formula.mjs +121 -0
  172. package/src/augmentation-generator.ts +46 -9
  173. package/src/binary-cache.ts +47 -15
  174. package/src/cache-clean.ts +81 -0
  175. package/src/cache-pins.ts +243 -0
  176. package/src/cli-install-method.ts +67 -0
  177. package/src/cli.ts +6 -0
  178. package/src/cloud-credentials.ts +183 -0
  179. package/src/commands/admin.ts +153 -28
  180. package/src/commands/cache.ts +90 -75
  181. package/src/commands/cloud.ts +32 -8
  182. package/src/commands/db.ts +162 -1
  183. package/src/commands/dev.ts +57 -8
  184. package/src/commands/doctor.ts +69 -3
  185. package/src/commands/functions.ts +42 -5
  186. package/src/commands/generate.ts +5 -1
  187. package/src/commands/hooks.ts +138 -0
  188. package/src/commands/init.ts +42 -8
  189. package/src/commands/internal.ts +23 -0
  190. package/src/commands/keys.ts +2 -0
  191. package/src/commands/link-helpers.ts +9 -2
  192. package/src/commands/login.ts +127 -0
  193. package/src/commands/push.ts +124 -7
  194. package/src/commands/self-update.ts +85 -13
  195. package/src/config.ts +22 -3
  196. package/src/db-preflight.ts +575 -0
  197. package/src/dev-compose.ts +144 -73
  198. package/src/env-file.ts +157 -11
  199. package/src/field-masking-tier.ts +107 -0
  200. package/src/functions-deno-types.ts +188 -0
  201. package/src/hook-upload.ts +107 -0
  202. package/src/hooks-generator.ts +352 -0
  203. package/src/link.ts +7 -0
  204. package/src/local-secrets.ts +104 -0
  205. package/src/model-hooks.ts +260 -0
  206. package/src/postgres-ctl.ts +29 -2
  207. package/src/project-config.ts +236 -2
  208. package/src/resolve-target.ts +113 -68
  209. package/src/schema-ast-v2.ts +5 -2
  210. package/src/schema-push-lock.ts +56 -17
  211. package/src/self-host-compose.ts +344 -68
  212. package/src/service-role-check.ts +111 -0
  213. package/src/target-client.ts +105 -18
  214. package/src/type-extractor.ts +883 -28
  215. package/src/ui/runtime/command-chrome.ts +1 -1
  216. package/src/ui/runtime/stdin-after-ink.ts +3 -1
  217. package/tests/access-composition.test.ts +667 -0
  218. package/tests/admin-studio-membership.test.ts +121 -0
  219. package/tests/api-schemas.test.ts +83 -0
  220. package/tests/archive-name-alias.test.ts +42 -0
  221. package/tests/augmentation-generator.test.ts +72 -4
  222. package/tests/cache-clean.test.ts +206 -0
  223. package/tests/cli-help.test.ts +3 -0
  224. package/tests/cli-install-method.test.ts +66 -0
  225. package/tests/command-chrome-coverage.test.ts +31 -26
  226. package/tests/command-chrome-wrap.test.ts +1 -0
  227. package/tests/db-preflight.test.ts +72 -0
  228. package/tests/doctor-render.test.ts +62 -0
  229. package/tests/doctor-service-role.test.ts +55 -0
  230. package/tests/env-file.test.ts +121 -0
  231. package/tests/external-database-compose.test.ts +184 -0
  232. package/tests/external-database-config.test.ts +154 -0
  233. package/tests/field-masking-tier.test.ts +184 -0
  234. package/tests/functions-deno-types.test.ts +197 -0
  235. package/tests/homebrew-formula.test.ts +58 -0
  236. package/tests/hook-upload.test.ts +125 -0
  237. package/tests/hooks-generator.test.ts +212 -0
  238. package/tests/init.test.ts +3 -0
  239. package/tests/local-secrets.test.ts +92 -0
  240. package/tests/model-hooks.test.ts +322 -0
  241. package/tests/runtime-contract.test.ts +113 -1
  242. package/tests/service-role-check.test.ts +109 -0
  243. package/tests/service-role-routes.test.ts +51 -0
  244. package/tests/target-client-refresh.test.ts +94 -0
  245. package/tests/type-extractor.test.ts +187 -0
  246. package/tsconfig.tsbuildinfo +1 -1
  247. package/tests/engine-distribution.test.ts +0 -418
@@ -0,0 +1,73 @@
1
+ export interface DeclaredHook {
2
+ model: string;
3
+ event: string;
4
+ function: string;
5
+ }
6
+ /** Every hook declared across the schema, in a stable order for reporting. */
7
+ export declare function declaredHooks(ast: unknown): DeclaredHook[];
8
+ /**
9
+ * Lines describing every hook whose function is missing, empty when all resolve.
10
+ *
11
+ * Returns the message rather than throwing so the caller decides how to fail: `push` stops, while
12
+ * `doctor` can report several problems at once.
13
+ */
14
+ export declare function validateModelHooks(ast: unknown, functionsDir: string, cwd: string): string[];
15
+ /**
16
+ * Write `functions/_supatype/hooks.ts`, or remove a stale one when no hooks remain.
17
+ *
18
+ * Removal matters as much as writing: deleting the last hook from a schema should leave no typed
19
+ * module behind claiming tables are hooked, and a handler importing it should start failing to
20
+ * compile rather than sitting there dead.
21
+ *
22
+ * Returns the project-relative path written, or null when there was nothing to write.
23
+ */
24
+ export declare function writeHooksModule(cwd: string, functionsDir: string, ast: unknown): string | null;
25
+ /** Per-table hook config, in the shape `proxy.RouteManifest` reads. */
26
+ export interface ManifestHookEntry {
27
+ function: string;
28
+ timeout?: number;
29
+ onUnavailable?: "reject" | "log";
30
+ }
31
+ /**
32
+ * The hook map for `.supatype/manifest.json`, keyed by **table name** — because that is what the
33
+ * server matches a request path against, not the model name.
34
+ *
35
+ * Defaults are resolved here rather than in the server: one place decides that a `before*` hook
36
+ * rejects when it cannot be reached and an `after*` hook only logs, so the two implementations
37
+ * cannot disagree about the safe direction.
38
+ */
39
+ export declare function manifestHooks(ast: unknown): Record<string, Record<string, ManifestHookEntry>>;
40
+ /** Well below the 10s edge-function ceiling, so a hung hook fails fast instead of holding a slot. */
41
+ export declare const DEFAULT_HOOK_TIMEOUT_MS = 2000;
42
+ /**
43
+ * Merge the hook map into an existing `.supatype/manifest.json`.
44
+ *
45
+ * **Only updates a manifest that is already there.** Creating one from scratch here would be a
46
+ * hazard: `functions_enabled` is a plain bool on the server's side, so a manifest carrying only
47
+ * hooks would read as functions *disabled* — the exact defect this repo fixed a commit ago, arriving
48
+ * by a different door. The compose path owns creation; this owns one key.
49
+ *
50
+ * Returns true when the file was rewritten.
51
+ */
52
+ export declare function syncManifestHooks(cwd: string, ast: unknown): boolean;
53
+ export interface HooksReport {
54
+ declared: DeclaredHook[];
55
+ /** Hooks whose function directory is missing. */
56
+ missing: DeclaredHook[];
57
+ /** True when a manifest exists and says the functions subsystem is off. */
58
+ functionsDisabled: boolean;
59
+ /** True when a manifest exists but carries no hook map, so the server has nothing to call. */
60
+ mapMissing: boolean;
61
+ }
62
+ /**
63
+ * What `supatype doctor` needs to answer "will my hooks actually run?".
64
+ *
65
+ * Local facts only — the schema, the functions on disk, and the manifest the server reads. No probe
66
+ * of a running worker, so the answer is the same whether or not the stack is up, and a report that
67
+ * needs a stack is a report nobody runs before deploying.
68
+ *
69
+ * The case worth catching: hooks declared while `functions_enabled` is false. Nothing fails, no error
70
+ * appears, and every hook silently never fires.
71
+ */
72
+ export declare function hooksReport(cwd: string, functionsDir: string, ast: unknown): HooksReport;
73
+ //# sourceMappingURL=model-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-hooks.d.ts","sourceRoot":"","sources":["../src/model-hooks.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,EAAE,CAqB1D;AAeD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,GACV,MAAM,EAAE,CAoBV;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAa/F;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAoC7F;AAED,qGAAqG;AACrG,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAE3C;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAwBpE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,iDAAiD;IACjD,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,2EAA2E;IAC3E,iBAAiB,EAAE,OAAO,CAAA;IAC1B,8FAA8F;IAC9F,UAAU,EAAE,OAAO,CAAA;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,WAAW,CAkCxF"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Validate the lifecycle hooks a schema declares against the functions that exist.
3
+ *
4
+ * A hook names a function directory. If the name is wrong, the honest failure is at push time with
5
+ * the path we searched — not at runtime, where the symptom is a hook that never fires and a write
6
+ * that quietly succeeds unvalidated. That silence is the whole reason this check exists.
7
+ *
8
+ * Kept out of the extractor on purpose: resolving the functions directory needs the project config,
9
+ * and the extractor is a leaf that reads type syntax and nothing else.
10
+ */
11
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
12
+ import { join, relative } from "node:path";
13
+ import { generateHooksModule } from "./hooks-generator.js";
14
+ /** Every hook declared across the schema, in a stable order for reporting. */
15
+ export function declaredHooks(ast) {
16
+ const models = ast?.models;
17
+ if (!Array.isArray(models))
18
+ return [];
19
+ const out = [];
20
+ for (const model of models) {
21
+ const shaped = model;
22
+ const hooks = shaped.annotations?.platform?.hooks;
23
+ if (typeof hooks !== "object" || hooks === null)
24
+ continue;
25
+ for (const [event, value] of Object.entries(hooks)) {
26
+ const fn = value?.function;
27
+ if (typeof fn === "string" && fn.length > 0) {
28
+ out.push({ model: shaped.name ?? "?", event, function: fn });
29
+ }
30
+ }
31
+ }
32
+ return out.sort((a, b) => `${a.model}.${a.event}`.localeCompare(`${b.model}.${b.event}`));
33
+ }
34
+ /** Function directory names available to be used as hooks. */
35
+ function availableFunctions(functionsDir) {
36
+ if (!existsSync(functionsDir))
37
+ return [];
38
+ return readdirSync(functionsDir)
39
+ .filter((entry) => !entry.startsWith("_") && !entry.startsWith("."))
40
+ .filter((entry) => {
41
+ const full = join(functionsDir, entry);
42
+ // A function is a directory with an index.ts, matching how the worker discovers them.
43
+ return statSync(full).isDirectory() && existsSync(join(full, "index.ts"));
44
+ })
45
+ .sort();
46
+ }
47
+ /**
48
+ * Lines describing every hook whose function is missing, empty when all resolve.
49
+ *
50
+ * Returns the message rather than throwing so the caller decides how to fail: `push` stops, while
51
+ * `doctor` can report several problems at once.
52
+ */
53
+ export function validateModelHooks(ast, functionsDir, cwd) {
54
+ const hooks = declaredHooks(ast);
55
+ if (hooks.length === 0)
56
+ return [];
57
+ const available = availableFunctions(functionsDir);
58
+ const known = new Set(available);
59
+ const missing = hooks.filter((hook) => !known.has(hook.function));
60
+ if (missing.length === 0)
61
+ return [];
62
+ const where = relative(cwd, functionsDir) || functionsDir;
63
+ const lines = missing.map((hook) => ` ${hook.model}.${hook.event} → "${hook.function}" (no ${where}/${hook.function}/index.ts)`);
64
+ lines.push("");
65
+ lines.push(available.length > 0
66
+ ? `Hooks found in ${where}: ${available.join(", ")}`
67
+ : `No hooks found in ${where}. Create one with: supatype hooks new <name>`);
68
+ return lines;
69
+ }
70
+ /**
71
+ * Write `functions/_supatype/hooks.ts`, or remove a stale one when no hooks remain.
72
+ *
73
+ * Removal matters as much as writing: deleting the last hook from a schema should leave no typed
74
+ * module behind claiming tables are hooked, and a handler importing it should start failing to
75
+ * compile rather than sitting there dead.
76
+ *
77
+ * Returns the project-relative path written, or null when there was nothing to write.
78
+ */
79
+ export function writeHooksModule(cwd, functionsDir, ast) {
80
+ const module = generateHooksModule(ast);
81
+ const dir = join(functionsDir, "_supatype");
82
+ const file = join(dir, "hooks.ts");
83
+ if (module === null) {
84
+ if (existsSync(file))
85
+ rmSync(file, { force: true });
86
+ return null;
87
+ }
88
+ mkdirSync(dir, { recursive: true });
89
+ writeFileSync(file, module, "utf8");
90
+ return relative(cwd, file) || file;
91
+ }
92
+ /**
93
+ * The hook map for `.supatype/manifest.json`, keyed by **table name** — because that is what the
94
+ * server matches a request path against, not the model name.
95
+ *
96
+ * Defaults are resolved here rather than in the server: one place decides that a `before*` hook
97
+ * rejects when it cannot be reached and an `after*` hook only logs, so the two implementations
98
+ * cannot disagree about the safe direction.
99
+ */
100
+ export function manifestHooks(ast) {
101
+ const models = ast?.models;
102
+ if (!Array.isArray(models))
103
+ return {};
104
+ const out = {};
105
+ for (const model of models) {
106
+ const shaped = model;
107
+ const table = shaped.annotations?.db?.tableName;
108
+ const hooks = shaped.annotations?.platform?.hooks;
109
+ if (typeof table !== "string" || table.length === 0)
110
+ continue;
111
+ if (typeof hooks !== "object" || hooks === null)
112
+ continue;
113
+ const entries = {};
114
+ for (const [event, value] of Object.entries(hooks)) {
115
+ const fn = value?.function;
116
+ if (typeof fn !== "string" || fn.length === 0)
117
+ continue;
118
+ const onUnavailable = value.onUnavailable === "reject" || value.onUnavailable === "log"
119
+ ? value.onUnavailable
120
+ : event.startsWith("before")
121
+ ? "reject"
122
+ : "log";
123
+ entries[event] = {
124
+ function: fn,
125
+ timeout: typeof value.timeout === "number" ? value.timeout : DEFAULT_HOOK_TIMEOUT_MS,
126
+ onUnavailable,
127
+ };
128
+ }
129
+ if (Object.keys(entries).length > 0)
130
+ out[table] = entries;
131
+ }
132
+ return out;
133
+ }
134
+ /** Well below the 10s edge-function ceiling, so a hung hook fails fast instead of holding a slot. */
135
+ export const DEFAULT_HOOK_TIMEOUT_MS = 2000;
136
+ /**
137
+ * Merge the hook map into an existing `.supatype/manifest.json`.
138
+ *
139
+ * **Only updates a manifest that is already there.** Creating one from scratch here would be a
140
+ * hazard: `functions_enabled` is a plain bool on the server's side, so a manifest carrying only
141
+ * hooks would read as functions *disabled* — the exact defect this repo fixed a commit ago, arriving
142
+ * by a different door. The compose path owns creation; this owns one key.
143
+ *
144
+ * Returns true when the file was rewritten.
145
+ */
146
+ export function syncManifestHooks(cwd, ast) {
147
+ const manifestPath = join(cwd, ".supatype", "manifest.json");
148
+ if (!existsSync(manifestPath))
149
+ return false;
150
+ let parsed;
151
+ try {
152
+ parsed = JSON.parse(readFileSync(manifestPath, "utf8"));
153
+ }
154
+ catch {
155
+ return false; // Malformed: the server will complain about it far more clearly than we can here.
156
+ }
157
+ if (typeof parsed !== "object" || parsed === null)
158
+ return false;
159
+ const hooks = manifestHooks(ast);
160
+ const next = JSON.stringify(hooks);
161
+ const current = JSON.stringify(parsed["hooks"] ?? {});
162
+ if (next === current)
163
+ return false;
164
+ if (Object.keys(hooks).length === 0) {
165
+ delete parsed["hooks"];
166
+ }
167
+ else {
168
+ parsed["hooks"] = hooks;
169
+ }
170
+ writeFileSync(manifestPath, `${JSON.stringify(parsed, null, 2)}\n`, "utf8");
171
+ return true;
172
+ }
173
+ /**
174
+ * What `supatype doctor` needs to answer "will my hooks actually run?".
175
+ *
176
+ * Local facts only — the schema, the functions on disk, and the manifest the server reads. No probe
177
+ * of a running worker, so the answer is the same whether or not the stack is up, and a report that
178
+ * needs a stack is a report nobody runs before deploying.
179
+ *
180
+ * The case worth catching: hooks declared while `functions_enabled` is false. Nothing fails, no error
181
+ * appears, and every hook silently never fires.
182
+ */
183
+ export function hooksReport(cwd, functionsDir, ast) {
184
+ const declared = declaredHooks(ast);
185
+ const manifestPath = join(cwd, ".supatype", "manifest.json");
186
+ let functionsDisabled = false;
187
+ let mapMissing = false;
188
+ if (declared.length > 0 && existsSync(manifestPath)) {
189
+ try {
190
+ const parsed = JSON.parse(readFileSync(manifestPath, "utf8"));
191
+ functionsDisabled = parsed["functions_enabled"] === false;
192
+ mapMissing = parsed["hooks"] === undefined;
193
+ }
194
+ catch {
195
+ // Unparseable: the server reports that far better than a doctor line could.
196
+ }
197
+ }
198
+ const known = new Set(existsSync(functionsDir)
199
+ ? readdirSync(functionsDir).filter((entry) => !entry.startsWith("_") &&
200
+ !entry.startsWith(".") &&
201
+ statSync(join(functionsDir, entry)).isDirectory() &&
202
+ existsSync(join(functionsDir, entry, "index.ts")))
203
+ : []);
204
+ return {
205
+ declared,
206
+ missing: declared.filter((hook) => !known.has(hook.function)),
207
+ functionsDisabled,
208
+ mapMissing,
209
+ };
210
+ }
211
+ //# sourceMappingURL=model-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-hooks.js","sourceRoot":"","sources":["../src/model-hooks.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,17 @@ export declare function initdb(opts: PgOptions): void;
26
26
  * Start Postgres using pg_ctl.
27
27
  * Returns immediately once pg_ctl has handed off to the server process.
28
28
  */
29
+ /**
30
+ * Whether a native Postgres install carries the masking library.
31
+ *
32
+ * Asked of the filesystem rather than assumed from the provider, because a developer with an archive
33
+ * downloaded before the library was bundled has a native Postgres *without* it. Assuming otherwise
34
+ * would select tier 1 and their next push would be refused by the capability probe.
35
+ *
36
+ * Two layouts: Linux and macOS put extension libraries in `lib/`, the Windows archive in
37
+ * `lib/postgresql/`.
38
+ */
39
+ export declare function nativeMaskLibraryPresent(pgBinDir: string | null | undefined): boolean;
29
40
  export declare function start(opts: PgOptions): void;
30
41
  /**
31
42
  * Stop Postgres using pg_ctl (fast mode).
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-ctl.d.ts","sourceRoot":"","sources":["../src/postgres-ctl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,SAAS;IACxB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAAC,UAAU,CAWnB;AAMD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAgB5C;AAMD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAoB3C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAS1C;AAMD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlF;AAMD;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAahE"}
1
+ {"version":3,"file":"postgres-ctl.d.ts","sourceRoot":"","sources":["../src/postgres-ctl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,SAAS;IACxB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAAC,UAAU,CAWnB;AAMD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAgB5C;AAMD;;;GAGG;AACH;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAOrF;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CA4B3C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAS1C;AAMD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlF;AAMD;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAahE"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { spawnSync } from "node:child_process";
6
6
  import { existsSync, mkdirSync } from "node:fs";
7
- import { dirname, join } from "node:path";
7
+ import { dirname, join, resolve as resolvePath } from "node:path";
8
8
  /**
9
9
  * Native Postgres bundles are built with prefix /usr/local/supatype-pg; dyld/ld
10
10
  * must load libpq and friends from the extracted lib/ next to bin/.
@@ -51,14 +51,37 @@ export function initdb(opts) {
51
51
  * Start Postgres using pg_ctl.
52
52
  * Returns immediately once pg_ctl has handed off to the server process.
53
53
  */
54
+ /**
55
+ * Whether a native Postgres install carries the masking library.
56
+ *
57
+ * Asked of the filesystem rather than assumed from the provider, because a developer with an archive
58
+ * downloaded before the library was bundled has a native Postgres *without* it. Assuming otherwise
59
+ * would select tier 1 and their next push would be refused by the capability probe.
60
+ *
61
+ * Two layouts: Linux and macOS put extension libraries in `lib/`, the Windows archive in
62
+ * `lib/postgresql/`.
63
+ */
64
+ export function nativeMaskLibraryPresent(pgBinDir) {
65
+ if (!pgBinDir)
66
+ return false;
67
+ const prefix = resolvePath(pgBinDir, "..");
68
+ return ["supatype_mask.so", "supatype_mask.dylib", "supatype_mask.dll"].some((lib) => existsSync(join(prefix, "lib", lib)) || existsSync(join(prefix, "lib", "postgresql", lib)));
69
+ }
54
70
  export function start(opts) {
55
71
  const bin = pgBin(opts.pgBinDir, "pg_ctl");
56
72
  const logPath = opts.logPath ?? join(opts.dataDir, "postgres.log");
73
+ // `supatype_mask` is a planner hook, so it has to be preloaded — `CREATE EXTENSION` alone does
74
+ // nothing without it. Only when the archive actually carries the library: an install downloaded
75
+ // before it was bundled would fail to start with "could not access file".
76
+ //
77
+ // Native Postgres was started with no preloaded libraries at all until now, which is why field
78
+ // rules could not be enforced on the default `supatype dev`.
79
+ const preload = nativeMaskLibraryPresent(opts.pgBinDir) ? " -c shared_preload_libraries=supatype_mask" : "";
57
80
  const args = [
58
81
  "start",
59
82
  "-D", opts.dataDir,
60
83
  "-l", logPath,
61
- "-o", `-p ${opts.port}`,
84
+ "-o", `-p ${opts.port}${preload}`,
62
85
  "--wait",
63
86
  ];
64
87
  const result = spawnSync(bin, args, {
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-ctl.js","sourceRoot":"","sources":["../src/postgres-ctl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAazC;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAuB,CAAA;IACnD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAA;QACxC,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAC7D,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAA;QACtC,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAC3D,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,IAAe;IACpC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IACtD,IAAI,UAAU,CAAC,aAAa,CAAC;QAAE,OAAM,CAAC,uBAAuB;IAE7D,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE5C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;QAC/F,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,IAAe;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAElE,MAAM,IAAI,GAAG;QACX,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,OAAO;QAClB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE;QACvB,QAAQ;KACT,CAAA;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE;QAClC,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IAChE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,IAAe;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAClF,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAA;IACF,sDAAsD;IACtD,KAAK,MAAM,CAAA;AACb,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAe,EAAE,SAAS,GAAG,MAAM;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IAEvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;YAC7D,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC/B,CAAC,CAAA;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE/B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,wCAAwC,SAAS,cAAc,IAAI,CAAC,IAAI,EAAE,CAC3E,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,sFAAsF;YACtF,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,6EAA6E;AAC7E,SAAS,KAAK,CAAC,MAAc,EAAE,IAAY;IACzC,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC1E,CAAC"}
1
+ {"version":3,"file":"postgres-ctl.js","sourceRoot":"","sources":["../src/postgres-ctl.ts"],"names":[],"mappings":"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"}
@@ -24,8 +24,38 @@ export interface SupatypeProjectConfig {
24
24
  * Database backend.
25
25
  * "native" = supatype manages a native Postgres binary (downloaded from CDN).
26
26
  * "docker" = supatype runs supatype/postgres via Docker (includes all extensions).
27
+ *
28
+ * Omitted when `external` is set — there is no backend for Supatype to choose.
27
29
  */
28
- provider: "native" | "docker";
30
+ provider?: "native" | "docker";
31
+ /**
32
+ * Point the stack at a Postgres that already exists, instead of provisioning one.
33
+ *
34
+ * The presence of this block is the switch: with it, no `db` service is generated and every
35
+ * service connects here. Deliberately not an overload of `connection`, which means something
36
+ * narrower (a DSN for CLI commands) and would become the third setting meaning two things.
37
+ *
38
+ * **Self-host only.** On the cloud path the database is part of what is being provided, so the
39
+ * block is rejected rather than ignored.
40
+ */
41
+ external?: {
42
+ /**
43
+ * Postgres URL for every service in the stack.
44
+ *
45
+ * The role in it owns the schema and runs migrations. PostgREST connects as `authenticator`
46
+ * separately — see `supatype db check`, which reports what this database is missing.
47
+ */
48
+ url: string;
49
+ /**
50
+ * Force realtime off.
51
+ *
52
+ * Realtime needs logical replication (`wal_level = logical`, a replication slot, and
53
+ * `wal2json`), which a managed provider may not offer. Left unset, the stack probes for the
54
+ * capability and records the answer, so this is only for overriding a probe that says yes when
55
+ * you would rather it did not run.
56
+ */
57
+ realtime?: boolean;
58
+ };
29
59
  /**
30
60
  * Directory where Postgres stores its data files (provider=native).
31
61
  * Defaults to ~/.supatype/projects/{name}/data when omitted.
@@ -175,10 +205,36 @@ export interface SupatypeProjectConfig {
175
205
  path?: string;
176
206
  /** Postgres schema name. Defaults to "public". */
177
207
  pg_schema?: string;
208
+ /**
209
+ * Schemas the REST API exposes, in order (`PGRST_DB_SCHEMA`).
210
+ *
211
+ * Defaults to `pg_schema` plus the ones the stack needs for itself — `supatype` for Studio's
212
+ * views, `graphql_public`, `auth` — so setting `pg_schema` alone does the sensible thing.
213
+ *
214
+ * It used to be a hardcoded literal, which meant choosing a non-`public` `pg_schema` gave you
215
+ * a correct push and an API that answered `PGRST106` for everything: the engine had moved and
216
+ * PostgREST had not been told. State this explicitly when you need a different set — an extra
217
+ * schema of your own, or to stop exposing one.
218
+ */
219
+ api_schemas?: readonly string[];
178
220
  };
179
221
  functions?: {
180
222
  /** Path to edge functions directory, relative to `supatype.root` when not absolute. */
181
223
  path?: string;
224
+ /**
225
+ * **Public functions** allowed to see the service-role key, which reads and writes past every
226
+ * access rule.
227
+ *
228
+ * Empty by default, and that default is the point: a function is a public endpoint anyone holding
229
+ * the anon key can invoke, so an ambient admin credential made every one of them able to read the
230
+ * whole database. Naming one here is a reviewable line in a diff; ambient privilege is not.
231
+ *
232
+ * **Model hooks are not listed here and do not need to be.** A hook is procedural: only the API
233
+ * server calls it, around a write the caller was already permitted to make, and the gateway
234
+ * refuses its route from outside — so there is no attacker to withhold it from, and the trust is
235
+ * the same a trigger already has.
236
+ */
237
+ serviceRole?: readonly string[];
182
238
  };
183
239
  output?: {
184
240
  /** Path for generated TypeScript types. */
@@ -237,6 +293,15 @@ export declare function schemaPathFromProject(cfg: SupatypeProjectConfig, cwd: s
237
293
  export declare function projectRootFromConfig(cfg: SupatypeProjectConfig, cwd: string): string;
238
294
  /** Candidate functions directories in lookup order. */
239
295
  export declare function functionsPathCandidatesFromProject(cfg: SupatypeProjectConfig, cwd: string): string[];
296
+ /**
297
+ * Directory holding **model hooks** — procedural handlers the API calls around a write.
298
+ *
299
+ * Separate from `functions/` because the two have different trust models: a function is a public
300
+ * endpoint anyone with the anon key may invoke, while a hook is only ever called by the server. One
301
+ * worker serves both, and the gateway refuses the hook namespace from outside — so keeping them in
302
+ * separate directories is what makes that boundary structural rather than a list to maintain.
303
+ */
304
+ export declare function hooksPathFromProject(cfg: SupatypeProjectConfig, cwd: string): string;
240
305
  /** Preferred default functions path (used when creating new functions). */
241
306
  export declare function preferredFunctionsPathFromProject(cfg: SupatypeProjectConfig, cwd: string): string;
242
307
  /**
@@ -252,6 +317,18 @@ export declare function serverBaseUrl(cfg: SupatypeProjectConfig): string | unde
252
317
  export declare function selfHostTlsEnabled(cfg: SupatypeProjectConfig, devLocal?: boolean): boolean;
253
318
  /** Resolved runtime provider (`config.provider` ?? `database.provider` ?? native). */
254
319
  export declare function resolveRuntimeProvider(cfg: SupatypeProjectConfig): "native" | "docker";
320
+ /**
321
+ * Routes entitled to the service-role key, as the worker's env expects them.
322
+ *
323
+ * Resolved here rather than in the compose template so there is one definition of the format.
324
+ *
325
+ * This does **not** check that the names exist — it cannot, since it has only the config. An earlier
326
+ * version of this comment claimed a typo was "visible in one place rather than silently granting
327
+ * nothing", which was false: nothing read the list except the two callers that turn it into an env var.
328
+ * `checkServiceRoleRoutes` in `service-role-check.ts` is what actually resolves the names, and `push`
329
+ * refuses on it.
330
+ */
331
+ export declare function serviceRoleRoutes(cfg: SupatypeProjectConfig): string[];
255
332
  /** Kong gateway port when `provider: docker` (self-host compose dev). */
256
333
  export declare const COMPOSE_DEV_KONG_PORT = 18473;
257
334
  /** The local Postgres DSN derived from project name (dev default). */
@@ -261,4 +338,47 @@ export declare function localDSN(cfg: SupatypeProjectConfig): string;
261
338
  * Prefers optional `connection` in config, then `DATABASE_URL` env, then a local default DSN.
262
339
  */
263
340
  export declare function connectionString(cfg: SupatypeProjectConfig): string;
341
+ /** True when the project points at a Postgres it does not manage. */
342
+ export declare function usesExternalDatabase(cfg: SupatypeProjectConfig): boolean;
343
+ /**
344
+ * The external Postgres URL, or undefined for a managed one.
345
+ *
346
+ * Ahead of `connection` and `DATABASE_URL` in [`connectionString`] on purpose: a stated external
347
+ * database is the whole stack's database, and a CLI command that pushed somewhere else while the
348
+ * services read from here would look exactly like data loss.
349
+ */
350
+ export declare function externalDatabaseUrl(cfg: SupatypeProjectConfig): string | undefined;
351
+ /**
352
+ * Whether realtime should run.
353
+ *
354
+ * `false` only when stated. An external database that cannot support logical replication is detected
355
+ * rather than declared — the capability record is what Studio and `doctor` read, so an operator who
356
+ * has not thought about it gets a truthful answer instead of a silent default.
357
+ */
358
+ export declare function realtimeEnabled(cfg: SupatypeProjectConfig): boolean;
359
+ /** The Postgres schema Supatype manages. */
360
+ export declare function pgSchema(cfg: SupatypeProjectConfig): string;
361
+ /**
362
+ * Schemas the stack exposes for its own sake, beyond the one Supatype manages.
363
+ *
364
+ * Dev used to omit `auth` while self-host exposed it, so the same request could work against a
365
+ * self-hosted stack and 404 locally. One list for both.
366
+ */
367
+ export declare const STACK_API_SCHEMAS: readonly ["supatype", "graphql_public", "auth"];
368
+ /**
369
+ * Schemas to expose over REST, as `PGRST_DB_SCHEMA` wants them.
370
+ *
371
+ * The managed schema first, then what the stack needs for itself. Derived rather than hardcoded
372
+ * because the literal version silently ignored `pg_schema`: the engine would migrate into `app`
373
+ * while PostgREST kept serving `public`, so every request answered `PGRST106` and nothing in the
374
+ * output mentioned the setting that caused it.
375
+ *
376
+ * `api_schemas` replaces the whole list when stated — including the stack schemas, so dropping
377
+ * `supatype` from it is a supported way to stop exposing Studio's views. Order is preserved and
378
+ * duplicates removed: PostgREST serves the first entry as the default profile, so the managed
379
+ * schema has to lead.
380
+ */
381
+ export declare function apiSchemas(cfg: SupatypeProjectConfig, tier?: "none" | "extension" | "views"): string[];
382
+ /** `PGRST_DB_SCHEMA` value: comma-separated, in order. */
383
+ export declare function apiSchemaList(cfg: SupatypeProjectConfig, tier?: "none" | "extension" | "views"): string;
264
384
  //# sourceMappingURL=project-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../src/project-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../src/project-config.ts"],"names":[],"mappings":"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"}