@supatype/cli 0.1.7 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +125 -122
- package/.turbo/turbo-typecheck.log +1 -1
- package/LICENSE +202 -0
- package/deno.d.ts +1 -1
- package/dist/app/framework.js +1 -1
- package/dist/app/framework.js.map +1 -1
- package/dist/augmentation-generator.d.ts +1 -1
- package/dist/augmentation-generator.js +3 -3
- package/dist/augmentation-generator.js.map +1 -1
- package/dist/binary-cache.d.ts +30 -8
- package/dist/binary-cache.d.ts.map +1 -1
- package/dist/binary-cache.js +47 -35
- package/dist/binary-cache.js.map +1 -1
- package/dist/cache-pins.d.ts +1 -1
- package/dist/cache-pins.js +2 -2
- package/dist/cache-pins.js.map +1 -1
- package/dist/cli-artifacts.d.ts +32 -0
- package/dist/cli-artifacts.d.ts.map +1 -0
- package/dist/cli-artifacts.js +49 -0
- package/dist/cli-artifacts.js.map +1 -0
- package/dist/cli-install-method.d.ts +17 -1
- package/dist/cli-install-method.d.ts.map +1 -1
- package/dist/cli-install-method.js +32 -4
- package/dist/cli-install-method.js.map +1 -1
- package/dist/cli-package-version.d.ts +1 -1
- package/dist/cli-package-version.d.ts.map +1 -1
- package/dist/cli-package-version.js +6 -1
- package/dist/cli-package-version.js.map +1 -1
- package/dist/cli-standalone.d.ts +13 -4
- package/dist/cli-standalone.d.ts.map +1 -1
- package/dist/cli-standalone.js +86 -31
- package/dist/cli-standalone.js.map +1 -1
- package/dist/cli-version-embedded.d.ts +10 -0
- package/dist/cli-version-embedded.d.ts.map +1 -0
- package/dist/cli-version-embedded.js +13 -0
- package/dist/cli-version-embedded.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.js +4 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/admin.js +6 -6
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/adopt.js +1 -1
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/app.js +2 -2
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/cache.d.ts +1 -1
- package/dist/commands/cache.js +3 -3
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/db.d.ts +3 -3
- package/dist/commands/db.d.ts.map +1 -1
- package/dist/commands/db.js +12 -11
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.d.ts +9 -9
- package/dist/commands/deploy.js +12 -12
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +3 -3
- package/dist/commands/dev.js +17 -17
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/engine.d.ts +1 -1
- package/dist/commands/engine.js +1 -1
- package/dist/commands/functions.d.ts.map +1 -1
- package/dist/commands/functions.js +8 -7
- package/dist/commands/functions.js.map +1 -1
- package/dist/commands/hooks.d.ts +2 -2
- package/dist/commands/hooks.js +4 -4
- package/dist/commands/hooks.js.map +1 -1
- package/dist/commands/init.js +28 -28
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/internal.d.ts.map +1 -1
- package/dist/commands/internal.js +37 -0
- package/dist/commands/internal.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -1
- package/dist/commands/migrate.js +5 -5
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/pg.d.ts +1 -1
- package/dist/commands/pg.js +1 -1
- package/dist/commands/plugins.js +1 -1
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/pull.js +2 -2
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.js +3 -3
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/self-host.d.ts +1 -1
- package/dist/commands/self-host.js +1 -1
- package/dist/commands/self-update.d.ts +2 -8
- package/dist/commands/self-update.d.ts.map +1 -1
- package/dist/commands/self-update.js +20 -12
- package/dist/commands/self-update.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/update.d.ts +1 -1
- package/dist/commands/update.js +1 -1
- package/dist/config.d.ts +23 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +37 -18
- package/dist/config.js.map +1 -1
- package/dist/db-preflight.d.ts +4 -4
- package/dist/db-preflight.js +14 -14
- package/dist/db-preflight.js.map +1 -1
- package/dist/dev-compose.d.ts +3 -3
- package/dist/dev-compose.js +27 -27
- package/dist/dev-compose.js.map +1 -1
- package/dist/dev-log-filter.d.ts +1 -1
- package/dist/dev-log-filter.d.ts.map +1 -1
- package/dist/dev-log-filter.js +1 -1
- package/dist/dev-log-filter.js.map +1 -1
- package/dist/dev-ports.d.ts +2 -2
- package/dist/dev-ports.d.ts.map +1 -1
- package/dist/dev-ports.js +2 -2
- package/dist/dev-ports.js.map +1 -1
- package/dist/dev-session.d.ts +5 -5
- package/dist/dev-session.d.ts.map +1 -1
- package/dist/dev-session.js +6 -6
- package/dist/dev-session.js.map +1 -1
- package/dist/dev-shutdown.d.ts +5 -5
- package/dist/dev-shutdown.d.ts.map +1 -1
- package/dist/dev-shutdown.js +7 -7
- package/dist/dev-shutdown.js.map +1 -1
- package/dist/dev-task-colors.d.ts +1 -1
- package/dist/dev-task-colors.d.ts.map +1 -1
- package/dist/dev-task-colors.js +1 -1
- package/dist/dev-task-colors.js.map +1 -1
- package/dist/docker-postgres.d.ts +5 -5
- package/dist/docker-postgres.d.ts.map +1 -1
- package/dist/docker-postgres.js +5 -5
- package/dist/docker-postgres.js.map +1 -1
- package/dist/docker-runtime.d.ts +2 -2
- package/dist/docker-runtime.d.ts.map +1 -1
- package/dist/docker-runtime.js +5 -5
- package/dist/docker-runtime.js.map +1 -1
- package/dist/engine-client.d.ts +1 -1
- package/dist/engine-client.js +3 -3
- package/dist/engine-client.js.map +1 -1
- package/dist/engine-push-output.js +1 -1
- package/dist/engine-push-output.js.map +1 -1
- package/dist/ensure-binary.d.ts.map +1 -1
- package/dist/ensure-binary.js +17 -0
- package/dist/ensure-binary.js.map +1 -1
- package/dist/ensure-component-binaries.js +1 -1
- package/dist/ensure-component-binaries.js.map +1 -1
- package/dist/env-file.d.ts +2 -2
- package/dist/env-file.d.ts.map +1 -1
- package/dist/env-file.js +1 -1
- package/dist/env-file.js.map +1 -1
- package/dist/field-masking-tier.d.ts +5 -5
- package/dist/field-masking-tier.d.ts.map +1 -1
- package/dist/field-masking-tier.js +6 -6
- package/dist/field-masking-tier.js.map +1 -1
- package/dist/functions-deno-types.d.ts +1 -1
- package/dist/functions-deno-types.d.ts.map +1 -1
- package/dist/functions-deno-types.js +3 -3
- package/dist/functions-deno-types.js.map +1 -1
- package/dist/functions-router-gen.js +1 -1
- package/dist/gitignore.d.ts +2 -2
- package/dist/gitignore.d.ts.map +1 -1
- package/dist/gitignore.js +3 -3
- package/dist/gitignore.js.map +1 -1
- package/dist/hook-upload.d.ts +1 -1
- package/dist/hook-upload.js +3 -3
- package/dist/hooks-generator.d.ts +1 -1
- package/dist/hooks-generator.js +9 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/init-project-detect.d.ts +1 -1
- package/dist/init-project-detect.d.ts.map +1 -1
- package/dist/init-project-detect.js +1 -1
- package/dist/init-project-detect.js.map +1 -1
- package/dist/link.d.ts +1 -1
- package/dist/link.d.ts.map +1 -1
- package/dist/local-secrets.d.ts +5 -5
- package/dist/local-secrets.js +5 -5
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +20 -0
- package/dist/main.js.map +1 -0
- package/dist/model-hooks.d.ts +3 -3
- package/dist/model-hooks.js +4 -4
- package/dist/pgbouncer-userlist.d.ts +1 -1
- package/dist/pgbouncer-userlist.d.ts.map +1 -1
- package/dist/pgbouncer-userlist.js +2 -2
- package/dist/pgbouncer-userlist.js.map +1 -1
- package/dist/postgres-ctl.d.ts +1 -1
- package/dist/postgres-ctl.js +4 -4
- package/dist/postgres-ctl.js.map +1 -1
- package/dist/process-manager.d.ts +2 -2
- package/dist/process-manager.d.ts.map +1 -1
- package/dist/process-manager.js +4 -4
- package/dist/process-manager.js.map +1 -1
- package/dist/project-config.d.ts +12 -12
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +9 -9
- package/dist/project-config.js.map +1 -1
- package/dist/pull-utils.d.ts +2 -2
- package/dist/pull-utils.d.ts.map +1 -1
- package/dist/pull-utils.js +4 -4
- package/dist/pull-utils.js.map +1 -1
- package/dist/realtime-launch.js +1 -1
- package/dist/realtime-launch.js.map +1 -1
- package/dist/release-pins.d.ts +1 -1
- package/dist/release-pins.js +2 -2
- package/dist/release-pins.js.map +1 -1
- package/dist/resolve-api-url.d.ts.map +1 -1
- package/dist/resolve-api-url.js +4 -3
- package/dist/resolve-api-url.js.map +1 -1
- package/dist/resolve-target.d.ts +1 -1
- package/dist/resolve-target.d.ts.map +1 -1
- package/dist/rest-cache-admin.js +2 -2
- package/dist/rest-cache-admin.js.map +1 -1
- package/dist/runtime-routes.d.ts +1 -1
- package/dist/runtime-routes.js +1 -1
- package/dist/schema-ast-v2.d.ts +3 -3
- package/dist/schema-ast-v2.d.ts.map +1 -1
- package/dist/schema-ast-v2.js +2 -2
- package/dist/schema-ast-v2.js.map +1 -1
- package/dist/schema-push-lock.js +3 -3
- package/dist/schema-push-lock.js.map +1 -1
- package/dist/scripts/postinstall.d.ts +1 -1
- package/dist/scripts/postinstall.js +1 -1
- package/dist/self-host-compose.d.ts +5 -5
- package/dist/self-host-compose.d.ts.map +1 -1
- package/dist/self-host-compose.js +24 -24
- package/dist/self-host-compose.js.map +1 -1
- package/dist/service-role-check.js +3 -3
- package/dist/service-role-check.js.map +1 -1
- package/dist/storage-provision.d.ts +1 -1
- package/dist/storage-provision.js +3 -3
- package/dist/storage-provision.js.map +1 -1
- package/dist/studio-dev-server.d.ts +1 -1
- package/dist/studio-dev-server.d.ts.map +1 -1
- package/dist/systemd.d.ts +1 -1
- package/dist/systemd.js +1 -1
- package/dist/target-client.js +1 -1
- package/dist/target-client.js.map +1 -1
- package/dist/tsx-runner.d.ts +12 -0
- package/dist/tsx-runner.d.ts.map +1 -1
- package/dist/tsx-runner.js +36 -2
- package/dist/tsx-runner.js.map +1 -1
- package/dist/type-extractor.js +27 -27
- package/dist/type-extractor.js.map +1 -1
- package/dist/type-resolver.js +1 -1
- package/dist/type-resolver.js.map +1 -1
- package/dist/ui/brand.d.ts +1 -1
- package/dist/ui/brand.js +1 -1
- package/dist/ui/components/LogoWordmark.d.ts +1 -1
- package/dist/ui/components/LogoWordmark.d.ts.map +1 -1
- package/dist/ui/components/LogoWordmark.js +1 -1
- package/dist/ui/components/LogoWordmark.js.map +1 -1
- package/dist/ui/components/SelectField.js +1 -1
- package/dist/ui/components/SelectField.js.map +1 -1
- package/dist/ui/confirm.d.ts +1 -1
- package/dist/ui/confirm.js +1 -1
- package/dist/ui/fatal.d.ts +1 -1
- package/dist/ui/fatal.d.ts.map +1 -1
- package/dist/ui/fatal.js +1 -1
- package/dist/ui/fatal.js.map +1 -1
- package/dist/ui/flows/prompt-fields.js +1 -1
- package/dist/ui/flows/prompt-fields.js.map +1 -1
- package/dist/ui/interactive.d.ts +1 -1
- package/dist/ui/interactive.d.ts.map +1 -1
- package/dist/ui/interactive.js +1 -1
- package/dist/ui/interactive.js.map +1 -1
- package/dist/ui/progress.d.ts +1 -1
- package/dist/ui/progress.js +1 -1
- package/dist/ui/runtime/command-chrome.js +1 -1
- package/dist/ui/runtime/command-chrome.js.map +1 -1
- package/dist/ui/runtime/run-clack-flow.js +1 -1
- package/dist/ui/runtime/run-clack-flow.js.map +1 -1
- package/dist/ui/runtime/stdin-after-ink.js +1 -1
- package/dist/ui/runtime/stdin-after-ink.js.map +1 -1
- package/dist/ui/theme.d.ts +1 -1
- package/dist/ui/theme.js +1 -1
- package/dist/valkey-sidecar.d.ts +1 -1
- package/dist/valkey-sidecar.d.ts.map +1 -1
- package/dist/valkey-sidecar.js +2 -2
- package/dist/valkey-sidecar.js.map +1 -1
- package/package.json +3 -2
- package/scripts/build-release-artifacts.sh +112 -0
- package/scripts/generate-homebrew-formula.mjs +47 -45
- package/scripts/mirror-deno-release.sh +1 -1
- package/src/TYPE-RESOLUTION.md +31 -31
- package/src/app/framework.ts +1 -1
- package/src/augmentation-generator.ts +3 -3
- package/src/binary-cache.ts +51 -36
- package/src/cache-pins.ts +2 -2
- package/src/cli-artifacts.ts +65 -0
- package/src/cli-install-method.ts +35 -4
- package/src/cli-package-version.ts +5 -1
- package/src/cli-standalone.ts +116 -34
- package/src/cli-version-embedded.ts +12 -0
- package/src/cli.ts +1 -1
- package/src/commands/add.ts +4 -3
- package/src/commands/admin.ts +6 -6
- package/src/commands/adopt.ts +1 -1
- package/src/commands/app.ts +2 -2
- package/src/commands/cache.ts +3 -3
- package/src/commands/db.ts +12 -11
- package/src/commands/deploy.ts +12 -12
- package/src/commands/dev.ts +19 -19
- package/src/commands/doctor.ts +3 -3
- package/src/commands/engine.ts +1 -1
- package/src/commands/functions.ts +8 -7
- package/src/commands/hooks.ts +6 -6
- package/src/commands/init.ts +28 -28
- package/src/commands/internal.ts +37 -0
- package/src/commands/login.ts +2 -2
- package/src/commands/logs.ts +1 -1
- package/src/commands/migrate.ts +5 -5
- package/src/commands/pg.ts +1 -1
- package/src/commands/plugins.ts +1 -1
- package/src/commands/pull.ts +2 -2
- package/src/commands/push.ts +3 -3
- package/src/commands/self-host.ts +1 -1
- package/src/commands/self-update.ts +23 -73
- package/src/commands/status.ts +1 -1
- package/src/commands/update.ts +1 -1
- package/src/config.ts +39 -18
- package/src/db-preflight.ts +15 -15
- package/src/dev-compose.ts +27 -27
- package/src/dev-log-filter.ts +1 -1
- package/src/dev-ports.ts +3 -3
- package/src/dev-session.ts +6 -6
- package/src/dev-shutdown.ts +8 -8
- package/src/dev-task-colors.ts +1 -1
- package/src/docker-postgres.ts +6 -6
- package/src/docker-runtime.ts +5 -5
- package/src/engine-client.ts +3 -3
- package/src/engine-push-output.ts +1 -1
- package/src/ensure-binary.ts +20 -0
- package/src/ensure-component-binaries.ts +1 -1
- package/src/env-file.ts +2 -2
- package/src/field-masking-tier.ts +6 -6
- package/src/functions-deno-types.ts +3 -3
- package/src/functions-router-gen.ts +1 -1
- package/src/gitignore.ts +3 -3
- package/src/hook-upload.ts +3 -3
- package/src/hooks-generator.ts +9 -9
- package/src/index.ts +1 -1
- package/src/init-project-detect.ts +1 -1
- package/src/link.ts +1 -1
- package/src/local-secrets.ts +5 -5
- package/src/main.ts +20 -0
- package/src/model-hooks.ts +4 -4
- package/src/pgbouncer-userlist.ts +2 -2
- package/src/postgres-ctl.ts +4 -4
- package/src/process-manager.ts +4 -4
- package/src/project-config.ts +16 -16
- package/src/pull-utils.ts +4 -4
- package/src/realtime-launch.ts +1 -1
- package/src/release-pins.ts +2 -2
- package/src/resolve-api-url.ts +4 -3
- package/src/resolve-target.ts +1 -1
- package/src/rest-cache-admin.ts +2 -2
- package/src/runtime-routes.ts +2 -2
- package/src/schema-ast-v2.ts +4 -4
- package/src/schema-push-lock.ts +3 -3
- package/src/scripts/postinstall.ts +1 -1
- package/src/self-host-compose.ts +25 -25
- package/src/service-role-check.ts +3 -3
- package/src/storage-provision.ts +3 -3
- package/src/studio-dev-server.ts +1 -1
- package/src/systemd.ts +1 -1
- package/src/target-client.ts +1 -1
- package/src/tsx-runner.ts +41 -2
- package/src/type-extractor.ts +27 -27
- package/src/type-resolver.ts +1 -1
- package/src/ui/README.md +1 -1
- package/src/ui/brand.ts +1 -1
- package/src/ui/components/LogoWordmark.tsx +1 -1
- package/src/ui/components/SelectField.tsx +1 -1
- package/src/ui/confirm.ts +1 -1
- package/src/ui/fatal.ts +1 -1
- package/src/ui/flows/prompt-fields.tsx +1 -1
- package/src/ui/interactive.ts +1 -1
- package/src/ui/progress.ts +1 -1
- package/src/ui/runtime/command-chrome.ts +1 -1
- package/src/ui/runtime/run-clack-flow.tsx +1 -1
- package/src/ui/runtime/stdin-after-ink.ts +1 -1
- package/src/ui/theme.ts +1 -1
- package/src/valkey-sidecar.ts +2 -2
- package/tests/access-composition.test.ts +6 -6
- package/tests/admin-studio-membership.test.ts +1 -1
- package/tests/api-schemas.test.ts +1 -1
- package/tests/archive-name-alias.test.ts +1 -1
- package/tests/cli-help.test.ts +8 -2
- package/tests/config-load-failure.test.ts +44 -0
- package/tests/db-preflight.test.ts +1 -1
- package/tests/doctor-render.test.ts +3 -3
- package/tests/doctor-service-role.test.ts +2 -2
- package/tests/engine-push-output.test.ts +1 -1
- package/tests/env-file.test.ts +3 -3
- package/tests/external-database-compose.test.ts +5 -5
- package/tests/external-database-config.test.ts +2 -2
- package/tests/field-masking-tier.test.ts +1 -1
- package/tests/homebrew-formula.test.ts +68 -26
- package/tests/hook-upload.test.ts +1 -1
- package/tests/hooks-generator.test.ts +1 -1
- package/tests/init.test.ts +2 -2
- package/tests/keys.test.ts +8 -2
- package/tests/local-secrets.test.ts +3 -3
- package/tests/model-hooks.test.ts +6 -6
- package/tests/runtime-contract.test.ts +2 -2
- package/tests/service-role-check.test.ts +3 -3
- package/tests/storage-provision.test.ts +1 -1
- package/tests/type-extractor.test.ts +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +7 -1
- package/scripts/build-release-bundle.mjs +0 -27
package/src/main.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry point for the standalone binary.
|
|
3
|
+
*
|
|
4
|
+
* `bin/supatype.js` stays the npm entry: it loads the CLI with a dynamic import, which Bun
|
|
5
|
+
* cannot follow when compiling. Given `import("../dist/cli.js")` it emits a binary that
|
|
6
|
+
* bundles one module and then fails at runtime with
|
|
7
|
+
* `Cannot find module '../dist/cli.js' from '/$bunfs/root/supatype'`. The import below is
|
|
8
|
+
* static, so the whole graph is embedded.
|
|
9
|
+
*/
|
|
10
|
+
import { run } from "./cli.js"
|
|
11
|
+
import { reportCliFatal } from "./ui/fatal.js"
|
|
12
|
+
|
|
13
|
+
// reportCliFatal rather than console.error: it is what run() already uses for a failed
|
|
14
|
+
// command, and it prints a stack under SUPATYPE_DEBUG=1. Open-coding the message here would
|
|
15
|
+
// make a crash report from a curl | bash user less useful than one from an npm user. This
|
|
16
|
+
// only fires for a throw during command registration, since run() catches everything after.
|
|
17
|
+
run().catch((err: unknown) => {
|
|
18
|
+
reportCliFatal(err)
|
|
19
|
+
process.exit(1)
|
|
20
|
+
})
|
package/src/model-hooks.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Validate the lifecycle hooks a schema declares against the functions that exist.
|
|
3
3
|
*
|
|
4
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
|
|
5
|
+
* the path we searched, not at runtime, where the symptom is a hook that never fires and a write
|
|
6
6
|
* that quietly succeeds unvalidated. That silence is the whole reason this check exists.
|
|
7
7
|
*
|
|
8
8
|
* Kept out of the extractor on purpose: resolving the functions directory needs the project config,
|
|
@@ -119,7 +119,7 @@ export interface ManifestHookEntry {
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
/**
|
|
122
|
-
* The hook map for `.supatype/manifest.json`, keyed by **table name
|
|
122
|
+
* The hook map for `.supatype/manifest.json`, keyed by **table name**, because that is what the
|
|
123
123
|
* server matches a request path against, not the model name.
|
|
124
124
|
*
|
|
125
125
|
* Defaults are resolved here rather than in the server: one place decides that a `before*` hook
|
|
@@ -172,7 +172,7 @@ export const DEFAULT_HOOK_TIMEOUT_MS = 2000
|
|
|
172
172
|
*
|
|
173
173
|
* **Only updates a manifest that is already there.** Creating one from scratch here would be a
|
|
174
174
|
* hazard: `functions_enabled` is a plain bool on the server's side, so a manifest carrying only
|
|
175
|
-
* hooks would read as functions *disabled
|
|
175
|
+
* hooks would read as functions *disabled*, the exact defect this repo fixed a commit ago, arriving
|
|
176
176
|
* by a different door. The compose path owns creation; this owns one key.
|
|
177
177
|
*
|
|
178
178
|
* Returns true when the file was rewritten.
|
|
@@ -216,7 +216,7 @@ export interface HooksReport {
|
|
|
216
216
|
/**
|
|
217
217
|
* What `supatype doctor` needs to answer "will my hooks actually run?".
|
|
218
218
|
*
|
|
219
|
-
* Local facts only
|
|
219
|
+
* Local facts only: the schema, the functions on disk, and the manifest the server reads. No probe
|
|
220
220
|
* of a running worker, so the answer is the same whether or not the stack is up, and a report that
|
|
221
221
|
* needs a stack is a report nobody runs before deploying.
|
|
222
222
|
*
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto"
|
|
2
2
|
|
|
3
|
-
/** PgBouncer md5 auth: "md5" + md5(password + username)
|
|
3
|
+
/** PgBouncer md5 auth: "md5" + md5(password + username), same as supatype-cloud / self-host. */
|
|
4
4
|
export function pgbouncerMd5Hash(password: string, username: string): string {
|
|
5
5
|
return "md5" + createHash("md5").update(password + username).digest("hex")
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
/** Two roles used by local compose: superuser pools (GoTrue, engine) and PostgREST. */
|
|
9
9
|
export function pgbouncerUserlistContent(pgPassword: string): string {
|
|
10
|
-
return `# PgBouncer md5 userlist
|
|
10
|
+
return `# PgBouncer md5 userlist, matches supatype-cloud transaction pool (auth_type = md5).
|
|
11
11
|
# Regenerated by supatype dev --local / init from POSTGRES_PASSWORD.
|
|
12
12
|
"supatype_admin" "${pgbouncerMd5Hash(pgPassword, "supatype_admin")}"
|
|
13
13
|
"authenticator" "${pgbouncerMd5Hash(pgPassword, "authenticator")}"
|
package/src/postgres-ctl.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* postgres-ctl
|
|
2
|
+
* postgres-ctl: wrappers around pg_ctl, initdb, and pg_isready for managing
|
|
3
3
|
* a native Postgres installation.
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -95,7 +95,7 @@ export function start(opts: PgOptions): void {
|
|
|
95
95
|
const bin = pgBin(opts.pgBinDir, "pg_ctl")
|
|
96
96
|
const logPath = opts.logPath ?? join(opts.dataDir, "postgres.log")
|
|
97
97
|
|
|
98
|
-
// `supatype_mask` is a planner hook, so it has to be preloaded
|
|
98
|
+
// `supatype_mask` is a planner hook, so it has to be preloaded, `CREATE EXTENSION` alone does
|
|
99
99
|
// nothing without it. Only when the archive actually carries the library: an install downloaded
|
|
100
100
|
// before it was bundled would fail to start with "could not access file".
|
|
101
101
|
//
|
|
@@ -131,7 +131,7 @@ export function stop(opts: PgOptions): void {
|
|
|
131
131
|
encoding: "utf8",
|
|
132
132
|
env: pgSpawnEnv(opts.pgBinDir),
|
|
133
133
|
})
|
|
134
|
-
// Ignore exit code
|
|
134
|
+
// Ignore exit code: Postgres may already be stopped.
|
|
135
135
|
void result
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -175,7 +175,7 @@ export async function isPortInUse(port: number): Promise<boolean> {
|
|
|
175
175
|
return new Promise((resolve) => {
|
|
176
176
|
const server = createServer()
|
|
177
177
|
server.once("error", (err: NodeJS.ErrnoException) => {
|
|
178
|
-
// EADDRINUSE
|
|
178
|
+
// EADDRINUSE: something is listening. EACCES, Windows excluded/reserved port range.
|
|
179
179
|
resolve(err.code === "EADDRINUSE" || err.code === "EACCES")
|
|
180
180
|
})
|
|
181
181
|
server.once("listening", () => {
|
package/src/process-manager.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ProcessManager
|
|
2
|
+
* ProcessManager: spawn a child process, write its PID, stream logs with a
|
|
3
3
|
* colored prefix, and restart on crash with exponential backoff.
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -73,7 +73,7 @@ export class ProcessManager {
|
|
|
73
73
|
this.backoffMs = this.opts.initialBackoffMs
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
/** Start the process. Returns immediately
|
|
76
|
+
/** Start the process. Returns immediately, the process runs in the background. */
|
|
77
77
|
start(): void {
|
|
78
78
|
this.stopped = false
|
|
79
79
|
this.spawn()
|
|
@@ -201,7 +201,7 @@ export class ProcessManager {
|
|
|
201
201
|
mkdirSync(this.opts.pidDir, { recursive: true })
|
|
202
202
|
writeFileSync(join(this.opts.pidDir, `${this.opts.label}.pid`), String(pid))
|
|
203
203
|
} catch {
|
|
204
|
-
// Non-fatal
|
|
204
|
+
// Non-fatal: PID tracking is best-effort.
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
|
|
@@ -209,7 +209,7 @@ export class ProcessManager {
|
|
|
209
209
|
try {
|
|
210
210
|
await unlink(join(this.opts.pidDir, `${this.opts.label}.pid`))
|
|
211
211
|
} catch {
|
|
212
|
-
// Ignore
|
|
212
|
+
// Ignore: file may already be gone.
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
}
|
package/src/project-config.ts
CHANGED
|
@@ -21,7 +21,7 @@ export interface SupatypeProjectConfig {
|
|
|
21
21
|
root?: string
|
|
22
22
|
}
|
|
23
23
|
project: {
|
|
24
|
-
/** Project name
|
|
24
|
+
/** Project name: used for per-project state dirs and logging. */
|
|
25
25
|
name: string
|
|
26
26
|
/** Cloud project reference (set by `supatype link`). */
|
|
27
27
|
ref?: string
|
|
@@ -32,7 +32,7 @@ export interface SupatypeProjectConfig {
|
|
|
32
32
|
* "native" = supatype manages a native Postgres binary (downloaded from CDN).
|
|
33
33
|
* "docker" = supatype runs supatype/postgres via Docker (includes all extensions).
|
|
34
34
|
*
|
|
35
|
-
* Omitted when `external` is set
|
|
35
|
+
* Omitted when `external` is set, there is no backend for Supatype to choose.
|
|
36
36
|
*/
|
|
37
37
|
provider?: "native" | "docker"
|
|
38
38
|
/**
|
|
@@ -50,7 +50,7 @@ export interface SupatypeProjectConfig {
|
|
|
50
50
|
* Postgres URL for every service in the stack.
|
|
51
51
|
*
|
|
52
52
|
* The role in it owns the schema and runs migrations. PostgREST connects as `authenticator`
|
|
53
|
-
* separately
|
|
53
|
+
* separately: see `supatype db check`, which reports what this database is missing.
|
|
54
54
|
*/
|
|
55
55
|
url: string
|
|
56
56
|
/**
|
|
@@ -215,12 +215,12 @@ export interface SupatypeProjectConfig {
|
|
|
215
215
|
/**
|
|
216
216
|
* Schemas the REST API exposes, in order (`PGRST_DB_SCHEMA`).
|
|
217
217
|
*
|
|
218
|
-
* Defaults to `pg_schema` plus the ones the stack needs for itself
|
|
219
|
-
* views, `graphql_public`, `auth
|
|
218
|
+
* Defaults to `pg_schema` plus the ones the stack needs for itself, `supatype` for Studio's
|
|
219
|
+
* views, `graphql_public`, `auth`: so setting `pg_schema` alone does the sensible thing.
|
|
220
220
|
*
|
|
221
221
|
* It used to be a hardcoded literal, which meant choosing a non-`public` `pg_schema` gave you
|
|
222
222
|
* a correct push and an API that answered `PGRST106` for everything: the engine had moved and
|
|
223
|
-
* PostgREST had not been told. State this explicitly when you need a different set
|
|
223
|
+
* PostgREST had not been told. State this explicitly when you need a different set, an extra
|
|
224
224
|
* schema of your own, or to stop exposing one.
|
|
225
225
|
*/
|
|
226
226
|
api_schemas?: readonly string[]
|
|
@@ -238,7 +238,7 @@ export interface SupatypeProjectConfig {
|
|
|
238
238
|
*
|
|
239
239
|
* **Model hooks are not listed here and do not need to be.** A hook is procedural: only the API
|
|
240
240
|
* server calls it, around a write the caller was already permitted to make, and the gateway
|
|
241
|
-
* refuses its route from outside
|
|
241
|
+
* refuses its route from outside, so there is no attacker to withhold it from, and the trust is
|
|
242
242
|
* the same a trigger already has.
|
|
243
243
|
*/
|
|
244
244
|
serviceRole?: readonly string[]
|
|
@@ -430,7 +430,7 @@ function validateExternalDatabase(cfg: Record<string, unknown>, filename: string
|
|
|
430
430
|
const url = (external as Record<string, unknown>)["url"]
|
|
431
431
|
if (typeof url !== "string" || url.trim().length === 0) {
|
|
432
432
|
throw new Error(
|
|
433
|
-
`${filename}: database.external.url is required
|
|
433
|
+
`${filename}: database.external.url is required, the Postgres URL every service connects to.\n` +
|
|
434
434
|
"Reading it from the environment keeps the password out of version control:\n" +
|
|
435
435
|
" database: { external: { url: process.env.DATABASE_URL! } }\n" +
|
|
436
436
|
"The project's .env is loaded before the config module, so DATABASE_URL there is enough.",
|
|
@@ -450,7 +450,7 @@ function validateExternalDatabase(cfg: Record<string, unknown>, filename: string
|
|
|
450
450
|
if (database["provider"] !== undefined) {
|
|
451
451
|
throw new Error(
|
|
452
452
|
`${filename}: database.provider ("${String(database["provider"])}") and database.external ` +
|
|
453
|
-
"cannot both be set
|
|
453
|
+
"cannot both be set, provider chooses a Postgres for Supatype to run, external says one " +
|
|
454
454
|
"already exists.\n" +
|
|
455
455
|
"Remove database.provider. The runtime stack is still chosen by the top-level `provider`.",
|
|
456
456
|
)
|
|
@@ -459,7 +459,7 @@ function validateExternalDatabase(cfg: Record<string, unknown>, filename: string
|
|
|
459
459
|
const server = cfg["server"] as Record<string, unknown> | undefined
|
|
460
460
|
if (server?.["mode"] === "managed") {
|
|
461
461
|
throw new Error(
|
|
462
|
-
`${filename}: database.external is not supported with server.mode "managed"
|
|
462
|
+
`${filename}: database.external is not supported with server.mode "managed", on the cloud ` +
|
|
463
463
|
"path the database is part of what is being provided.\n" +
|
|
464
464
|
"Use an external database with a self-hosted stack (server.mode \"dev\" or \"standalone\").",
|
|
465
465
|
)
|
|
@@ -469,7 +469,7 @@ function validateExternalDatabase(cfg: Record<string, unknown>, filename: string
|
|
|
469
469
|
if (typeof connection === "string" && connection.trim() !== url.trim()) {
|
|
470
470
|
throw new Error(
|
|
471
471
|
`${filename}: connection and database.external.url are both set and disagree.\n` +
|
|
472
|
-
"database.external.url is what the whole stack uses, CLI commands included
|
|
472
|
+
"database.external.url is what the whole stack uses, CLI commands included, remove " +
|
|
473
473
|
"`connection`.",
|
|
474
474
|
)
|
|
475
475
|
}
|
|
@@ -496,11 +496,11 @@ export function functionsPathCandidatesFromProject(cfg: SupatypeProjectConfig, c
|
|
|
496
496
|
}
|
|
497
497
|
|
|
498
498
|
/**
|
|
499
|
-
* Directory holding **model hooks
|
|
499
|
+
* Directory holding **model hooks**, procedural handlers the API calls around a write.
|
|
500
500
|
*
|
|
501
501
|
* Separate from `functions/` because the two have different trust models: a function is a public
|
|
502
502
|
* endpoint anyone with the anon key may invoke, while a hook is only ever called by the server. One
|
|
503
|
-
* worker serves both, and the gateway refuses the hook namespace from outside
|
|
503
|
+
* worker serves both, and the gateway refuses the hook namespace from outside, so keeping them in
|
|
504
504
|
* separate directories is what makes that boundary structural rather than a list to maintain.
|
|
505
505
|
*/
|
|
506
506
|
export function hooksPathFromProject(cfg: SupatypeProjectConfig, cwd: string): string {
|
|
@@ -565,7 +565,7 @@ export function resolveRuntimeProvider(cfg: SupatypeProjectConfig): "native" | "
|
|
|
565
565
|
*
|
|
566
566
|
* Resolved here rather than in the compose template so there is one definition of the format.
|
|
567
567
|
*
|
|
568
|
-
* This does **not** check that the names exist
|
|
568
|
+
* This does **not** check that the names exist, it cannot, since it has only the config. An earlier
|
|
569
569
|
* version of this comment claimed a typo was "visible in one place rather than silently granting
|
|
570
570
|
* nothing", which was false: nothing read the list except the two callers that turn it into an env var.
|
|
571
571
|
* `checkServiceRoleRoutes` in `service-role-check.ts` is what actually resolves the names, and `push`
|
|
@@ -614,7 +614,7 @@ export function externalDatabaseUrl(cfg: SupatypeProjectConfig): string | undefi
|
|
|
614
614
|
* Whether realtime should run.
|
|
615
615
|
*
|
|
616
616
|
* `false` only when stated. An external database that cannot support logical replication is detected
|
|
617
|
-
* rather than declared
|
|
617
|
+
* rather than declared: the capability record is what Studio and `doctor` read, so an operator who
|
|
618
618
|
* has not thought about it gets a truthful answer instead of a silent default.
|
|
619
619
|
*/
|
|
620
620
|
export function realtimeEnabled(cfg: SupatypeProjectConfig): boolean {
|
|
@@ -643,7 +643,7 @@ export const STACK_API_SCHEMAS = ["supatype", "graphql_public", "auth"] as const
|
|
|
643
643
|
* while PostgREST kept serving `public`, so every request answered `PGRST106` and nothing in the
|
|
644
644
|
* output mentioned the setting that caused it.
|
|
645
645
|
*
|
|
646
|
-
* `api_schemas` replaces the whole list when stated
|
|
646
|
+
* `api_schemas` replaces the whole list when stated, including the stack schemas, so dropping
|
|
647
647
|
* `supatype` from it is a supported way to stop exposing Studio's views. Order is preserved and
|
|
648
648
|
* duplicates removed: PostgREST serves the first entry as the default profile, so the managed
|
|
649
649
|
* schema has to lead.
|
package/src/pull-utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Utilities for `pull` and `introspect
|
|
2
|
+
* Utilities for `pull` and `introspect`, map engine DatabaseState to Model<> scaffold.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export interface DbColumnState {
|
|
@@ -104,7 +104,7 @@ export function pgTypeToModelField(col: ColumnInfo): string {
|
|
|
104
104
|
const base = name.replace(/_id$/, "")
|
|
105
105
|
const rel = base.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase())
|
|
106
106
|
const relName = rel.charAt(0).toUpperCase() + rel.slice(1)
|
|
107
|
-
return `${name}: UUID\n // TODO: relation
|
|
107
|
+
return `${name}: UUID\n // TODO: relation, RelatedTo<"${relName}">`
|
|
108
108
|
}
|
|
109
109
|
if (name === "created_at" || name === "updated_at") {
|
|
110
110
|
return `${name}: Timestamp`
|
|
@@ -160,7 +160,7 @@ export function databaseStateToSchemaScaffold(state: DatabaseStateJson): string
|
|
|
160
160
|
const skipTables = new Set(["spatial_ref_sys", "schema_migrations"])
|
|
161
161
|
|
|
162
162
|
const lines: string[] = [
|
|
163
|
-
"// DRAFT
|
|
163
|
+
"// DRAFT: generated by `supatype pull`. Review access rules, relations, and indexes before push.",
|
|
164
164
|
'import type { Model, Public, UUID, Timestamp, Optional, Unique, Email, Slug, SupatypeAuthUserId, JSON, Int, BigInt } from "@supatype/types"',
|
|
165
165
|
"",
|
|
166
166
|
]
|
|
@@ -231,7 +231,7 @@ export function printIntrospectSummary(state: DatabaseStateJson): void {
|
|
|
231
231
|
}
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
/** @deprecated Legacy pull helper
|
|
234
|
+
/** @deprecated Legacy pull helper, use {@link pgTypeToModelField}. */
|
|
235
235
|
export function pgTypeToField(col: ColumnInfo): string {
|
|
236
236
|
const opts: Record<string, unknown> = { required: !col.nullable }
|
|
237
237
|
if (col.isPrimary) opts["primaryKey"] = true
|
package/src/realtime-launch.ts
CHANGED
|
@@ -46,7 +46,7 @@ export async function resolveRealtimeLaunch(
|
|
|
46
46
|
return { bin: process.execPath, args: [entry] }
|
|
47
47
|
}
|
|
48
48
|
throw new Error(
|
|
49
|
-
"realtime binary not available
|
|
49
|
+
"realtime binary not available, run `supatype update` or set overrides.realtime in supatype.config.ts",
|
|
50
50
|
)
|
|
51
51
|
}
|
|
52
52
|
}
|
package/src/release-pins.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Release pins read from files under packages/cli/releases/.
|
|
3
|
-
* CI (deno-releases workflow) uses the same paths
|
|
3
|
+
* CI (deno-releases workflow) uses the same paths, bump only releases/deno/VERSION.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { readFileSync } from "node:fs"
|
|
@@ -17,7 +17,7 @@ function readPinFile(...segments: string[]): string {
|
|
|
17
17
|
} catch {
|
|
18
18
|
throw new Error(
|
|
19
19
|
`Missing release pin file: ${path}\n` +
|
|
20
|
-
"Expected packages/cli/releases
|
|
20
|
+
"Expected packages/cli/releases/…: reinstall @supatype/cli or build from the monorepo.",
|
|
21
21
|
)
|
|
22
22
|
}
|
|
23
23
|
const version = raw.trim()
|
package/src/resolve-api-url.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Resolve the project API base URL (Kong gateway or direct server) for CLI HTTP calls.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { loadConfig } from "./config.js"
|
|
5
|
+
import { loadConfig, rethrowIfConfigBroken } from "./config.js"
|
|
6
6
|
import { readEnvValue } from "./env-file.js"
|
|
7
7
|
import { serverBaseUrl } from "./project-config.js"
|
|
8
8
|
|
|
@@ -34,8 +34,9 @@ export function resolveProjectApiUrl(cwd: string): string {
|
|
|
34
34
|
if (fromConfig) {
|
|
35
35
|
return fromConfig.replace(/\/+$/, "")
|
|
36
36
|
}
|
|
37
|
-
} catch {
|
|
38
|
-
|
|
37
|
+
} catch (err) {
|
|
38
|
+
rethrowIfConfigBroken(err)
|
|
39
|
+
// No supatype.config: fall through to PORT default.
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
const port = readEnvValue(cwd, "PORT", "54321").trim() || "54321"
|
package/src/resolve-target.ts
CHANGED
|
@@ -48,7 +48,7 @@ export interface DeployTarget {
|
|
|
48
48
|
refreshToken?: string | undefined
|
|
49
49
|
orgId?: string | undefined
|
|
50
50
|
link: ProjectLink | null
|
|
51
|
-
/** Project cwd
|
|
51
|
+
/** Project cwd: needed to persist refreshed cloud tokens. */
|
|
52
52
|
cwd?: string
|
|
53
53
|
/** Engine subprocess path when mode is direct or local without control plane. */
|
|
54
54
|
databaseUrl?: string
|
package/src/rest-cache-admin.ts
CHANGED
|
@@ -34,7 +34,7 @@ function serviceRoleKey(cwd: string): string {
|
|
|
34
34
|
readEnvValue(cwd, "SUPATYPE_SERVICE_ROLE_KEY", "").trim() ||
|
|
35
35
|
readEnvValue(cwd, "SERVICE_ROLE_KEY", "").trim()
|
|
36
36
|
if (!key) {
|
|
37
|
-
throw new Error("SERVICE_ROLE_KEY not found in .env
|
|
37
|
+
throw new Error("SERVICE_ROLE_KEY not found in .env, run supatype dev or supatype keys")
|
|
38
38
|
}
|
|
39
39
|
return key.trim()
|
|
40
40
|
}
|
|
@@ -66,7 +66,7 @@ function formatCacheApiError(
|
|
|
66
66
|
return "REST server cache is not available on this plan or deployment."
|
|
67
67
|
}
|
|
68
68
|
if (status === 503 && trimmed.includes("valkey")) {
|
|
69
|
-
return "Valkey is not configured
|
|
69
|
+
return "Valkey is not configured, server-side REST cache requires Valkey (supatype dev with docker)."
|
|
70
70
|
}
|
|
71
71
|
return `${operation} failed (${status}): ${trimmed || "(empty body)"}`
|
|
72
72
|
}
|
package/src/runtime-routes.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface RuntimeRouteOptions {
|
|
|
17
17
|
functionsServiceUrl?: string
|
|
18
18
|
/**
|
|
19
19
|
* Self-host Compose: Kong forwards API traffic to supatype-server (unified gateway),
|
|
20
|
-
* which proxies to internal services
|
|
20
|
+
* which proxies to internal services, same model as `supatype dev`.
|
|
21
21
|
*/
|
|
22
22
|
unifiedGateway?: boolean
|
|
23
23
|
/** Studio UI upstream (default: in-compose `studio:3002`). */
|
|
@@ -161,7 +161,7 @@ function runtimeRouteSpecUnified(opts: RuntimeRouteOptions): RuntimeRoute[] {
|
|
|
161
161
|
|
|
162
162
|
/**
|
|
163
163
|
* Legacy split-stack routes (PostgREST/storage/realtime directly from Kong).
|
|
164
|
-
* Kept for tests or explicit opt-out only
|
|
164
|
+
* Kept for tests or explicit opt-out only, self-host uses unifiedGateway.
|
|
165
165
|
*/
|
|
166
166
|
function runtimeRouteSpecSplit(opts: RuntimeRouteOptions): RuntimeRoute[] {
|
|
167
167
|
const studioUrl = studioServiceUrl(opts)
|
package/src/schema-ast-v2.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AST v2 wire format
|
|
2
|
+
* AST v2 wire format, canonical types and emitters.
|
|
3
3
|
* Parsers build {@link ParsedField}; only `emitField` / `emitModel` / `emitSchema` produce JSON.
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -30,7 +30,7 @@ export interface FieldAnnotations {
|
|
|
30
30
|
platform?: PlatformFieldAnnotations
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
/** Kernel facts only
|
|
33
|
+
/** Kernel facts only: never db/platform keys at this layer. */
|
|
34
34
|
export interface KernelFieldFacts {
|
|
35
35
|
required?: boolean
|
|
36
36
|
primaryKey?: boolean
|
|
@@ -62,7 +62,7 @@ export interface KernelFieldFacts {
|
|
|
62
62
|
index?: boolean
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
/** Internal parse result
|
|
65
|
+
/** Internal parse result: not serialized. */
|
|
66
66
|
export interface ParsedField {
|
|
67
67
|
kind: string
|
|
68
68
|
kernel: KernelFieldFacts
|
|
@@ -302,7 +302,7 @@ export function emitModel(
|
|
|
302
302
|
options,
|
|
303
303
|
annotations: {
|
|
304
304
|
db: { tableName, indexes },
|
|
305
|
-
// Hooks sit in `platform` beside `access`: they are an API-layer concern, not a column one
|
|
305
|
+
// Hooks sit in `platform` beside `access`: they are an API-layer concern, not a column one,
|
|
306
306
|
// supatype-server reads them, Postgres never sees them.
|
|
307
307
|
platform: { access, ...(Object.keys(hooks).length > 0 && { hooks }) },
|
|
308
308
|
},
|
package/src/schema-push-lock.ts
CHANGED
|
@@ -87,7 +87,7 @@ export async function withComposeSchemaPushLock<T>(
|
|
|
87
87
|
//
|
|
88
88
|
// Killing the local `docker` client does not stop the process inside the container: `docker
|
|
89
89
|
// compose exec` does not forward the signal. With a sleeping session that meant every push
|
|
90
|
-
// left a backend holding this advisory lock for 24 hours
|
|
90
|
+
// left a backend holding this advisory lock for 24 hours, so `supatype push` never exited and
|
|
91
91
|
// the next push blocked on it. Observed end-to-end before this change.
|
|
92
92
|
//
|
|
93
93
|
// Closing stdin *does* propagate: psql sees EOF, exits, and the session ends, which is what
|
|
@@ -102,7 +102,7 @@ export async function withComposeSchemaPushLock<T>(
|
|
|
102
102
|
holder.stdin?.write(
|
|
103
103
|
`SELECT pg_advisory_lock(${SCHEMA_PUSH_LOCK_CLASSID}, ${SCHEMA_PUSH_LOCK_OBJID});\n`,
|
|
104
104
|
)
|
|
105
|
-
// Deliberately not ended
|
|
105
|
+
// Deliberately not ended: the open pipe is what keeps the session, and the lock, alive.
|
|
106
106
|
holder.stderr?.on("data", (chunk: Buffer) => {
|
|
107
107
|
stderrBuf += chunk.toString()
|
|
108
108
|
})
|
|
@@ -131,7 +131,7 @@ export async function withComposeSchemaPushLock<T>(
|
|
|
131
131
|
/**
|
|
132
132
|
* End the holder session, then confirm the lock is actually gone.
|
|
133
133
|
*
|
|
134
|
-
* Closing stdin is the mechanism; the check is because a leaked holder is silent and expensive
|
|
134
|
+
* Closing stdin is the mechanism; the check is because a leaked holder is silent and expensive,
|
|
135
135
|
* it blocks every later push. If EOF did not do it, terminate the backend directly.
|
|
136
136
|
*/
|
|
137
137
|
async function releaseHolder(
|