@supatype/cli 0.1.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-test.log +221 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/assets/supatype-logo-wordmark.ascii.txt +6 -0
- package/bin/dev-entry.ts +2 -0
- package/bin/supatype.js +5 -0
- package/dist/app/framework.d.ts +44 -0
- package/dist/app/framework.d.ts.map +1 -0
- package/dist/app/framework.js +200 -0
- package/dist/app/framework.js.map +1 -0
- package/dist/app/proxy-dev-app.d.ts +13 -0
- package/dist/app/proxy-dev-app.d.ts.map +1 -0
- package/dist/app/proxy-dev-app.js +54 -0
- package/dist/app/proxy-dev-app.js.map +1 -0
- package/dist/app-config.d.ts +7 -0
- package/dist/app-config.d.ts.map +1 -0
- package/dist/app-config.js +113 -0
- package/dist/app-config.js.map +1 -0
- package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
- package/dist/augmentation-generator.d.ts +2 -0
- package/dist/augmentation-generator.d.ts.map +1 -0
- package/dist/augmentation-generator.js +111 -0
- package/dist/augmentation-generator.js.map +1 -0
- package/dist/binary-cache.d.ts +98 -0
- package/dist/binary-cache.d.ts.map +1 -0
- package/dist/binary-cache.js +687 -0
- package/dist/binary-cache.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +61 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/admin.d.ts +4 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +271 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/app.d.ts +3 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +82 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/cache.d.ts +6 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +105 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/cloud.d.ts +23 -0
- package/dist/commands/cloud.d.ts.map +1 -0
- package/dist/commands/cloud.js +254 -0
- package/dist/commands/cloud.js.map +1 -0
- package/dist/commands/db.d.ts +8 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +116 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy-types.d.ts +14 -0
- package/dist/commands/deploy-types.d.ts.map +1 -0
- package/dist/commands/deploy-types.js +38 -0
- package/dist/commands/deploy-types.js.map +1 -0
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +322 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +14 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +806 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +54 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/engine.d.ts +7 -0
- package/dist/commands/engine.d.ts.map +1 -0
- package/dist/commands/engine.js +27 -0
- package/dist/commands/engine.js.map +1 -0
- package/dist/commands/functions.d.ts +3 -0
- package/dist/commands/functions.d.ts.map +1 -0
- package/dist/commands/functions.js +749 -0
- package/dist/commands/functions.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +38 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +228 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/keys.d.ts +4 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +57 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/logs.d.ts +6 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +52 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/migrate-from-v1.d.ts +5 -0
- package/dist/commands/migrate-from-v1.d.ts.map +1 -0
- package/dist/commands/migrate-from-v1.js +125 -0
- package/dist/commands/migrate-from-v1.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +75 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/pg.d.ts +8 -0
- package/dist/commands/pg.d.ts.map +1 -0
- package/dist/commands/pg.js +102 -0
- package/dist/commands/pg.js.map +1 -0
- package/dist/commands/plugins.d.ts +3 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +431 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +12 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +3 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +179 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/seed.d.ts +5 -0
- package/dist/commands/seed.d.ts.map +1 -0
- package/dist/commands/seed.js +55 -0
- package/dist/commands/seed.js.map +1 -0
- package/dist/commands/self-host.d.ts +9 -0
- package/dist/commands/self-host.d.ts.map +1 -0
- package/dist/commands/self-host.js +310 -0
- package/dist/commands/self-host.js.map +1 -0
- package/dist/commands/self-update.d.ts +9 -0
- package/dist/commands/self-update.d.ts.map +1 -0
- package/dist/commands/self-update.js +33 -0
- package/dist/commands/self-update.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +70 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/types.d.ts +3 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +62 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +118 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/components.d.ts +5 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +3 -0
- package/dist/components.js.map +1 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +134 -0
- package/dist/config.js.map +1 -0
- package/dist/dev-compose.d.ts +19 -0
- package/dist/dev-compose.d.ts.map +1 -0
- package/dist/dev-compose.js +468 -0
- package/dist/dev-compose.js.map +1 -0
- package/dist/dev-log-bus.d.ts +30 -0
- package/dist/dev-log-bus.d.ts.map +1 -0
- package/dist/dev-log-bus.js +87 -0
- package/dist/dev-log-bus.js.map +1 -0
- package/dist/dev-log-filter.d.ts +10 -0
- package/dist/dev-log-filter.d.ts.map +1 -0
- package/dist/dev-log-filter.js +36 -0
- package/dist/dev-log-filter.js.map +1 -0
- package/dist/dev-logo.d.ts +12 -0
- package/dist/dev-logo.d.ts.map +1 -0
- package/dist/dev-logo.js +57 -0
- package/dist/dev-logo.js.map +1 -0
- package/dist/dev-session.d.ts +26 -0
- package/dist/dev-session.d.ts.map +1 -0
- package/dist/dev-session.js +106 -0
- package/dist/dev-session.js.map +1 -0
- package/dist/dev-shutdown.d.ts +9 -0
- package/dist/dev-shutdown.d.ts.map +1 -0
- package/dist/dev-shutdown.js +50 -0
- package/dist/dev-shutdown.js.map +1 -0
- package/dist/dev-task-colors.d.ts +14 -0
- package/dist/dev-task-colors.d.ts.map +1 -0
- package/dist/dev-task-colors.js +44 -0
- package/dist/dev-task-colors.js.map +1 -0
- package/dist/dev-tui.d.ts +24 -0
- package/dist/dev-tui.d.ts.map +1 -0
- package/dist/dev-tui.js +188 -0
- package/dist/dev-tui.js.map +1 -0
- package/dist/diff-output.d.ts +4 -0
- package/dist/diff-output.d.ts.map +1 -0
- package/dist/diff-output.js +12 -0
- package/dist/diff-output.js.map +1 -0
- package/dist/docker-postgres.d.ts +57 -0
- package/dist/docker-postgres.d.ts.map +1 -0
- package/dist/docker-postgres.js +208 -0
- package/dist/docker-postgres.js.map +1 -0
- package/dist/engine-client.d.ts +69 -0
- package/dist/engine-client.d.ts.map +1 -0
- package/dist/engine-client.js +157 -0
- package/dist/engine-client.js.map +1 -0
- package/dist/engine-push-output.d.ts +16 -0
- package/dist/engine-push-output.d.ts.map +1 -0
- package/dist/engine-push-output.js +61 -0
- package/dist/engine-push-output.js.map +1 -0
- package/dist/ensure-binary.d.ts +7 -0
- package/dist/ensure-binary.d.ts.map +1 -0
- package/dist/ensure-binary.js +17 -0
- package/dist/ensure-binary.js.map +1 -0
- package/dist/functions-router-gen.d.ts +14 -0
- package/dist/functions-router-gen.d.ts.map +1 -0
- package/dist/functions-router-gen.js +199 -0
- package/dist/functions-router-gen.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +3 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +13 -0
- package/dist/jwt.js.map +1 -0
- package/dist/kong-config.d.ts +25 -0
- package/dist/kong-config.d.ts.map +1 -0
- package/dist/kong-config.js +71 -0
- package/dist/kong-config.js.map +1 -0
- package/dist/local-gateway.d.ts +7 -0
- package/dist/local-gateway.d.ts.map +1 -0
- package/dist/local-gateway.js +9 -0
- package/dist/local-gateway.js.map +1 -0
- package/dist/local-storage.d.ts +8 -0
- package/dist/local-storage.d.ts.map +1 -0
- package/dist/local-storage.js +14 -0
- package/dist/local-storage.js.map +1 -0
- package/dist/pgbouncer-userlist.d.ts +5 -0
- package/dist/pgbouncer-userlist.d.ts.map +1 -0
- package/dist/pgbouncer-userlist.js +14 -0
- package/dist/pgbouncer-userlist.js.map +1 -0
- package/dist/postgres-ctl.d.ts +44 -0
- package/dist/postgres-ctl.d.ts.map +1 -0
- package/dist/postgres-ctl.js +137 -0
- package/dist/postgres-ctl.js.map +1 -0
- package/dist/process-manager.d.ts +49 -0
- package/dist/process-manager.d.ts.map +1 -0
- package/dist/process-manager.js +177 -0
- package/dist/process-manager.js.map +1 -0
- package/dist/project-config.d.ts +238 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +159 -0
- package/dist/project-config.js.map +1 -0
- package/dist/pull-utils.d.ts +31 -0
- package/dist/pull-utils.d.ts.map +1 -0
- package/dist/pull-utils.js +77 -0
- package/dist/pull-utils.js.map +1 -0
- package/dist/release-pins.d.ts +7 -0
- package/dist/release-pins.d.ts.map +1 -0
- package/dist/release-pins.js +27 -0
- package/dist/release-pins.js.map +1 -0
- package/dist/release-public-key.d.ts +8 -0
- package/dist/release-public-key.d.ts.map +1 -0
- package/dist/release-public-key.js +13 -0
- package/dist/release-public-key.js.map +1 -0
- package/dist/restore-system-relation-targets.d.ts +3 -0
- package/dist/restore-system-relation-targets.d.ts.map +1 -0
- package/dist/restore-system-relation-targets.js +45 -0
- package/dist/restore-system-relation-targets.js.map +1 -0
- package/dist/runtime-routes.d.ts +34 -0
- package/dist/runtime-routes.d.ts.map +1 -0
- package/dist/runtime-routes.js +252 -0
- package/dist/runtime-routes.js.map +1 -0
- package/dist/schema-ast-v2.d.ts +127 -0
- package/dist/schema-ast-v2.d.ts.map +1 -0
- package/dist/schema-ast-v2.js +226 -0
- package/dist/schema-ast-v2.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +11 -0
- package/dist/scripts/postinstall.d.ts.map +1 -0
- package/dist/scripts/postinstall.js +47 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/seed.d.ts +8 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +32 -0
- package/dist/seed.js.map +1 -0
- package/dist/self-host-compose.d.ts +43 -0
- package/dist/self-host-compose.d.ts.map +1 -0
- package/dist/self-host-compose.js +400 -0
- package/dist/self-host-compose.js.map +1 -0
- package/dist/storage-provision.d.ts +24 -0
- package/dist/storage-provision.d.ts.map +1 -0
- package/dist/storage-provision.js +44 -0
- package/dist/storage-provision.js.map +1 -0
- package/dist/studio-admin-roles.d.ts +7 -0
- package/dist/studio-admin-roles.d.ts.map +1 -0
- package/dist/studio-admin-roles.js +14 -0
- package/dist/studio-admin-roles.js.map +1 -0
- package/dist/studio-dev-server.d.ts +22 -0
- package/dist/studio-dev-server.d.ts.map +1 -0
- package/dist/studio-dev-server.js +28 -0
- package/dist/studio-dev-server.js.map +1 -0
- package/dist/supatype-eval-1781522769253.d.mts +2 -0
- package/dist/supatype-eval-1781522769253.d.mts.map +1 -0
- package/dist/supatype-eval-1781522769253.mjs +3 -0
- package/dist/supatype-eval-1781522769253.mjs.map +1 -0
- package/dist/systemd.d.ts +26 -0
- package/dist/systemd.d.ts.map +1 -0
- package/dist/systemd.js +102 -0
- package/dist/systemd.js.map +1 -0
- package/dist/tsx-runner.d.ts +18 -0
- package/dist/tsx-runner.d.ts.map +1 -0
- package/dist/tsx-runner.js +69 -0
- package/dist/tsx-runner.js.map +1 -0
- package/dist/type-extractor.d.ts +4 -0
- package/dist/type-extractor.d.ts.map +1 -0
- package/dist/type-extractor.js +1213 -0
- package/dist/type-extractor.js.map +1 -0
- package/dist/type-resolver.d.ts +33 -0
- package/dist/type-resolver.d.ts.map +1 -0
- package/dist/type-resolver.js +338 -0
- package/dist/type-resolver.js.map +1 -0
- package/package.json +41 -0
- package/releases/deno/VERSION +1 -0
- package/scripts/mirror-deno-release.sh +76 -0
- package/src/TYPE-RESOLUTION.md +294 -0
- package/src/app/framework.ts +249 -0
- package/src/app/proxy-dev-app.ts +68 -0
- package/src/app-config.ts +128 -0
- package/src/augmentation-generator.ts +126 -0
- package/src/binary-cache.ts +845 -0
- package/src/cli.ts +63 -0
- package/src/commands/admin.ts +372 -0
- package/src/commands/app.ts +97 -0
- package/src/commands/cache.ts +117 -0
- package/src/commands/cloud.ts +325 -0
- package/src/commands/db.ts +136 -0
- package/src/commands/deploy-types.ts +49 -0
- package/src/commands/deploy.ts +400 -0
- package/src/commands/dev.ts +1009 -0
- package/src/commands/diff.ts +63 -0
- package/src/commands/engine.ts +30 -0
- package/src/commands/functions.ts +901 -0
- package/src/commands/generate.ts +44 -0
- package/src/commands/init.ts +253 -0
- package/src/commands/keys.ts +66 -0
- package/src/commands/logs.ts +58 -0
- package/src/commands/migrate-from-v1.ts +131 -0
- package/src/commands/migrate.ts +87 -0
- package/src/commands/pg.ts +133 -0
- package/src/commands/plugins.ts +508 -0
- package/src/commands/pull.ts +17 -0
- package/src/commands/push.ts +226 -0
- package/src/commands/seed.ts +68 -0
- package/src/commands/self-host.ts +364 -0
- package/src/commands/self-update.ts +45 -0
- package/src/commands/status.ts +84 -0
- package/src/commands/types.ts +76 -0
- package/src/commands/update.ts +136 -0
- package/src/components.ts +6 -0
- package/src/config.ts +223 -0
- package/src/dev-compose.ts +583 -0
- package/src/dev-log-bus.ts +101 -0
- package/src/dev-log-filter.ts +32 -0
- package/src/dev-logo.ts +62 -0
- package/src/dev-session.ts +130 -0
- package/src/dev-shutdown.ts +54 -0
- package/src/dev-task-colors.ts +47 -0
- package/src/dev-tui.ts +232 -0
- package/src/diff-output.ts +12 -0
- package/src/docker-postgres.ts +295 -0
- package/src/engine-client.ts +236 -0
- package/src/engine-push-output.ts +71 -0
- package/src/ensure-binary.ts +28 -0
- package/src/functions-router-gen.ts +224 -0
- package/src/index.ts +11 -0
- package/src/jwt.ts +14 -0
- package/src/kong-config.ts +93 -0
- package/src/local-gateway.ts +9 -0
- package/src/local-storage.ts +14 -0
- package/src/pgbouncer-userlist.ts +15 -0
- package/src/postgres-ctl.ts +171 -0
- package/src/process-manager.ts +220 -0
- package/src/project-config.ts +388 -0
- package/src/pull-utils.ts +81 -0
- package/src/release-pins.ts +31 -0
- package/src/release-public-key.ts +12 -0
- package/src/restore-system-relation-targets.ts +45 -0
- package/src/runtime-routes.ts +291 -0
- package/src/schema-ast-v2.ts +324 -0
- package/src/scripts/postinstall.ts +51 -0
- package/src/seed.ts +43 -0
- package/src/self-host-compose.ts +452 -0
- package/src/storage-provision.ts +58 -0
- package/src/studio-admin-roles.ts +16 -0
- package/src/studio-dev-server.ts +53 -0
- package/src/supatype-eval-1781522769253.mts +1 -0
- package/src/systemd.ts +137 -0
- package/src/tsx-runner.ts +89 -0
- package/src/type-extractor.ts +1479 -0
- package/src/type-resolver.ts +457 -0
- package/tests/app-command.test.ts +54 -0
- package/tests/augmentation-generator.test.ts +59 -0
- package/tests/binary-cache-cloud-overrides.test.ts +123 -0
- package/tests/cached-artifact-format.test.ts +84 -0
- package/tests/cli-help.test.ts +133 -0
- package/tests/config.test.ts +252 -0
- package/tests/dev-ui.test.ts +139 -0
- package/tests/docker-postgres.test.ts +39 -0
- package/tests/engine-distribution.test.ts +418 -0
- package/tests/engine-push-output.test.ts +67 -0
- package/tests/ensure-binary.test.ts +59 -0
- package/tests/init.test.ts +127 -0
- package/tests/keys.test.ts +160 -0
- package/tests/migrate-from-v1.test.ts +29 -0
- package/tests/normalize-admin-config.test.ts +48 -0
- package/tests/pg-spawn-env.test.ts +18 -0
- package/tests/postgres-archive-tag.test.ts +9 -0
- package/tests/proxy-dev-app.test.ts +33 -0
- package/tests/pull-utils.test.ts +150 -0
- package/tests/release-pins.test.ts +28 -0
- package/tests/runtime-contract.test.ts +370 -0
- package/tests/seed-discover.test.ts +31 -0
- package/tests/studio-admin-roles.test.ts +27 -0
- package/tests/tsconfig.json +9 -0
- package/tests/tsx-runner.test.ts +66 -0
- package/tests/type-extractor.test.ts +985 -0
- package/tests/type-resolver.test.ts +59 -0
- package/tsconfig.json +10 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vitest.config.ts +12 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deploy commands:
|
|
3
|
+
* supatype deploy — Supatype Cloud by default (linked via supatype link), else platform projectRef; use --local for engine + DB
|
|
4
|
+
* supatype deploy --local — push schema via local engine + optional static app to .supatype/static
|
|
5
|
+
* supatype deploy --app-only — only build & deploy the static site
|
|
6
|
+
* supatype deploy --schema-only — only push schema changes
|
|
7
|
+
* supatype deploy --skip-build — deploy existing build output (no build step)
|
|
8
|
+
* supatype deploy --preview — deploy to a preview URL
|
|
9
|
+
* supatype deploy rollback — roll back to previous deployment
|
|
10
|
+
* supatype deploy status — show current deployment info
|
|
11
|
+
* supatype deploy logs <version> — show build logs
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { Command } from "commander"
|
|
15
|
+
import { existsSync, readdirSync, statSync, createReadStream } from "node:fs"
|
|
16
|
+
import { join } from "node:path"
|
|
17
|
+
import { loadConfig, loadSchemaAst } from "../config.js"
|
|
18
|
+
import { connectionString, schemaPathFromProject } from "../project-config.js"
|
|
19
|
+
import { deploySchemaToLinkedProject, loadCloudConfig, pushSchemaToLinkedProject } from "./cloud.js"
|
|
20
|
+
import { ensureEngine, engineRequest, type DiffResult } from "../engine-client.js"
|
|
21
|
+
import { resolveAppConfig, validateStaticMode, validateBuildOutput, detectPackageManager } from "../app/framework.js"
|
|
22
|
+
import { TIER_LIMITS, type Tier } from "./deploy-types.js"
|
|
23
|
+
import { spawnSync } from "node:child_process"
|
|
24
|
+
|
|
25
|
+
export function registerDeploy(program: Command): void {
|
|
26
|
+
const deploy = program
|
|
27
|
+
.command("deploy")
|
|
28
|
+
.description(
|
|
29
|
+
"Deploy schema and app — Supatype Cloud by default when linked (`supatype link`); pass --local for engine + your database",
|
|
30
|
+
)
|
|
31
|
+
.option("--local", "Use local schema engine and database_url from config (skip cloud control plane)")
|
|
32
|
+
.option("--environment <name>", "Cloud environment when using linked project", "production")
|
|
33
|
+
.option("--app-only", "Skip schema push, only deploy the static site")
|
|
34
|
+
.option("--schema-only", "Skip app build, only push schema changes")
|
|
35
|
+
.option("--skip-build", "Deploy existing build output without building")
|
|
36
|
+
.option("--preview", "Deploy to a temporary preview URL")
|
|
37
|
+
.option("--yes", "Skip confirmation prompts")
|
|
38
|
+
.action(async (opts: {
|
|
39
|
+
local?: boolean
|
|
40
|
+
environment?: string
|
|
41
|
+
appOnly?: boolean
|
|
42
|
+
schemaOnly?: boolean
|
|
43
|
+
skipBuild?: boolean
|
|
44
|
+
preview?: boolean
|
|
45
|
+
yes?: boolean
|
|
46
|
+
}) => {
|
|
47
|
+
const cwd = process.cwd()
|
|
48
|
+
const config = loadConfig(cwd)
|
|
49
|
+
const cloudCfg = loadCloudConfig(cwd)
|
|
50
|
+
|
|
51
|
+
let schemaDone = false
|
|
52
|
+
|
|
53
|
+
// Default: cloud — .supatype/cloud.json → control plane schema deploy
|
|
54
|
+
if (
|
|
55
|
+
!opts.local &&
|
|
56
|
+
cloudCfg?.projectSlug &&
|
|
57
|
+
!opts.appOnly &&
|
|
58
|
+
!opts.skipBuild
|
|
59
|
+
) {
|
|
60
|
+
await deploySchemaToLinkedProject(cwd, opts.environment ?? "production")
|
|
61
|
+
schemaDone = true
|
|
62
|
+
if (opts.schemaOnly) {
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Step 1: Schema push (unless --app-only or --skip-build, or already done via cloud.json)
|
|
68
|
+
if (!opts.appOnly && !opts.skipBuild && !schemaDone) {
|
|
69
|
+
const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd)
|
|
70
|
+
|
|
71
|
+
if (opts.local) {
|
|
72
|
+
console.log("=== Schema Push (local) ===")
|
|
73
|
+
await ensureEngine()
|
|
74
|
+
|
|
75
|
+
const diff = await engineRequest<DiffResult>("/diff", {
|
|
76
|
+
ast,
|
|
77
|
+
database_url: connectionString(config),
|
|
78
|
+
schema: "public",
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
const ops = diff.operations ?? []
|
|
82
|
+
|
|
83
|
+
if (ops.length > 0) {
|
|
84
|
+
console.log(`${ops.length} schema change(s) to apply.`)
|
|
85
|
+
await engineRequest("/push", {
|
|
86
|
+
ast,
|
|
87
|
+
database_url: connectionString(config),
|
|
88
|
+
schema: "public",
|
|
89
|
+
force: true,
|
|
90
|
+
})
|
|
91
|
+
console.log("Schema changes applied.")
|
|
92
|
+
} else {
|
|
93
|
+
console.log("Schema is up to date.")
|
|
94
|
+
}
|
|
95
|
+
} else if (cloudCfg?.projectSlug) {
|
|
96
|
+
console.log("=== Schema Push (cloud) ===")
|
|
97
|
+
await pushSchemaToLinkedProject(cwd, { force: opts.yes ?? true })
|
|
98
|
+
} else {
|
|
99
|
+
console.error(
|
|
100
|
+
"Not linked to Supatype Cloud. Run: supatype link\n" +
|
|
101
|
+
"Or deploy against your own database: supatype deploy --local",
|
|
102
|
+
)
|
|
103
|
+
process.exit(1)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Step 2: App build & deploy (unless --schema-only)
|
|
108
|
+
if (!opts.schemaOnly) {
|
|
109
|
+
if (!config.build) {
|
|
110
|
+
if (opts.appOnly) {
|
|
111
|
+
console.error("No build section found in supatype.config.ts")
|
|
112
|
+
process.exit(1)
|
|
113
|
+
}
|
|
114
|
+
// No build config — skip app deployment silently
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
console.log("\n=== App Build & Deploy ===")
|
|
119
|
+
const appConfig = resolveAppConfig(config.build, cwd)
|
|
120
|
+
|
|
121
|
+
// Validate static mode
|
|
122
|
+
const staticError = validateStaticMode(appConfig.framework, appConfig.directory)
|
|
123
|
+
if (staticError) {
|
|
124
|
+
console.error(staticError)
|
|
125
|
+
process.exit(1)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Build step
|
|
129
|
+
if (!opts.skipBuild && appConfig.buildCommand) {
|
|
130
|
+
console.log(`Framework: ${appConfig.framework}`)
|
|
131
|
+
console.log(`Build command: ${appConfig.buildCommand}`)
|
|
132
|
+
console.log(`Output directory: ${appConfig.outputDirectory}`)
|
|
133
|
+
console.log()
|
|
134
|
+
|
|
135
|
+
// Inject environment variables
|
|
136
|
+
const buildEnv: Record<string, string> = {
|
|
137
|
+
...process.env as Record<string, string>,
|
|
138
|
+
...appConfig.env,
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Inject Supatype URLs if project is linked
|
|
142
|
+
if (cloudCfg?.projectSlug) {
|
|
143
|
+
buildEnv["NEXT_PUBLIC_SUPATYPE_URL"] = cloudCfg.apiUrl || `https://${cloudCfg.projectSlug}.supatype.dev`
|
|
144
|
+
buildEnv["VITE_SUPATYPE_URL"] = buildEnv["NEXT_PUBLIC_SUPATYPE_URL"]!
|
|
145
|
+
buildEnv["PUBLIC_SUPATYPE_URL"] = buildEnv["NEXT_PUBLIC_SUPATYPE_URL"]!
|
|
146
|
+
// NEVER inject service_role key — only anon key is safe for client-side
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Install dependencies
|
|
150
|
+
const pm = detectPackageManager(appConfig.directory)
|
|
151
|
+
console.log(`Installing dependencies (${pm})...`)
|
|
152
|
+
const installResult = spawnSync(pm, ["install"], {
|
|
153
|
+
cwd: appConfig.directory,
|
|
154
|
+
stdio: "inherit",
|
|
155
|
+
env: buildEnv,
|
|
156
|
+
timeout: 5 * 60 * 1000, // 5 minute timeout
|
|
157
|
+
})
|
|
158
|
+
if (installResult.status !== 0) {
|
|
159
|
+
console.error("Dependency installation failed.")
|
|
160
|
+
process.exit(1)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Run build
|
|
164
|
+
console.log("\nBuilding...")
|
|
165
|
+
const [buildCmd, ...buildArgs] = appConfig.buildCommand.split(" ")
|
|
166
|
+
const buildResult = spawnSync(buildCmd!, buildArgs, {
|
|
167
|
+
cwd: appConfig.directory,
|
|
168
|
+
stdio: "inherit",
|
|
169
|
+
env: buildEnv,
|
|
170
|
+
timeout: 10 * 60 * 1000, // 10 minute timeout
|
|
171
|
+
})
|
|
172
|
+
if (buildResult.status !== 0) {
|
|
173
|
+
console.error("Build failed.")
|
|
174
|
+
process.exit(1)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Validate build output
|
|
179
|
+
const maxSizeMb = 500 // Default, should be tier-aware in cloud
|
|
180
|
+
const validationError = validateBuildOutput(appConfig.outputDirectory, maxSizeMb)
|
|
181
|
+
if (validationError) {
|
|
182
|
+
console.error(validationError)
|
|
183
|
+
process.exit(1)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Deploy (--local never uploads to cloud, even if linked)
|
|
187
|
+
if (cloudCfg?.projectSlug && !opts.local) {
|
|
188
|
+
await deployToCloud(
|
|
189
|
+
{ projectRef: cloudCfg.projectSlug, apiUrl: cloudCfg.apiUrl, accessToken: cloudCfg.token },
|
|
190
|
+
appConfig.outputDirectory,
|
|
191
|
+
opts.preview ?? false,
|
|
192
|
+
)
|
|
193
|
+
} else {
|
|
194
|
+
deploySelfHost(appConfig.outputDirectory, cwd)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
console.log("\nDeployment complete!")
|
|
198
|
+
if (cloudCfg?.projectSlug && !opts.local) {
|
|
199
|
+
const url = opts.preview
|
|
200
|
+
? `https://preview-${Date.now().toString(36)}.${cloudCfg.projectSlug}.supatype.dev`
|
|
201
|
+
: `https://${cloudCfg.projectSlug}.supatype.dev`
|
|
202
|
+
console.log(`URL: ${url}`)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
// supatype deploy rollback
|
|
208
|
+
deploy
|
|
209
|
+
.command("rollback")
|
|
210
|
+
.description("Roll back to the previous static site deployment")
|
|
211
|
+
.action(async () => {
|
|
212
|
+
const cloudCfg = loadCloudConfig(process.cwd())
|
|
213
|
+
if (!cloudCfg?.projectSlug) {
|
|
214
|
+
console.error("Not linked to a cloud project. Rollback is only available for cloud deployments.")
|
|
215
|
+
process.exit(1)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com"
|
|
219
|
+
const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
|
|
220
|
+
|
|
221
|
+
const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments/rollback`, {
|
|
222
|
+
method: "POST",
|
|
223
|
+
headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
if (!res.ok) {
|
|
227
|
+
const body = await res.text()
|
|
228
|
+
console.error(`Rollback failed: ${res.status} ${body}`)
|
|
229
|
+
process.exit(1)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const { data } = await res.json() as { data: { version: string; message: string } }
|
|
233
|
+
console.log(`Rolled back to deployment ${data.version}.`)
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
// supatype deploy status
|
|
237
|
+
deploy
|
|
238
|
+
.command("status")
|
|
239
|
+
.description("Show current deployment status")
|
|
240
|
+
.action(async () => {
|
|
241
|
+
const cloudCfg = loadCloudConfig(process.cwd())
|
|
242
|
+
if (!cloudCfg?.projectSlug) {
|
|
243
|
+
console.error("Not linked to a cloud project.")
|
|
244
|
+
process.exit(1)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com"
|
|
248
|
+
const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
|
|
249
|
+
|
|
250
|
+
const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments/current`, {
|
|
251
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
if (!res.ok) {
|
|
255
|
+
console.error("No active deployment found.")
|
|
256
|
+
return
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const { data } = await res.json() as { data: {
|
|
260
|
+
version: string
|
|
261
|
+
timestamp: string
|
|
262
|
+
size: number
|
|
263
|
+
buildDuration: number
|
|
264
|
+
url: string
|
|
265
|
+
status: string
|
|
266
|
+
}}
|
|
267
|
+
|
|
268
|
+
console.log(`Deployment: ${data.version}`)
|
|
269
|
+
console.log(`Status: ${data.status}`)
|
|
270
|
+
console.log(`Deployed: ${data.timestamp}`)
|
|
271
|
+
console.log(`Size: ${(data.size / (1024 * 1024)).toFixed(1)}MB`)
|
|
272
|
+
console.log(`Build duration: ${data.buildDuration}s`)
|
|
273
|
+
console.log(`URL: ${data.url}`)
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
// supatype deploy logs <version>
|
|
277
|
+
deploy
|
|
278
|
+
.command("logs [version]")
|
|
279
|
+
.description("Show build logs for a deployment")
|
|
280
|
+
.action(async (version?: string) => {
|
|
281
|
+
const cloudCfg = loadCloudConfig(process.cwd())
|
|
282
|
+
if (!cloudCfg?.projectSlug) {
|
|
283
|
+
console.error("Not linked to a cloud project.")
|
|
284
|
+
process.exit(1)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com"
|
|
288
|
+
const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
|
|
289
|
+
|
|
290
|
+
const versionPath = version ? `/${version}` : "/current"
|
|
291
|
+
const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments${versionPath}/logs`, {
|
|
292
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
if (!res.ok) {
|
|
296
|
+
console.error("Logs not found.")
|
|
297
|
+
process.exit(1)
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
const { data } = await res.json() as { data: { logs: string } }
|
|
301
|
+
console.log(data.logs)
|
|
302
|
+
})
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
async function deployToCloud(
|
|
306
|
+
config: { projectRef?: string; apiUrl?: string; accessToken?: string },
|
|
307
|
+
outputDir: string,
|
|
308
|
+
isPreview: boolean,
|
|
309
|
+
): Promise<void> {
|
|
310
|
+
const apiUrl = config.apiUrl || "https://api.supatype.com"
|
|
311
|
+
const token = config.accessToken || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
|
|
312
|
+
|
|
313
|
+
console.log("Uploading build artifacts...")
|
|
314
|
+
|
|
315
|
+
// Collect files from output directory
|
|
316
|
+
const files = collectFiles(outputDir, outputDir)
|
|
317
|
+
console.log(`${files.length} files to upload (${formatSize(files.reduce((s, f) => s + f.size, 0))})`)
|
|
318
|
+
|
|
319
|
+
// Create deployment
|
|
320
|
+
const createRes = await fetch(`${apiUrl}/platform/v1/projects/${config.projectRef}/deployments`, {
|
|
321
|
+
method: "POST",
|
|
322
|
+
headers: {
|
|
323
|
+
Authorization: `Bearer ${token}`,
|
|
324
|
+
"Content-Type": "application/json",
|
|
325
|
+
},
|
|
326
|
+
body: JSON.stringify({
|
|
327
|
+
preview: isPreview,
|
|
328
|
+
fileCount: files.length,
|
|
329
|
+
totalSize: files.reduce((s, f) => s + f.size, 0),
|
|
330
|
+
files: files.map((f) => ({ path: f.relativePath, size: f.size })),
|
|
331
|
+
}),
|
|
332
|
+
})
|
|
333
|
+
|
|
334
|
+
if (!createRes.ok) {
|
|
335
|
+
const body = await createRes.text()
|
|
336
|
+
throw new Error(`Failed to create deployment: ${createRes.status} ${body}`)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const { data } = await createRes.json() as { data: { deploymentId: string; uploadUrl: string } }
|
|
340
|
+
|
|
341
|
+
// Upload files (simplified — in production, use multipart or presigned URLs)
|
|
342
|
+
for (const file of files) {
|
|
343
|
+
const content = require("node:fs").readFileSync(file.absolutePath)
|
|
344
|
+
await fetch(`${data.uploadUrl}/${file.relativePath}`, {
|
|
345
|
+
method: "PUT",
|
|
346
|
+
headers: {
|
|
347
|
+
Authorization: `Bearer ${token}`,
|
|
348
|
+
"Content-Type": "application/octet-stream",
|
|
349
|
+
"X-Deployment-Id": data.deploymentId,
|
|
350
|
+
},
|
|
351
|
+
body: content,
|
|
352
|
+
})
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Finalize deployment
|
|
356
|
+
await fetch(`${apiUrl}/platform/v1/projects/${config.projectRef}/deployments/${data.deploymentId}/finalize`, {
|
|
357
|
+
method: "POST",
|
|
358
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
359
|
+
})
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function deploySelfHost(outputDir: string, cwd: string): void {
|
|
363
|
+
const servingDir = join(cwd, ".supatype", "static")
|
|
364
|
+
const { mkdirSync, cpSync } = require("node:fs") as typeof import("node:fs")
|
|
365
|
+
mkdirSync(servingDir, { recursive: true })
|
|
366
|
+
cpSync(outputDir, servingDir, { recursive: true })
|
|
367
|
+
console.log(`Static files deployed to ${servingDir}`)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
interface FileEntry {
|
|
371
|
+
absolutePath: string
|
|
372
|
+
relativePath: string
|
|
373
|
+
size: number
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function collectFiles(dir: string, baseDir: string): FileEntry[] {
|
|
377
|
+
const files: FileEntry[] = []
|
|
378
|
+
const { readdirSync, statSync } = require("node:fs") as typeof import("node:fs")
|
|
379
|
+
const { relative } = require("node:path") as typeof import("node:path")
|
|
380
|
+
|
|
381
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
382
|
+
const fullPath = join(dir, entry.name)
|
|
383
|
+
if (entry.isFile()) {
|
|
384
|
+
files.push({
|
|
385
|
+
absolutePath: fullPath,
|
|
386
|
+
relativePath: relative(baseDir, fullPath).replace(/\\/g, "/"),
|
|
387
|
+
size: statSync(fullPath).size,
|
|
388
|
+
})
|
|
389
|
+
} else if (entry.isDirectory()) {
|
|
390
|
+
files.push(...collectFiles(fullPath, baseDir))
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return files
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function formatSize(bytes: number): string {
|
|
397
|
+
if (bytes < 1024) return `${bytes}B`
|
|
398
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`
|
|
399
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`
|
|
400
|
+
}
|