@supatype/cli 0.1.6 → 0.1.9
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 +152 -102
- package/.turbo/turbo-typecheck.log +1 -1
- package/LICENSE +202 -0
- package/deno.d.ts +52 -0
- package/dist/app/framework.js +1 -1
- package/dist/app/framework.js.map +1 -1
- package/dist/augmentation-generator.d.ts +22 -0
- package/dist/augmentation-generator.d.ts.map +1 -1
- package/dist/augmentation-generator.js +19 -5
- package/dist/augmentation-generator.js.map +1 -1
- package/dist/binary-cache.d.ts +42 -6
- package/dist/binary-cache.d.ts.map +1 -1
- package/dist/binary-cache.js +76 -44
- package/dist/binary-cache.js.map +1 -1
- package/dist/cache-clean.d.ts +15 -0
- package/dist/cache-clean.d.ts.map +1 -0
- package/dist/cache-clean.js +76 -0
- package/dist/cache-clean.js.map +1 -0
- package/dist/cache-pins.d.ts +51 -0
- package/dist/cache-pins.d.ts.map +1 -0
- package/dist/cache-pins.js +184 -0
- package/dist/cache-pins.js.map +1 -0
- 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 +27 -0
- package/dist/cli-install-method.d.ts.map +1 -0
- package/dist/cli-install-method.js +78 -0
- package/dist/cli-install-method.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/cloud-credentials.d.ts +34 -0
- package/dist/cloud-credentials.d.ts.map +1 -0
- package/dist/cloud-credentials.js +139 -0
- package/dist/cloud-credentials.js.map +1 -0
- package/dist/commands/add.js +1 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/admin.d.ts +11 -0
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +123 -21
- 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.d.ts.map +1 -1
- package/dist/commands/cache.js +69 -73
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/cloud.d.ts.map +1 -1
- package/dist/commands/cloud.js +32 -8
- package/dist/commands/cloud.js.map +1 -1
- package/dist/commands/db.d.ts +3 -2
- package/dist/commands/db.d.ts.map +1 -1
- package/dist/commands/db.js +149 -3
- 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.d.ts.map +1 -1
- package/dist/commands/dev.js +63 -23
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +28 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +60 -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 +7 -0
- package/dist/commands/functions.d.ts.map +1 -1
- package/dist/commands/functions.js +45 -11
- package/dist/commands/functions.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +5 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/hooks.d.ts +12 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +118 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +64 -30
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/internal.d.ts +6 -0
- package/dist/commands/internal.d.ts.map +1 -0
- package/dist/commands/internal.js +22 -0
- package/dist/commands/internal.js.map +1 -0
- package/dist/commands/link-helpers.d.ts.map +1 -1
- package/dist/commands/link-helpers.js +8 -2
- package/dist/commands/link-helpers.js.map +1 -1
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +110 -0
- package/dist/commands/login.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/commands/push.js +110 -7
- 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 +3 -2
- package/dist/commands/self-update.d.ts.map +1 -1
- package/dist/commands/self-update.js +31 -16
- 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 +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -4
- package/dist/config.js.map +1 -1
- package/dist/db-preflight.d.ts +78 -0
- package/dist/db-preflight.d.ts.map +1 -0
- package/dist/db-preflight.js +452 -0
- package/dist/db-preflight.js.map +1 -0
- package/dist/dev-compose.d.ts +4 -4
- package/dist/dev-compose.d.ts.map +1 -1
- package/dist/dev-compose.js +143 -88
- 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 +40 -2
- package/dist/env-file.d.ts.map +1 -1
- package/dist/env-file.js +132 -11
- package/dist/env-file.js.map +1 -1
- package/dist/field-masking-tier.d.ts +50 -0
- package/dist/field-masking-tier.d.ts.map +1 -0
- package/dist/field-masking-tier.js +91 -0
- package/dist/field-masking-tier.js.map +1 -0
- package/dist/functions-deno-types.d.ts +24 -0
- package/dist/functions-deno-types.d.ts.map +1 -0
- package/dist/functions-deno-types.js +155 -0
- package/dist/functions-deno-types.js.map +1 -0
- 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 +30 -0
- package/dist/hook-upload.d.ts.map +1 -0
- package/dist/hook-upload.js +86 -0
- package/dist/hook-upload.js.map +1 -0
- package/dist/hooks-generator.d.ts +8 -0
- package/dist/hooks-generator.d.ts.map +1 -0
- package/dist/hooks-generator.js +332 -0
- package/dist/hooks-generator.js.map +1 -0
- 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 +4 -0
- package/dist/link.d.ts.map +1 -1
- package/dist/link.js +2 -0
- package/dist/link.js.map +1 -1
- package/dist/local-secrets.d.ts +71 -0
- package/dist/local-secrets.d.ts.map +1 -0
- package/dist/local-secrets.js +100 -0
- package/dist/local-secrets.js.map +1 -0
- 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 +73 -0
- package/dist/model-hooks.d.ts.map +1 -0
- package/dist/model-hooks.js +211 -0
- package/dist/model-hooks.js.map +1 -0
- 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 +12 -1
- package/dist/postgres-ctl.d.ts.map +1 -1
- package/dist/postgres-ctl.js +28 -5
- 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 +122 -2
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +150 -1
- 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.js +1 -1
- package/dist/resolve-api-url.js.map +1 -1
- package/dist/resolve-target.d.ts +4 -0
- package/dist/resolve-target.d.ts.map +1 -1
- package/dist/resolve-target.js +69 -73
- package/dist/resolve-target.js.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 +5 -4
- package/dist/schema-ast-v2.d.ts.map +1 -1
- package/dist/schema-ast-v2.js +5 -3
- package/dist/schema-ast-v2.js.map +1 -1
- package/dist/schema-push-lock.d.ts.map +1 -1
- package/dist/schema-push-lock.js +43 -16
- 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 +26 -2
- package/dist/self-host-compose.d.ts.map +1 -1
- package/dist/self-host-compose.js +305 -73
- package/dist/self-host-compose.js.map +1 -1
- package/dist/service-role-check.d.ts +21 -0
- package/dist/service-role-check.d.ts.map +1 -0
- package/dist/service-role-check.js +85 -0
- package/dist/service-role-check.js.map +1 -0
- 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.d.ts +17 -0
- package/dist/target-client.d.ts.map +1 -1
- package/dist/target-client.js +69 -17
- package/dist/target-client.js.map +1 -1
- package/dist/tsx-runner.js +1 -1
- package/dist/tsx-runner.js.map +1 -1
- package/dist/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor.js +738 -34
- 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 +2 -2
- 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.d.ts.map +1 -1
- package/dist/ui/runtime/stdin-after-ink.js +4 -2
- 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 +6 -2
- package/scripts/build-release-artifacts.sh +112 -0
- package/scripts/generate-homebrew-formula.mjs +123 -0
- 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 +19 -6
- package/src/binary-cache.ts +94 -47
- package/src/cache-clean.ts +81 -0
- package/src/cache-pins.ts +243 -0
- package/src/cli-artifacts.ts +65 -0
- package/src/cli-install-method.ts +87 -0
- 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 +7 -1
- package/src/cloud-credentials.ts +183 -0
- package/src/commands/add.ts +1 -1
- package/src/commands/admin.ts +142 -27
- package/src/commands/adopt.ts +1 -1
- package/src/commands/app.ts +2 -2
- package/src/commands/cache.ts +92 -77
- package/src/commands/cloud.ts +32 -8
- package/src/commands/db.ts +164 -3
- package/src/commands/deploy.ts +12 -12
- package/src/commands/dev.ts +72 -23
- package/src/commands/doctor.ts +69 -3
- package/src/commands/engine.ts +1 -1
- package/src/commands/functions.ts +47 -10
- package/src/commands/generate.ts +5 -1
- package/src/commands/hooks.ts +138 -0
- package/src/commands/init.ts +65 -31
- package/src/commands/internal.ts +23 -0
- package/src/commands/link-helpers.ts +9 -2
- package/src/commands/login.ts +127 -0
- 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 +124 -7
- package/src/commands/self-host.ts +1 -1
- package/src/commands/self-update.ts +41 -19
- package/src/commands/status.ts +1 -1
- package/src/commands/update.ts +1 -1
- package/src/config.ts +23 -4
- package/src/db-preflight.ts +575 -0
- package/src/dev-compose.ts +158 -89
- 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 +157 -11
- package/src/field-masking-tier.ts +107 -0
- package/src/functions-deno-types.ts +188 -0
- package/src/functions-router-gen.ts +1 -1
- package/src/gitignore.ts +3 -3
- package/src/hook-upload.ts +107 -0
- package/src/hooks-generator.ts +352 -0
- package/src/index.ts +1 -1
- package/src/init-project-detect.ts +1 -1
- package/src/link.ts +7 -0
- package/src/local-secrets.ts +104 -0
- package/src/main.ts +20 -0
- package/src/model-hooks.ts +260 -0
- package/src/pgbouncer-userlist.ts +2 -2
- package/src/postgres-ctl.ts +32 -5
- package/src/process-manager.ts +4 -4
- package/src/project-config.ts +237 -3
- 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 +1 -1
- package/src/resolve-target.ts +113 -68
- package/src/rest-cache-admin.ts +2 -2
- package/src/runtime-routes.ts +2 -2
- package/src/schema-ast-v2.ts +8 -5
- package/src/schema-push-lock.ts +56 -17
- package/src/scripts/postinstall.ts +1 -1
- package/src/self-host-compose.ts +348 -72
- package/src/service-role-check.ts +111 -0
- 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 +105 -18
- package/src/tsx-runner.ts +1 -1
- package/src/type-extractor.ts +885 -30
- 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 +2 -2
- package/src/ui/runtime/run-clack-flow.tsx +1 -1
- package/src/ui/runtime/stdin-after-ink.ts +4 -2
- package/src/ui/theme.ts +1 -1
- package/src/valkey-sidecar.ts +2 -2
- package/tests/access-composition.test.ts +667 -0
- package/tests/admin-studio-membership.test.ts +121 -0
- package/tests/api-schemas.test.ts +83 -0
- package/tests/archive-name-alias.test.ts +42 -0
- package/tests/augmentation-generator.test.ts +28 -0
- package/tests/cache-clean.test.ts +206 -0
- package/tests/cli-help.test.ts +11 -2
- package/tests/cli-install-method.test.ts +66 -0
- package/tests/command-chrome-coverage.test.ts +31 -26
- package/tests/command-chrome-wrap.test.ts +1 -0
- package/tests/db-preflight.test.ts +72 -0
- package/tests/doctor-render.test.ts +62 -0
- package/tests/doctor-service-role.test.ts +55 -0
- package/tests/engine-push-output.test.ts +1 -1
- package/tests/env-file.test.ts +121 -0
- package/tests/external-database-compose.test.ts +184 -0
- package/tests/external-database-config.test.ts +154 -0
- package/tests/field-masking-tier.test.ts +184 -0
- package/tests/functions-deno-types.test.ts +197 -0
- package/tests/homebrew-formula.test.ts +100 -0
- package/tests/hook-upload.test.ts +125 -0
- package/tests/hooks-generator.test.ts +212 -0
- package/tests/init.test.ts +5 -2
- package/tests/keys.test.ts +8 -2
- package/tests/local-secrets.test.ts +92 -0
- package/tests/model-hooks.test.ts +322 -0
- package/tests/runtime-contract.test.ts +113 -1
- package/tests/service-role-check.test.ts +109 -0
- package/tests/service-role-routes.test.ts +51 -0
- package/tests/storage-provision.test.ts +1 -1
- package/tests/target-client-refresh.test.ts +94 -0
- package/tests/type-extractor.test.ts +187 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +7 -1
- package/scripts/build-release-bundle.mjs +0 -27
- package/tests/engine-distribution.test.ts +0 -418
package/src/commands/push.ts
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import type { Command } from "commander"
|
|
2
|
-
import { mkdirSync, writeFileSync } from "node:fs"
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
|
|
3
3
|
import { join } from "node:path"
|
|
4
4
|
import { loadConfig, loadSchemaAst } from "../config.js"
|
|
5
|
-
import {
|
|
5
|
+
import { syncManifestHooks, validateModelHooks, writeHooksModule } from "../model-hooks.js"
|
|
6
|
+
import { adapterEntry, readHookUpload } from "../hook-upload.js"
|
|
7
|
+
import { checkServiceRoleRoutes, serviceRoleProblemLines } from "../service-role-check.js"
|
|
8
|
+
import { fatalError } from "../ui/fatal.js"
|
|
9
|
+
import {
|
|
10
|
+
hooksPathFromProject,
|
|
11
|
+
resolveRuntimeProvider,
|
|
12
|
+
schemaPathFromProject,
|
|
13
|
+
serverBaseUrl,
|
|
14
|
+
} from "../project-config.js"
|
|
6
15
|
import { ensureEngine, engineRequest, type DiffResult } from "../engine-client.js"
|
|
7
16
|
import { printDiffOperations, printDiffWarnings } from "../diff-output.js"
|
|
8
17
|
import { signJwt } from "../jwt.js"
|
|
@@ -20,6 +29,7 @@ import {
|
|
|
20
29
|
type DeployTarget,
|
|
21
30
|
} from "../resolve-target.js"
|
|
22
31
|
import { loadProjectLink } from "../link.js"
|
|
32
|
+
import { targetFetch } from "../target-client.js"
|
|
23
33
|
import {
|
|
24
34
|
buildSchemaSourcesPayload,
|
|
25
35
|
cacheSchemaSourcesLocally,
|
|
@@ -54,6 +64,8 @@ export function registerPush(program: Command): void {
|
|
|
54
64
|
const config = loadConfig(cwd)
|
|
55
65
|
const pgSchema = schemaPgSchema(cwd)
|
|
56
66
|
const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd)
|
|
67
|
+
assertModelHooksResolve(cwd, config, ast)
|
|
68
|
+
assertServiceRoleGrantsResolve(cwd, config)
|
|
57
69
|
|
|
58
70
|
const linked = loadProjectLink(cwd)
|
|
59
71
|
const useDirect = opts.direct || opts.local || Boolean(opts.connection)
|
|
@@ -143,6 +155,10 @@ async function pushViaTarget(
|
|
|
143
155
|
}
|
|
144
156
|
}
|
|
145
157
|
|
|
158
|
+
if (target.mode === "cloud" || target.mode === "self-host") {
|
|
159
|
+
await deployHooksToTarget(cwd, config, target, ast)
|
|
160
|
+
}
|
|
161
|
+
|
|
146
162
|
if (target.mode === "direct" || target.mode === "local") {
|
|
147
163
|
await writeLocalAdminConfig(ast, config)
|
|
148
164
|
if (target.databaseUrl) {
|
|
@@ -150,17 +166,86 @@ async function pushViaTarget(
|
|
|
150
166
|
}
|
|
151
167
|
await generateTypesLocal(ast, config)
|
|
152
168
|
await provisionLocalStorage(ast, config)
|
|
153
|
-
|
|
154
|
-
|
|
169
|
+
|
|
170
|
+
// Local Studio only: a cloud/self-host push must not advertise the local
|
|
171
|
+
// gateway URL from config, which may not even be running.
|
|
172
|
+
const baseUrl = (serverBaseUrl(config) ?? "").replace(/\/$/, "")
|
|
173
|
+
if (baseUrl) {
|
|
174
|
+
plain(`\nStudio: ${baseUrl}/studio/`)
|
|
175
|
+
}
|
|
176
|
+
return
|
|
155
177
|
}
|
|
156
178
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
179
|
+
info(`Pushed to ${target.mode} (${target.environment}).`)
|
|
180
|
+
const envUrl = target.link?.environments?.[target.environment]?.apiUrl?.replace(/\/$/, "")
|
|
181
|
+
if (envUrl) {
|
|
182
|
+
plain(`\nProject API: ${envUrl}`)
|
|
160
183
|
}
|
|
161
184
|
}
|
|
162
185
|
|
|
186
|
+
/**
|
|
187
|
+
* Upload the hooks this schema names to a managed stack.
|
|
188
|
+
*
|
|
189
|
+
* On `push` rather than `functions deploy`, because the hook *map* comes from the schema: the two have
|
|
190
|
+
* to move together, and a map naming a handler that was never uploaded turns every write to that table
|
|
191
|
+
* into a 503.
|
|
192
|
+
*
|
|
193
|
+
* The handler types are written locally as well. A project pushing to cloud still edits its hooks on
|
|
194
|
+
* this machine, and `hooks/_supatype/hooks.ts` is what makes them typed, it is generated, never
|
|
195
|
+
* committed, so a fresh clone that has only ever pushed to cloud would otherwise have no types at all.
|
|
196
|
+
*/
|
|
197
|
+
async function deployHooksToTarget(
|
|
198
|
+
cwd: string,
|
|
199
|
+
config: SupatypeProjectConfig,
|
|
200
|
+
target: DeployTarget,
|
|
201
|
+
ast: unknown,
|
|
202
|
+
): Promise<void> {
|
|
203
|
+
const hooksDir = hooksPathFromProject(config, cwd)
|
|
204
|
+
const hooksPath = writeHooksModule(cwd, hooksDir, ast)
|
|
205
|
+
if (hooksPath !== null) info(`Hook handler types written to ${hooksPath}`)
|
|
206
|
+
|
|
207
|
+
let upload: ReturnType<typeof readHookUpload>
|
|
208
|
+
try {
|
|
209
|
+
upload = readHookUpload(cwd, hooksDir, ast)
|
|
210
|
+
} catch (err) {
|
|
211
|
+
// Refused rather than partially uploaded: the schema is already applied, so the honest thing is to
|
|
212
|
+
// say the hooks did not deploy and why, leaving the previous ones in place.
|
|
213
|
+
fatalError(err instanceof Error ? err.message : String(err))
|
|
214
|
+
return
|
|
215
|
+
}
|
|
216
|
+
if (upload === null) return
|
|
217
|
+
|
|
218
|
+
const adapter = readGeneratedAdapter(hooksDir)
|
|
219
|
+
const handlers = adapter === null ? upload.handlers : [...upload.handlers, adapter]
|
|
220
|
+
|
|
221
|
+
await withSpinner(`Deploying ${upload.handlers.length} hook(s)`, () =>
|
|
222
|
+
targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
223
|
+
method: "POST",
|
|
224
|
+
path: `/projects/${target.projectRef}/hooks/deploy`,
|
|
225
|
+
body: { handlers, map: upload.map },
|
|
226
|
+
token: target.token!,
|
|
227
|
+
orgId: target.orgId,
|
|
228
|
+
environment: target.mode === "cloud" ? target.environment : undefined,
|
|
229
|
+
}),
|
|
230
|
+
).then(() => info(`Deployed ${upload.handlers.length} hook(s)`))
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** The generated adapter, flattened to the name handlers were rewritten to import. */
|
|
234
|
+
function readGeneratedAdapter(hooksDir: string): { name: string; source: string } | null {
|
|
235
|
+
const file = join(hooksDir, "_supatype", "hooks.ts")
|
|
236
|
+
if (!existsSync(file)) return null
|
|
237
|
+
return adapterEntry(readFileSync(file, "utf8"))
|
|
238
|
+
}
|
|
239
|
+
|
|
163
240
|
async function generateTypesLocal(ast: unknown, config: SupatypeProjectConfig): Promise<void> {
|
|
241
|
+
// Independent of `output`: a project with hooks needs its handler types whether or not it asked
|
|
242
|
+
// for client types, and the module is written next to the functions that import it.
|
|
243
|
+
const cwd = process.cwd()
|
|
244
|
+
const hooksPath = writeHooksModule(cwd, hooksPathFromProject(config, cwd), ast)
|
|
245
|
+
if (hooksPath !== null) info(`Hook handler types written to ${hooksPath}`)
|
|
246
|
+
// The server watches this file, so a changed hook takes effect without a restart.
|
|
247
|
+
if (syncManifestHooks(cwd, ast)) info("Hook map written to .supatype/manifest.json")
|
|
248
|
+
|
|
164
249
|
if (!config.output?.types && !config.output?.client) return
|
|
165
250
|
await withSpinner("Generating types", async () => {
|
|
166
251
|
await ensureEngine()
|
|
@@ -195,3 +280,35 @@ async function writeLocalAdminConfig(ast: unknown, config: SupatypeProjectConfig
|
|
|
195
280
|
restoreSystemRelationTargets(admin, ast)
|
|
196
281
|
writeFileSync(join(dir, "admin-config.json"), `${JSON.stringify(admin, null, 2)}\n`)
|
|
197
282
|
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Stop the push when a declared hook names a function that is not there.
|
|
286
|
+
*
|
|
287
|
+
* A hook is only enforcement if it runs. A typo'd name would extract cleanly, reach the manifest, and
|
|
288
|
+
* then never fire: so the write it was meant to validate would succeed and look fine. Cheaper to
|
|
289
|
+
* fail here, naming the directory searched.
|
|
290
|
+
*/
|
|
291
|
+
/**
|
|
292
|
+
* Refuse a push whose `functions.serviceRole` names a function that does not exist.
|
|
293
|
+
*
|
|
294
|
+
* The grant fails closed, which is the safe direction and the invisible one: the function reads no key
|
|
295
|
+
* at runtime, in a deploy that reported success. A warning is printed for an entry that is merely
|
|
296
|
+
* redundant, since a reader would reasonably assume the line is what does the granting.
|
|
297
|
+
*/
|
|
298
|
+
function assertServiceRoleGrantsResolve(cwd: string, config: SupatypeProjectConfig): void {
|
|
299
|
+
const problems = checkServiceRoleRoutes(config, cwd)
|
|
300
|
+
for (const warning of problems.warnings) plain(warning)
|
|
301
|
+
const lines = serviceRoleProblemLines(problems)
|
|
302
|
+
if (lines.length === 0) return
|
|
303
|
+
fatalError("functions.serviceRole names a function that does not exist.", lines, {
|
|
304
|
+
brand: { intro: "Push" },
|
|
305
|
+
})
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function assertModelHooksResolve(cwd: string, config: SupatypeProjectConfig, ast: unknown): void {
|
|
309
|
+
const problems = validateModelHooks(ast, hooksPathFromProject(config, cwd), cwd)
|
|
310
|
+
if (problems.length === 0) return
|
|
311
|
+
fatalError("A model declares a hook whose function does not exist.", problems, {
|
|
312
|
+
brand: { intro: "Push" },
|
|
313
|
+
})
|
|
314
|
+
}
|
|
@@ -1,33 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* supatype self-update
|
|
2
|
+
* supatype self-update
|
|
3
3
|
*
|
|
4
4
|
* npm-installed CLI: instruct to use `npm update -g`.
|
|
5
|
-
*
|
|
5
|
+
* Homebrew: instruct to use `brew upgrade supatype`.
|
|
6
|
+
* Standalone curl|sh installs: replace the binary from releases.supatype.com/cli/.
|
|
6
7
|
*/
|
|
7
8
|
|
|
8
9
|
import type { Command } from "commander"
|
|
9
10
|
import { copyFileSync, renameSync } from "node:fs"
|
|
10
|
-
import {
|
|
11
|
+
import { cliPackageVersion } from "../cli-package-version.js"
|
|
12
|
+
import { detectCliInstallMethod, runningBinaryPath } from "../cli-install-method.js"
|
|
11
13
|
import { downloadStandaloneCli, fetchStandaloneCliLatestVersion } from "../cli-standalone.js"
|
|
12
14
|
import { error, info, plain } from "../ui/messages.js"
|
|
13
15
|
|
|
14
|
-
function looksLikeNpmOrWorkspaceCLI(): boolean {
|
|
15
|
-
const main = process.argv[1] ?? ""
|
|
16
|
-
return (
|
|
17
|
-
main.includes("node_modules") ||
|
|
18
|
-
main.includes(`${sep}dist${sep}cli`) ||
|
|
19
|
-
main.includes(`${sep}bin${sep}supatype.js`) ||
|
|
20
|
-
Boolean(process.env["npm_execpath"]) ||
|
|
21
|
-
Boolean(process.env["npm_lifecycle_event"])
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
16
|
export function registerSelfUpdate(program: Command): void {
|
|
26
17
|
program
|
|
27
18
|
.command("self-update")
|
|
28
19
|
.description("Update the supatype CLI (npm or standalone CDN binary)")
|
|
29
|
-
.
|
|
30
|
-
|
|
20
|
+
.option("--force", "Reinstall even if the latest version is already installed")
|
|
21
|
+
.action(async (opts: { force?: boolean }) => {
|
|
22
|
+
const method = detectCliInstallMethod()
|
|
23
|
+
|
|
24
|
+
if (method === "npm") {
|
|
31
25
|
plain(
|
|
32
26
|
"This CLI was installed via npm (or runs from the package workspace).\n" +
|
|
33
27
|
"Update with:\n\n npm update -g @supatype/cli\n\n" +
|
|
@@ -36,7 +30,18 @@ export function registerSelfUpdate(program: Command): void {
|
|
|
36
30
|
return
|
|
37
31
|
}
|
|
38
32
|
|
|
39
|
-
|
|
33
|
+
if (method === "homebrew") {
|
|
34
|
+
plain(
|
|
35
|
+
"This CLI was installed via Homebrew.\n" +
|
|
36
|
+
"Update with:\n\n brew update && brew upgrade supatype\n\n" +
|
|
37
|
+
"To bump component binaries pinned in supatype.config.ts, use:\n\n supatype update\n",
|
|
38
|
+
)
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The binary on disk, not argv[1]: in a compiled binary argv[1] points into the embedded
|
|
43
|
+
// filesystem, so backing it up failed with ENOENT and no update could ever complete.
|
|
44
|
+
const currentPath = runningBinaryPath()
|
|
40
45
|
if (!currentPath) {
|
|
41
46
|
error("Could not determine current CLI path.")
|
|
42
47
|
process.exit(1)
|
|
@@ -44,21 +49,38 @@ export function registerSelfUpdate(program: Command): void {
|
|
|
44
49
|
|
|
45
50
|
try {
|
|
46
51
|
const latest = await fetchStandaloneCliLatestVersion()
|
|
47
|
-
|
|
52
|
+
const current = cliPackageVersion()
|
|
53
|
+
|
|
54
|
+
// Without this the command re-downloaded on every run: it compared nothing, so a
|
|
55
|
+
// machine already on the latest version fetched and rewrote the same binary.
|
|
56
|
+
if (latest === current && !opts.force) {
|
|
57
|
+
info(`Already on v${current}, the latest release.`)
|
|
58
|
+
plain("Reinstall anyway with `supatype self-update --force`.")
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
info(
|
|
63
|
+
latest === current
|
|
64
|
+
? `Reinstalling v${latest}...`
|
|
65
|
+
: `Downloading supatype CLI v${latest} (current: v${current})...`,
|
|
66
|
+
)
|
|
48
67
|
const downloaded = await downloadStandaloneCli(latest)
|
|
68
|
+
|
|
49
69
|
const backup = `${currentPath}.bak`
|
|
50
70
|
copyFileSync(currentPath, backup)
|
|
51
71
|
try {
|
|
52
72
|
renameSync(downloaded, currentPath)
|
|
53
|
-
} catch
|
|
73
|
+
} catch {
|
|
54
74
|
copyFileSync(downloaded, currentPath)
|
|
55
75
|
}
|
|
76
|
+
|
|
56
77
|
info(`Updated to v${latest}.`)
|
|
57
78
|
plain("Run `supatype --version` to verify.")
|
|
58
79
|
} catch (err) {
|
|
59
80
|
error(
|
|
60
81
|
`Standalone CLI self-update failed: ${(err as Error).message}\n\n` +
|
|
61
82
|
"Install or upgrade via npm:\n npm install -g @supatype/cli\n\n" +
|
|
83
|
+
"Or Homebrew:\n brew upgrade supatype\n\n" +
|
|
62
84
|
"Component binaries (engine, server, postgres, deno, realtime):\n supatype update\n",
|
|
63
85
|
)
|
|
64
86
|
process.exit(1)
|
package/src/commands/status.ts
CHANGED
package/src/commands/update.ts
CHANGED
package/src/config.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { resolve } from "node:path"
|
|
|
3
3
|
import { tmpdir } from "node:os"
|
|
4
4
|
import { join } from "node:path"
|
|
5
5
|
import { evalTsSnippet } from "./tsx-runner.js"
|
|
6
|
+
import { readEnvFile } from "./env-file.js"
|
|
6
7
|
import {
|
|
7
8
|
mergeProjectConfig,
|
|
8
9
|
validateProjectConfig,
|
|
@@ -71,7 +72,7 @@ export interface AppConfig {
|
|
|
71
72
|
headers?: Record<string, string>
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
/** Identity helper
|
|
75
|
+
/** Identity helper: provides type inference for config files. */
|
|
75
76
|
export function defineConfig(config: SupatypeProjectConfig): SupatypeProjectConfig {
|
|
76
77
|
return config
|
|
77
78
|
}
|
|
@@ -135,7 +136,25 @@ export function loadConfig(cwd: string = process.cwd()): SupatypeProjectConfig {
|
|
|
135
136
|
if (localRaw === null) return base
|
|
136
137
|
|
|
137
138
|
const localNorm = normalizeProjectJson(localRaw) as Partial<SupatypeProjectConfig>
|
|
138
|
-
|
|
139
|
+
// Re-validated after merging: the local override can reintroduce a combination the base file was
|
|
140
|
+
// rejected for: `database.provider` beside an inherited `database.external`, say, and merging
|
|
141
|
+
// has no opinion about that.
|
|
142
|
+
return validateProjectConfig(
|
|
143
|
+
mergeProjectConfig(base, localNorm),
|
|
144
|
+
"supatype.local.config.ts (merged with supatype.config.ts)",
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Environment for the child process that imports the config module.
|
|
150
|
+
*
|
|
151
|
+
* `supatype.config.ts` is TypeScript, so the natural way to keep a database password out of version
|
|
152
|
+
* control is `process.env.DATABASE_URL`: which only works if the project's `.env` is visible to the
|
|
153
|
+
* process doing the import. A real environment variable still wins over the file, matching how every
|
|
154
|
+
* other dotenv reader behaves and how Compose itself resolves the same names.
|
|
155
|
+
*/
|
|
156
|
+
function configLoadEnv(cwd: string): NodeJS.ProcessEnv {
|
|
157
|
+
return { ...readEnvFile(cwd), ...process.env }
|
|
139
158
|
}
|
|
140
159
|
|
|
141
160
|
function loadFirstTsConfig(
|
|
@@ -152,7 +171,7 @@ const mod = await import(${JSON.stringify(urlPath)})
|
|
|
152
171
|
const config = mod.default ?? mod
|
|
153
172
|
process.stdout.write(JSON.stringify(config))
|
|
154
173
|
`
|
|
155
|
-
const result = evalTsSnippet(snippet, { cwd })
|
|
174
|
+
const result = evalTsSnippet(snippet, { cwd, env: configLoadEnv(cwd) })
|
|
156
175
|
if (result.exitCode === 0) {
|
|
157
176
|
return JSON.parse(result.stdout) as Record<string, unknown>
|
|
158
177
|
}
|
|
@@ -203,7 +222,7 @@ const mod = await import(${JSON.stringify(urlPath)})
|
|
|
203
222
|
const config = mod.default ?? mod
|
|
204
223
|
process.stdout.write(JSON.stringify(config))
|
|
205
224
|
`
|
|
206
|
-
const result = evalTsSnippet(snippet, { cwd })
|
|
225
|
+
const result = evalTsSnippet(snippet, { cwd, env: configLoadEnv(cwd) })
|
|
207
226
|
if (result.exitCode !== 0) return null
|
|
208
227
|
return JSON.parse(result.stdout) as Record<string, unknown>
|
|
209
228
|
} finally {
|