@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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold Deno IDE types for edge functions so tsserver / Cursor stop
|
|
3
|
+
* reporting "Cannot find name 'Deno'" under the project root tsconfig.
|
|
4
|
+
*
|
|
5
|
+
* We ship a curated ambient declaration (not `@types/deno` at the app root):
|
|
6
|
+
* installing `@types/deno` as a project dependency auto-includes it in the
|
|
7
|
+
* whole app when root `tsconfig` omits `"types"`, which pollutes React/Next.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
10
|
+
import { join, relative } from "node:path";
|
|
11
|
+
import ts from "typescript";
|
|
12
|
+
const MARKER = "Supatype edge functions (IDE / tsserver)";
|
|
13
|
+
/** Ambient Deno types written into `functions/deno.d.ts`. */
|
|
14
|
+
export function functionsDenoAmbientSource() {
|
|
15
|
+
return `/**
|
|
16
|
+
* ${MARKER}.
|
|
17
|
+
* Runtime is Deno; this file covers APIs edge functions commonly use.
|
|
18
|
+
* Do not add \`@types/deno\` to the app package.json, it leaks into the
|
|
19
|
+
* whole project when root tsconfig has no \`"types"\` field.
|
|
20
|
+
*
|
|
21
|
+
* Optional: for the full Deno API, install the Deno VS Code/Cursor extension
|
|
22
|
+
* and open \`functions/\` as a Deno-enabled workspace folder.
|
|
23
|
+
*/
|
|
24
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
25
|
+
|
|
26
|
+
interface DenoEnv {
|
|
27
|
+
/** Returns the value of the environment variable, or \`undefined\` if unset. */
|
|
28
|
+
get(key: string): string | undefined
|
|
29
|
+
set(key: string, value: string): void
|
|
30
|
+
delete(key: string): void
|
|
31
|
+
has(key: string): boolean
|
|
32
|
+
toObject(): { [key: string]: string }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
declare namespace Deno {
|
|
36
|
+
const env: DenoEnv
|
|
37
|
+
|
|
38
|
+
namespace errors {
|
|
39
|
+
class NotFound extends Error {}
|
|
40
|
+
class PermissionDenied extends Error {}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface DirEntry {
|
|
44
|
+
name: string
|
|
45
|
+
isFile: boolean
|
|
46
|
+
isDirectory: boolean
|
|
47
|
+
isSymlink: boolean
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface FileInfo {
|
|
51
|
+
isFile: boolean
|
|
52
|
+
isDirectory: boolean
|
|
53
|
+
isSymlink: boolean
|
|
54
|
+
size: number
|
|
55
|
+
mtime: Date | null
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function readDir(path: string): AsyncIterable<DirEntry>
|
|
59
|
+
function readTextFile(path: string): Promise<string>
|
|
60
|
+
function stat(path: string): Promise<FileInfo>
|
|
61
|
+
|
|
62
|
+
function serve(
|
|
63
|
+
options: { port: number; hostname?: string; onListen?: (params: { hostname: string; port: number }) => void },
|
|
64
|
+
handler: (req: Request) => Response | Promise<Response>,
|
|
65
|
+
): void
|
|
66
|
+
}
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
/** `functions/tsconfig.json`: owns function files so the app config can exclude them. */
|
|
70
|
+
export function functionsTsConfigSource() {
|
|
71
|
+
return `{
|
|
72
|
+
"compilerOptions": {
|
|
73
|
+
"target": "ES2022",
|
|
74
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
75
|
+
"strict": true,
|
|
76
|
+
"noEmit": true,
|
|
77
|
+
"module": "ESNext",
|
|
78
|
+
"moduleResolution": "bundler",
|
|
79
|
+
"isolatedModules": true,
|
|
80
|
+
"skipLibCheck": true,
|
|
81
|
+
"allowImportingTsExtensions": true,
|
|
82
|
+
"types": []
|
|
83
|
+
},
|
|
84
|
+
"include": ["./**/*.ts", "./deno.d.ts"]
|
|
85
|
+
}
|
|
86
|
+
`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Ensure `functions/deno.d.ts` + `functions/tsconfig.json` exist, and try to
|
|
90
|
+
* exclude `functions` from the project-root `tsconfig.json`.
|
|
91
|
+
*/
|
|
92
|
+
export function ensureFunctionsDenoTypes(projectRoot, functionsDir) {
|
|
93
|
+
mkdirSync(functionsDir, { recursive: true });
|
|
94
|
+
const denoDtsPath = join(functionsDir, "deno.d.ts");
|
|
95
|
+
const tsconfigPath = join(functionsDir, "tsconfig.json");
|
|
96
|
+
let wroteDenoDts = false;
|
|
97
|
+
if (!existsSync(denoDtsPath)) {
|
|
98
|
+
writeFileSync(denoDtsPath, functionsDenoAmbientSource(), "utf8");
|
|
99
|
+
wroteDenoDts = true;
|
|
100
|
+
}
|
|
101
|
+
let wroteTsconfig = false;
|
|
102
|
+
if (!existsSync(tsconfigPath)) {
|
|
103
|
+
writeFileSync(tsconfigPath, functionsTsConfigSource(), "utf8");
|
|
104
|
+
wroteTsconfig = true;
|
|
105
|
+
}
|
|
106
|
+
const rootExclude = ensureRootTsconfigExcludesFunctions(projectRoot);
|
|
107
|
+
const hints = [];
|
|
108
|
+
const fnRel = toPosix(relative(projectRoot, functionsDir)) || "functions";
|
|
109
|
+
if (rootExclude === "manual") {
|
|
110
|
+
hints.push(`Add "functions" to the root tsconfig.json "exclude" array so the app checker skips ${fnRel}/.`);
|
|
111
|
+
}
|
|
112
|
+
else if (rootExclude === "missing") {
|
|
113
|
+
hints.push(`If you add a root tsconfig.json, exclude "${fnRel}" (or "functions") so app typecheck stays separate.`);
|
|
114
|
+
}
|
|
115
|
+
return { wroteDenoDts, wroteTsconfig, rootExclude, hints };
|
|
116
|
+
}
|
|
117
|
+
function ensureRootTsconfigExcludesFunctions(projectRoot) {
|
|
118
|
+
const path = join(projectRoot, "tsconfig.json");
|
|
119
|
+
if (!existsSync(path))
|
|
120
|
+
return "missing";
|
|
121
|
+
const raw = readFileSync(path, "utf8");
|
|
122
|
+
const parsed = ts.parseConfigFileTextToJson(path, raw);
|
|
123
|
+
if (parsed.error || parsed.config === undefined || typeof parsed.config !== "object") {
|
|
124
|
+
return "manual";
|
|
125
|
+
}
|
|
126
|
+
const cfg = parsed.config;
|
|
127
|
+
const exclude = Array.isArray(cfg.exclude) ? cfg.exclude.map(String) : [];
|
|
128
|
+
if (exclude.some(isFunctionsExcludeEntry))
|
|
129
|
+
return "already";
|
|
130
|
+
try {
|
|
131
|
+
const asJson = JSON.parse(raw);
|
|
132
|
+
asJson.exclude = [...(Array.isArray(asJson.exclude) ? asJson.exclude : []), "functions"];
|
|
133
|
+
writeFileSync(path, `${JSON.stringify(asJson, null, 2)}\n`, "utf8");
|
|
134
|
+
return "updated";
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// JSONC / trailing commas, try a conservative string splice into an existing exclude array.
|
|
138
|
+
if (/"exclude"\s*:\s*\[/.test(raw)) {
|
|
139
|
+
const next = raw.replace(/("exclude"\s*:\s*\[)/, `$1\n "functions",`);
|
|
140
|
+
if (next !== raw) {
|
|
141
|
+
writeFileSync(path, next, "utf8");
|
|
142
|
+
return "updated";
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return "manual";
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function isFunctionsExcludeEntry(entry) {
|
|
149
|
+
const n = entry.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
150
|
+
return n === "functions" || n === "functions/**" || n.startsWith("functions/");
|
|
151
|
+
}
|
|
152
|
+
function toPosix(path) {
|
|
153
|
+
return path.replace(/\\/g, "/");
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=functions-deno-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions-deno-types.js","sourceRoot":"","sources":["../src/functions-deno-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,7 @@ function importSpecFromRouter(routerFilePath, entrypoint) {
|
|
|
37
37
|
export function generateFunctionsRouterSource(routerFilePath, fns) {
|
|
38
38
|
const imports = fns.map((fn, i) => `import handler_${i} from "${importSpecFromRouter(routerFilePath, fn.entrypoint)}"`);
|
|
39
39
|
const routes = fns.map((fn, i) => ` "${fn.name}": handler_${i},`);
|
|
40
|
-
return `// Auto-generated
|
|
40
|
+
return `// Auto-generated: do not edit (regenerated by supatype dev / functions serve)
|
|
41
41
|
${imports.join("\n")}
|
|
42
42
|
|
|
43
43
|
const handlers: Record<string, (req: Request) => Response | Promise<Response>> = {
|
package/dist/gitignore.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export declare const SUPATYPE_GITIGNORE_MARKER = "# Supatype
|
|
2
|
-
export declare const SUPATYPE_GITIGNORE_BLOCK = "# Supatype
|
|
1
|
+
export declare const SUPATYPE_GITIGNORE_MARKER = "# Supatype, local runtime (contains secrets in link.json)";
|
|
2
|
+
export declare const SUPATYPE_GITIGNORE_BLOCK = "# Supatype, local runtime (contains secrets in link.json)\n.env\n.supatype/\nsupatype.local.config.ts\nsupatype.local.config.js\nsupatype.local.config.mjs\n";
|
|
3
3
|
export declare function isSupatypeGitignored(cwd: string): boolean;
|
|
4
4
|
export declare function ensureSupatypeGitignore(cwd: string, opts?: {
|
|
5
5
|
silent?: boolean;
|
package/dist/gitignore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,8DAA8D,CAAA;AACpG,eAAO,MAAM,wBAAwB,iKAMpC,CAAA;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAKzD;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAoBzF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMzD"}
|
package/dist/gitignore.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
|
-
export const SUPATYPE_GITIGNORE_MARKER = "# Supatype
|
|
3
|
+
export const SUPATYPE_GITIGNORE_MARKER = "# Supatype, local runtime (contains secrets in link.json)";
|
|
4
4
|
export const SUPATYPE_GITIGNORE_BLOCK = `${SUPATYPE_GITIGNORE_MARKER}
|
|
5
5
|
.env
|
|
6
6
|
.supatype/
|
|
@@ -28,14 +28,14 @@ export function ensureSupatypeGitignore(cwd, opts) {
|
|
|
28
28
|
writeFileSync(gitignorePath, `.env\nnode_modules/\ndist/\n${SUPATYPE_GITIGNORE_BLOCK}`, "utf8");
|
|
29
29
|
}
|
|
30
30
|
if (!opts?.silent) {
|
|
31
|
-
console.warn("Added .supatype/ to .gitignore (link.json contains secrets
|
|
31
|
+
console.warn("Added .supatype/ to .gitignore (link.json contains secrets, never commit).");
|
|
32
32
|
}
|
|
33
33
|
return true;
|
|
34
34
|
}
|
|
35
35
|
export function warnIfLinkNotGitignored(cwd) {
|
|
36
36
|
if (isSupatypeGitignored(cwd))
|
|
37
37
|
return;
|
|
38
|
-
console.warn("\n⚠ Warning: .supatype/ is not in .gitignore
|
|
38
|
+
console.warn("\n⚠ Warning: .supatype/ is not in .gitignore, link.json contains tokens and must not be committed.");
|
|
39
39
|
console.warn(" Run with link --fix-gitignore to append the Supatype block.\n");
|
|
40
40
|
}
|
|
41
41
|
//# sourceMappingURL=gitignore.js.map
|
package/dist/gitignore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,yBAAyB,GAAG,
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,yBAAyB,GAAG,2DAA2D,CAAA;AACpG,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,yBAAyB;;;;;;CAMnE,CAAA;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IAChD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAA;IAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IACnD,OAAO,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,IAA2B;IAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IAChD,IAAI,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAE1C,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAA;QAC9D,aAAa,CAAC,aAAa,EAAE,GAAG,IAAI,KAAK,wBAAwB,EAAE,EAAE,MAAM,CAAC,CAAA;IAC9E,CAAC;SAAM,CAAC;QACN,aAAa,CACX,aAAa,EACb,+BAA+B,wBAAwB,EAAE,EACzD,MAAM,CACP,CAAA;IACH,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAM;IACrC,OAAO,CAAC,IAAI,CACV,qGAAqG,CACtG,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;AAClF,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ManifestHookEntry } from "./model-hooks.js";
|
|
2
|
+
/** The generated adapter, flattened. `_`-prefixed, so the worker never routes to it. */
|
|
3
|
+
export declare const ADAPTER_KEY = "_supatype-hooks.ts";
|
|
4
|
+
export interface HookUpload {
|
|
5
|
+
/** Handler name → its source, flattened and import-rewritten. */
|
|
6
|
+
handlers: Array<{
|
|
7
|
+
name: string;
|
|
8
|
+
source: string;
|
|
9
|
+
}>;
|
|
10
|
+
/** table → event → config, exactly as the manifest would carry it. */
|
|
11
|
+
map: Record<string, Record<string, ManifestHookEntry>>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Read the hooks a schema actually names, ready to upload.
|
|
15
|
+
*
|
|
16
|
+
* **Named-only**, not every directory under `hooks/`: an unnamed handler would sit on the worker
|
|
17
|
+
* holding the service-role key with nothing able to call it. Uploading it buys nothing and widens what
|
|
18
|
+
* runs with that credential.
|
|
19
|
+
*
|
|
20
|
+
* Throws with a message meant for a terminal when a handler cannot be flattened faithfully, the
|
|
21
|
+
* alternative is a deploy that succeeds and a hook that fails to import, which reads to the caller as
|
|
22
|
+
* the table's writes being broken for no visible reason.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readHookUpload(cwd: string, hooksDir: string, ast: unknown): HookUpload | null;
|
|
25
|
+
/** The generated adapter as a handler-shaped entry, so it travels with them. */
|
|
26
|
+
export declare function adapterEntry(module: string): {
|
|
27
|
+
name: string;
|
|
28
|
+
source: string;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=hook-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-upload.d.ts","sourceRoot":"","sources":["../src/hook-upload.ts"],"names":[],"mappings":"AAWA,OAAO,EAAgC,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEvF,wFAAwF;AACxF,eAAO,MAAM,WAAW,uBAAuB,CAAA;AAK/C,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAA;CACvD;AA0BD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAwC7F;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE7E"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package a project's hooks for a managed stack.
|
|
3
|
+
*
|
|
4
|
+
* Self-hosted stacks need none of this: the worker mounts the project directory, so `hooks/` is already
|
|
5
|
+
* where it looks. A managed project has no directory, its worker reads a ConfigMap, whose keys may only
|
|
6
|
+
* contain alphanumerics, `-`, `_` and `.`. So the tree is flattened here, where it can be checked and
|
|
7
|
+
* explained, rather than in the deploy route where a dropped file would be silent.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
10
|
+
import { join, relative } from "node:path";
|
|
11
|
+
import { declaredHooks, manifestHooks } from "./model-hooks.js";
|
|
12
|
+
/** The generated adapter, flattened. `_`-prefixed, so the worker never routes to it. */
|
|
13
|
+
export const ADAPTER_KEY = "_supatype-hooks.ts";
|
|
14
|
+
/** What the handlers import locally, and what has to be rewritten to reach the flattened name. */
|
|
15
|
+
const ADAPTER_IMPORT = "../_supatype/hooks.ts";
|
|
16
|
+
/**
|
|
17
|
+
* Rewrite the one import a hook handler is generated to make.
|
|
18
|
+
*
|
|
19
|
+
* `../_supatype/hooks.ts` is a path that cannot survive flattening, and it is the specifier our own
|
|
20
|
+
* scaffold writes: so it is rewritten rather than refused. Any *other* relative import is refused
|
|
21
|
+
* below: it would resolve to nothing on the worker, and a hook that fails to import is a hooked table
|
|
22
|
+
* whose writes all start failing.
|
|
23
|
+
*/
|
|
24
|
+
function rewriteAdapterImport(source) {
|
|
25
|
+
return source.split(ADAPTER_IMPORT).join(`./${ADAPTER_KEY}`);
|
|
26
|
+
}
|
|
27
|
+
/** Relative specifiers a flattened layout cannot honour, so the caller can refuse with a real reason. */
|
|
28
|
+
function unsupportedImports(source) {
|
|
29
|
+
const found = new Set();
|
|
30
|
+
// Matches `from "…"` and `import("…")`, which is every form that resolves against the file's own path.
|
|
31
|
+
for (const match of source.matchAll(/(?:from|import)\s*\(?\s*["'](\.[^"']*)["']/g)) {
|
|
32
|
+
const specifier = match[1];
|
|
33
|
+
if (specifier === ADAPTER_IMPORT || specifier === `./${ADAPTER_KEY}`)
|
|
34
|
+
continue;
|
|
35
|
+
found.add(specifier);
|
|
36
|
+
}
|
|
37
|
+
return [...found].sort();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Read the hooks a schema actually names, ready to upload.
|
|
41
|
+
*
|
|
42
|
+
* **Named-only**, not every directory under `hooks/`: an unnamed handler would sit on the worker
|
|
43
|
+
* holding the service-role key with nothing able to call it. Uploading it buys nothing and widens what
|
|
44
|
+
* runs with that credential.
|
|
45
|
+
*
|
|
46
|
+
* Throws with a message meant for a terminal when a handler cannot be flattened faithfully, the
|
|
47
|
+
* alternative is a deploy that succeeds and a hook that fails to import, which reads to the caller as
|
|
48
|
+
* the table's writes being broken for no visible reason.
|
|
49
|
+
*/
|
|
50
|
+
export function readHookUpload(cwd, hooksDir, ast) {
|
|
51
|
+
const declared = declaredHooks(ast);
|
|
52
|
+
if (declared.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
const names = [...new Set(declared.map((hook) => hook.function))].sort();
|
|
55
|
+
const where = relative(cwd, hooksDir) || hooksDir;
|
|
56
|
+
const handlers = [];
|
|
57
|
+
for (const name of names) {
|
|
58
|
+
const dir = join(hooksDir, name);
|
|
59
|
+
const entry = join(dir, "index.ts");
|
|
60
|
+
if (!existsSync(entry)) {
|
|
61
|
+
throw new Error(`Hook "${name}" has no ${where}/${name}/index.ts`);
|
|
62
|
+
}
|
|
63
|
+
const extra = readdirSync(dir)
|
|
64
|
+
.filter((file) => file !== "index.ts")
|
|
65
|
+
.filter((file) => statSync(join(dir, file)).isFile() || !file.startsWith("."));
|
|
66
|
+
if (extra.length > 0) {
|
|
67
|
+
throw new Error(`Hook "${name}" has more than one file (${extra.join(", ")}).\n` +
|
|
68
|
+
`A managed stack serves each hook as a single module today, so the others would not be ` +
|
|
69
|
+
`uploaded and the hook would fail to import.\nMove what it needs into index.ts, or run this ` +
|
|
70
|
+
`hook on a self-hosted stack, which mounts the directory as it is.`);
|
|
71
|
+
}
|
|
72
|
+
const source = readFileSync(entry, "utf8");
|
|
73
|
+
const unsupported = unsupportedImports(source);
|
|
74
|
+
if (unsupported.length > 0) {
|
|
75
|
+
throw new Error(`Hook "${name}" imports ${unsupported.join(", ")}, which a managed stack cannot resolve.\n` +
|
|
76
|
+
`Only the generated ${ADAPTER_IMPORT} survives upload; bare specifiers and URLs are fine.`);
|
|
77
|
+
}
|
|
78
|
+
handlers.push({ name, source: rewriteAdapterImport(source) });
|
|
79
|
+
}
|
|
80
|
+
return { handlers, map: manifestHooks(ast) };
|
|
81
|
+
}
|
|
82
|
+
/** The generated adapter as a handler-shaped entry, so it travels with them. */
|
|
83
|
+
export function adapterEntry(module) {
|
|
84
|
+
return { name: ADAPTER_KEY.replace(/\.ts$/, ""), source: module };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=hook-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-upload.js","sourceRoot":"","sources":["../src/hook-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The module source, or `null` when no model declares a hook.
|
|
3
|
+
*
|
|
4
|
+
* Returning null rather than an empty module keeps a `_supatype/hooks.ts` from appearing in projects
|
|
5
|
+
* that have no hooks, a generated file nobody imports is a file somebody eventually edits.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateHooksModule(ast: unknown): string | null;
|
|
8
|
+
//# sourceMappingURL=hooks-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-generator.d.ts","sourceRoot":"","sources":["../src/hooks-generator.ts"],"names":[],"mappings":"AAsCA;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA0R/D"}
|