@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
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check that every name in `functions.serviceRole` is a function that exists.
|
|
3
|
+
*
|
|
4
|
+
* The grant fails **closed**: a typo, or a function that has since been renamed, means that function
|
|
5
|
+
* quietly does not receive the service-role key. Nothing breaks loudly, the handler simply reads
|
|
6
|
+
* `undefined` and whatever it does with the key stops working, at runtime, in a deploy that reported
|
|
7
|
+
* success. So the name is checked where it is declared, against the directory it must match.
|
|
8
|
+
*
|
|
9
|
+
* `serviceRoleRoutes()` claimed this was already true. It was not: nothing read the list except the two
|
|
10
|
+
* places that turn it into an env var.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readdirSync, statSync } from "node:fs"
|
|
13
|
+
import { join, relative } from "node:path"
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
functionsPathCandidatesFromProject,
|
|
17
|
+
serviceRoleRoutes,
|
|
18
|
+
type SupatypeProjectConfig,
|
|
19
|
+
} from "./project-config.js"
|
|
20
|
+
|
|
21
|
+
export interface ServiceRoleProblems {
|
|
22
|
+
/** Names with no matching function. Each line is ready to print. */
|
|
23
|
+
errors: string[]
|
|
24
|
+
/** The same names, unformatted, for callers that need to mark them rather than print them. */
|
|
25
|
+
missing: string[]
|
|
26
|
+
/** Entries that are harmless but say nothing, e.g. a hook. */
|
|
27
|
+
warnings: string[]
|
|
28
|
+
/** Function names available to be granted, for the "did you mean" line. */
|
|
29
|
+
available: string[]
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Function directory names, matching how the worker discovers routes. */
|
|
33
|
+
function availableFunctions(dirs: readonly string[]): string[] {
|
|
34
|
+
const names = new Set<string>()
|
|
35
|
+
for (const dir of dirs) {
|
|
36
|
+
if (!existsSync(dir)) continue
|
|
37
|
+
for (const entry of readdirSync(dir)) {
|
|
38
|
+
if (entry.startsWith("_") || entry.startsWith(".")) continue
|
|
39
|
+
const full = join(dir, entry)
|
|
40
|
+
if (statSync(full).isDirectory()) {
|
|
41
|
+
if (existsSync(join(full, "index.ts"))) names.add(entry)
|
|
42
|
+
} else if (entry.endsWith(".ts") && !entry.endsWith(".d.ts")) {
|
|
43
|
+
names.add(entry.replace(/\.ts$/, ""))
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return [...names].sort()
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the declared grants against what is on disk.
|
|
52
|
+
*
|
|
53
|
+
* Returns the problems rather than throwing, so `push` can refuse while `doctor` reports alongside
|
|
54
|
+
* everything else it found.
|
|
55
|
+
*/
|
|
56
|
+
export function checkServiceRoleRoutes(
|
|
57
|
+
cfg: SupatypeProjectConfig,
|
|
58
|
+
cwd: string,
|
|
59
|
+
): ServiceRoleProblems {
|
|
60
|
+
const declared = serviceRoleRoutes(cfg)
|
|
61
|
+
if (declared.length === 0) return { errors: [], missing: [], warnings: [], available: [] }
|
|
62
|
+
|
|
63
|
+
const dirs = functionsPathCandidatesFromProject(cfg, cwd)
|
|
64
|
+
const available = availableFunctions(dirs)
|
|
65
|
+
const known = new Set(available)
|
|
66
|
+
// Forward slashes and the candidates listed separately: joining them into one path produced
|
|
67
|
+
// "no functions or supatype\functions/send-email/index.ts", which reads as neither a path nor a list.
|
|
68
|
+
const searched = dirs.map((dir) => (relative(cwd, dir) || dir).replace(/\\/g, "/"))
|
|
69
|
+
const primary = searched[0] ?? "functions"
|
|
70
|
+
|
|
71
|
+
const errors: string[] = []
|
|
72
|
+
const missing: string[] = []
|
|
73
|
+
const warnings: string[] = []
|
|
74
|
+
|
|
75
|
+
for (const name of declared) {
|
|
76
|
+
if (name.startsWith("hooks/")) {
|
|
77
|
+
// Not an error: it was the documented form once, and the worker grants hooks whatever this says.
|
|
78
|
+
// Still worth saying, because a reader would reasonably assume the line is what does the granting.
|
|
79
|
+
warnings.push(
|
|
80
|
+
` "${name}" is not needed, a hook receives the service-role key because only the API server ` +
|
|
81
|
+
`can reach it`,
|
|
82
|
+
)
|
|
83
|
+
continue
|
|
84
|
+
}
|
|
85
|
+
if (!known.has(name)) {
|
|
86
|
+
const where =
|
|
87
|
+
searched.length > 1 ? ` (searched ${searched.join(", ")})` : ""
|
|
88
|
+
errors.push(` "${name}": no ${primary}/${name}/index.ts${where}`)
|
|
89
|
+
missing.push(name)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return { errors, missing, warnings, available }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** The full message for a refusal, including what *is* available to name. */
|
|
97
|
+
export function serviceRoleProblemLines(problems: ServiceRoleProblems): string[] {
|
|
98
|
+
if (problems.errors.length === 0) return []
|
|
99
|
+
const lines = [...problems.errors, ""]
|
|
100
|
+
lines.push(
|
|
101
|
+
problems.available.length > 0
|
|
102
|
+
? `Functions found: ${problems.available.join(", ")}`
|
|
103
|
+
: "No functions found. Create one with: supatype functions new <name>",
|
|
104
|
+
)
|
|
105
|
+
lines.push("")
|
|
106
|
+
lines.push(
|
|
107
|
+
"A name that matches nothing grants nothing, and says so nowhere: the function reads no key at " +
|
|
108
|
+
"runtime, in a deploy that reported success.",
|
|
109
|
+
)
|
|
110
|
+
return lines
|
|
111
|
+
}
|
package/src/storage-provision.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Provision storage buckets declared in a schema AST via the storage server API.
|
|
3
3
|
*
|
|
4
|
-
* The storage server is the authority on bucket existence
|
|
4
|
+
* The storage server is the authority on bucket existence, going through the API
|
|
5
5
|
* ensures it creates any backing resources (directories, S3 buckets, etc.).
|
|
6
6
|
* Buckets already registered return 409 Conflict, which is treated as success.
|
|
7
7
|
*/
|
|
@@ -76,10 +76,10 @@ export async function provisionBuckets(
|
|
|
76
76
|
.catch(() => null)
|
|
77
77
|
|
|
78
78
|
if (res === null) {
|
|
79
|
-
console.warn(`[storage] Storage API unreachable
|
|
79
|
+
console.warn(`[storage] Storage API unreachable, skipped bucket "${bucket.id}"`)
|
|
80
80
|
continue
|
|
81
81
|
}
|
|
82
|
-
if (res.status === 409) continue // already exists
|
|
82
|
+
if (res.status === 409) continue // already exists, fine
|
|
83
83
|
if (!res.ok) {
|
|
84
84
|
const msg = await res.text().catch(() => res.statusText)
|
|
85
85
|
console.warn(`[storage] Failed to provision bucket "${bucket.id}": ${msg}`)
|
package/src/studio-dev-server.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface StudioDevServerOptions {
|
|
|
20
20
|
* so fetches hit the Vite proxy (SUPATYPE_PROXY_TARGET) and avoid CORS.
|
|
21
21
|
*/
|
|
22
22
|
viteSupatypeUrl: string
|
|
23
|
-
/** Vite `base
|
|
23
|
+
/** Vite `base`: `/studio/` when behind Kong at `/studio/`; `/` for native dev on :3002. */
|
|
24
24
|
basePath?: string
|
|
25
25
|
}
|
|
26
26
|
|
package/src/systemd.ts
CHANGED
package/src/target-client.ts
CHANGED
|
@@ -5,6 +5,61 @@ export interface TargetFetchOptions {
|
|
|
5
5
|
token: string
|
|
6
6
|
orgId?: string | undefined
|
|
7
7
|
environment?: string | undefined
|
|
8
|
+
/**
|
|
9
|
+
* Cloud-only: renew short-lived access JWT via control-plane `/auth/refresh`.
|
|
10
|
+
* Self-host SERVICE_ROLE_KEY links omit this.
|
|
11
|
+
*/
|
|
12
|
+
authRefresh?: {
|
|
13
|
+
cloudApiUrl: string
|
|
14
|
+
refreshToken: string
|
|
15
|
+
onRefreshed: (tokens: { accessToken: string; refreshToken?: string }) => void
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class TargetApiError extends Error {
|
|
20
|
+
readonly status: number
|
|
21
|
+
readonly code?: string
|
|
22
|
+
|
|
23
|
+
constructor(message: string, status: number, code?: string) {
|
|
24
|
+
super(message)
|
|
25
|
+
this.name = "TargetApiError"
|
|
26
|
+
this.status = status
|
|
27
|
+
if (code !== undefined) this.code = code
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function isAuthExpiry(status: number, code?: string, message?: string): boolean {
|
|
32
|
+
if (status !== 401) return false
|
|
33
|
+
if (code === "TOKEN_EXPIRED" || code === "NO_SESSION" || code === "INVALID_TOKEN") return true
|
|
34
|
+
const m = (message ?? "").toLowerCase()
|
|
35
|
+
return m.includes("token expired") || m.includes("authentication required")
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function refreshAccessToken(
|
|
39
|
+
authRefresh: NonNullable<TargetFetchOptions["authRefresh"]>,
|
|
40
|
+
): Promise<string> {
|
|
41
|
+
const base = authRefresh.cloudApiUrl.replace(/\/$/, "")
|
|
42
|
+
const res = await fetch(`${base}/auth/refresh`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: { "Content-Type": "application/json" },
|
|
45
|
+
body: JSON.stringify({ refresh_token: authRefresh.refreshToken }),
|
|
46
|
+
})
|
|
47
|
+
const json = (await res.json().catch(() => ({}))) as {
|
|
48
|
+
access_token?: string
|
|
49
|
+
refresh_token?: string
|
|
50
|
+
message?: string
|
|
51
|
+
error?: string
|
|
52
|
+
}
|
|
53
|
+
if (!res.ok || !json.access_token) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`${json.message ?? json.error ?? "Token refresh failed"}. Run: supatype login`,
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
authRefresh.onRefreshed({
|
|
59
|
+
accessToken: json.access_token,
|
|
60
|
+
...(json.refresh_token !== undefined ? { refreshToken: json.refresh_token } : {}),
|
|
61
|
+
})
|
|
62
|
+
return json.access_token
|
|
8
63
|
}
|
|
9
64
|
|
|
10
65
|
export async function targetFetch<T>(
|
|
@@ -12,29 +67,61 @@ export async function targetFetch<T>(
|
|
|
12
67
|
apiPrefix: "/api/v1" | "/platform/v1",
|
|
13
68
|
opts: TargetFetchOptions,
|
|
14
69
|
): Promise<T> {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
70
|
+
const url = `${baseUrl.replace(/\/$/, "")}${apiPrefix}${opts.path}`
|
|
71
|
+
|
|
72
|
+
const doFetch = async (token: string): Promise<{
|
|
73
|
+
ok: boolean
|
|
74
|
+
status: number
|
|
75
|
+
json: { data?: T; error?: string; message?: string; code?: string }
|
|
76
|
+
}> => {
|
|
77
|
+
const headers: Record<string, string> = {
|
|
78
|
+
"Content-Type": "application/json",
|
|
79
|
+
Authorization: `Bearer ${token}`,
|
|
80
|
+
}
|
|
81
|
+
if (opts.orgId) headers["X-Org-Id"] = opts.orgId
|
|
82
|
+
if (opts.environment) headers["X-Supatype-Environment"] = opts.environment
|
|
83
|
+
|
|
84
|
+
const res = await fetch(url, {
|
|
85
|
+
method: opts.method,
|
|
86
|
+
headers,
|
|
87
|
+
...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
const json = (await res.json().catch(() => ({}))) as {
|
|
91
|
+
data?: T
|
|
92
|
+
error?: string
|
|
93
|
+
message?: string
|
|
94
|
+
code?: string
|
|
95
|
+
}
|
|
96
|
+
return { ok: res.ok, status: res.status, json }
|
|
18
97
|
}
|
|
19
|
-
if (opts.orgId) headers["X-Org-Id"] = opts.orgId
|
|
20
|
-
if (opts.environment) headers["X-Supatype-Environment"] = opts.environment
|
|
21
98
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
method: opts.method,
|
|
25
|
-
headers,
|
|
26
|
-
...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),
|
|
27
|
-
})
|
|
99
|
+
let token = opts.token
|
|
100
|
+
let result = await doFetch(token)
|
|
28
101
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
message
|
|
102
|
+
if (
|
|
103
|
+
!result.ok &&
|
|
104
|
+
opts.authRefresh &&
|
|
105
|
+
isAuthExpiry(result.status, result.json.code, result.json.message ?? result.json.error)
|
|
106
|
+
) {
|
|
107
|
+
token = await refreshAccessToken(opts.authRefresh)
|
|
108
|
+
result = await doFetch(token)
|
|
33
109
|
}
|
|
34
110
|
|
|
35
|
-
if (!
|
|
36
|
-
|
|
111
|
+
if (!result.ok) {
|
|
112
|
+
const message = result.json.message ?? result.json.error ?? `API error: ${result.status} ${url}`
|
|
113
|
+
if (
|
|
114
|
+
isAuthExpiry(result.status, result.json.code, message) &&
|
|
115
|
+
!opts.authRefresh
|
|
116
|
+
) {
|
|
117
|
+
throw new TargetApiError(
|
|
118
|
+
`${message}. Session expired, run: supatype login`,
|
|
119
|
+
result.status,
|
|
120
|
+
result.json.code,
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
throw new TargetApiError(message, result.status, result.json.code)
|
|
37
124
|
}
|
|
38
125
|
|
|
39
|
-
return (json.data !== undefined ? json.data : json) as T
|
|
126
|
+
return (result.json.data !== undefined ? result.json.data : result.json) as T
|
|
40
127
|
}
|
package/src/tsx-runner.ts
CHANGED
|
@@ -13,7 +13,7 @@ import { tmpdir } from "node:os"
|
|
|
13
13
|
|
|
14
14
|
const _require = createRequire(import.meta.url)
|
|
15
15
|
|
|
16
|
-
// The CLI's own source directory
|
|
16
|
+
// The CLI's own source directory, workspace packages are
|
|
17
17
|
// resolvable from here. Eval snippets are written here so ESM resolution finds them.
|
|
18
18
|
const CLI_SRC_DIR = dirname(fileURLToPath(import.meta.url))
|
|
19
19
|
|