@supatype/cli 0.1.0-alpha.9 → 0.1.1
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 +2 -2
- package/.turbo/turbo-test.log +285 -69
- package/.turbo/turbo-typecheck.log +1 -1
- package/assets/supatype-logo-wordmark.ascii.txt +6 -0
- package/bin/dev-entry.ts +2 -1
- package/dist/app/framework.js +1 -3
- package/dist/app/framework.js.map +1 -1
- package/dist/app/proxy-dev-app.d.ts +14 -0
- package/dist/app/proxy-dev-app.d.ts.map +1 -1
- package/dist/app/proxy-dev-app.js +110 -6
- package/dist/app/proxy-dev-app.js.map +1 -1
- package/dist/app-config.d.ts +10 -0
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +72 -0
- package/dist/app-config.js.map +1 -1
- package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
- package/dist/binary-cache.d.ts +19 -7
- package/dist/binary-cache.d.ts.map +1 -1
- package/dist/binary-cache.js +92 -46
- package/dist/binary-cache.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +17 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +86 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/admin.d.ts +28 -1
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +297 -149
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/adopt.d.ts +3 -0
- package/dist/commands/adopt.d.ts.map +1 -0
- package/dist/commands/adopt.js +55 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +20 -17
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/cache.d.ts.map +1 -1
- package/dist/commands/cache.js +11 -10
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/cloud.d.ts +4 -9
- package/dist/commands/cloud.d.ts.map +1 -1
- package/dist/commands/cloud.js +75 -125
- package/dist/commands/cloud.js.map +1 -1
- package/dist/commands/db.d.ts.map +1 -1
- package/dist/commands/db.js +37 -58
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +140 -96
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +74 -39
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +39 -39
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +78 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/engine.d.ts.map +1 -1
- package/dist/commands/engine.js +5 -4
- package/dist/commands/engine.js.map +1 -1
- package/dist/commands/functions.d.ts.map +1 -1
- package/dist/commands/functions.js +172 -119
- package/dist/commands/functions.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +5 -4
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts +35 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +883 -107
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/introspect.d.ts +3 -0
- package/dist/commands/introspect.d.ts.map +1 -0
- package/dist/commands/introspect.js +35 -0
- package/dist/commands/introspect.js.map +1 -0
- package/dist/commands/keys.d.ts +15 -1
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +46 -10
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/link-helpers.d.ts +15 -0
- package/dist/commands/link-helpers.d.ts.map +1 -0
- package/dist/commands/link-helpers.js +225 -0
- package/dist/commands/link-helpers.js.map +1 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +5 -4
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/migrate-from-v1.d.ts.map +1 -1
- package/dist/commands/migrate-from-v1.js +3 -2
- package/dist/commands/migrate-from-v1.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +119 -26
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/pg.d.ts.map +1 -1
- package/dist/commands/pg.js +11 -12
- package/dist/commands/pg.js.map +1 -1
- package/dist/commands/plugins.d.ts.map +1 -1
- package/dist/commands/plugins.js +55 -46
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +33 -5
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +111 -138
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/seed.d.ts.map +1 -1
- package/dist/commands/seed.js +4 -3
- package/dist/commands/seed.js.map +1 -1
- package/dist/commands/self-host.d.ts +2 -2
- package/dist/commands/self-host.d.ts.map +1 -1
- package/dist/commands/self-host.js +65 -50
- package/dist/commands/self-host.js.map +1 -1
- package/dist/commands/self-update.d.ts.map +1 -1
- package/dist/commands/self-update.js +3 -2
- package/dist/commands/self-update.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +95 -29
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js +3 -2
- package/dist/commands/types.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +54 -21
- package/dist/commands/update.js.map +1 -1
- package/dist/compose-rename.d.ts +10 -0
- package/dist/compose-rename.d.ts.map +1 -0
- package/dist/compose-rename.js +67 -0
- package/dist/compose-rename.js.map +1 -0
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/dev-compose.d.ts +26 -0
- package/dist/dev-compose.d.ts.map +1 -1
- package/dist/dev-compose.js +357 -79
- package/dist/dev-compose.js.map +1 -1
- 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 +56 -0
- package/dist/dev-logo.js.map +1 -0
- package/dist/dev-ports.d.ts +27 -0
- package/dist/dev-ports.d.ts.map +1 -0
- package/dist/dev-ports.js +171 -0
- package/dist/dev-ports.js.map +1 -0
- package/dist/dev-session-lock.d.ts +25 -0
- package/dist/dev-session-lock.d.ts.map +1 -0
- package/dist/dev-session-lock.js +81 -0
- package/dist/dev-session-lock.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 +25 -0
- package/dist/dev-shutdown.d.ts.map +1 -0
- package/dist/dev-shutdown.js +114 -0
- package/dist/dev-shutdown.js.map +1 -0
- package/dist/dev-task-colors.d.ts +13 -0
- package/dist/dev-task-colors.d.ts.map +1 -0
- package/dist/dev-task-colors.js +43 -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 +5 -1
- package/dist/diff-output.d.ts.map +1 -1
- package/dist/diff-output.js +69 -0
- package/dist/diff-output.js.map +1 -1
- package/dist/docker-runtime.d.ts +30 -0
- package/dist/docker-runtime.d.ts.map +1 -0
- package/dist/docker-runtime.js +118 -0
- package/dist/docker-runtime.js.map +1 -0
- package/dist/engine-client.d.ts +10 -1
- package/dist/engine-client.d.ts.map +1 -1
- package/dist/engine-client.js +76 -17
- package/dist/engine-client.js.map +1 -1
- package/dist/engine-push-output.d.ts +17 -0
- package/dist/engine-push-output.d.ts.map +1 -0
- package/dist/engine-push-output.js +64 -0
- package/dist/engine-push-output.js.map +1 -0
- package/dist/ensure-binary.js +2 -2
- package/dist/ensure-binary.js.map +1 -1
- package/dist/env-file.d.ts +5 -0
- package/dist/env-file.d.ts.map +1 -0
- package/dist/env-file.js +33 -0
- package/dist/env-file.js.map +1 -0
- package/dist/gitignore.d.ts +8 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +41 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/kong-config.d.ts +9 -0
- package/dist/kong-config.d.ts.map +1 -1
- package/dist/kong-config.js +18 -1
- package/dist/kong-config.js.map +1 -1
- package/dist/link.d.ts +66 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +160 -0
- package/dist/link.js.map +1 -0
- package/dist/process-manager.d.ts +8 -0
- package/dist/process-manager.d.ts.map +1 -1
- package/dist/process-manager.js +53 -9
- package/dist/process-manager.js.map +1 -1
- package/dist/project-config.d.ts +30 -3
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +37 -4
- package/dist/project-config.js.map +1 -1
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +3 -0
- package/dist/prompts.js.map +1 -0
- package/dist/pull-utils.d.ts +50 -14
- package/dist/pull-utils.d.ts.map +1 -1
- package/dist/pull-utils.js +152 -12
- package/dist/pull-utils.js.map +1 -1
- package/dist/resolve-target.d.ts +86 -0
- package/dist/resolve-target.d.ts.map +1 -0
- package/dist/resolve-target.js +291 -0
- package/dist/resolve-target.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.map +1 -1
- package/dist/runtime-routes.js +7 -0
- package/dist/runtime-routes.js.map +1 -1
- package/dist/schema-ast-v2.d.ts +1 -1
- package/dist/schema-ast-v2.d.ts.map +1 -1
- package/dist/schema-ast-v2.js +2 -2
- package/dist/schema-ast-v2.js.map +1 -1
- package/dist/schema-sources.d.ts +40 -0
- package/dist/schema-sources.d.ts.map +1 -0
- package/dist/schema-sources.js +183 -0
- package/dist/schema-sources.js.map +1 -0
- package/dist/scripts/postinstall.js +5 -1
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/self-host-compose.d.ts +37 -1
- package/dist/self-host-compose.d.ts.map +1 -1
- package/dist/self-host-compose.js +234 -43
- package/dist/self-host-compose.js.map +1 -1
- package/dist/storage-provision.d.ts +4 -0
- package/dist/storage-provision.d.ts.map +1 -1
- package/dist/storage-provision.js +24 -2
- package/dist/storage-provision.js.map +1 -1
- 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.js +2 -2
- package/dist/systemd.js.map +1 -1
- package/dist/target-client.d.ts +10 -0
- package/dist/target-client.d.ts.map +1 -0
- package/dist/target-client.js +22 -0
- package/dist/target-client.js.map +1 -0
- package/dist/type-extractor.d.ts +11 -0
- package/dist/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor.js +95 -8
- package/dist/type-extractor.js.map +1 -1
- package/dist/ui/brand.d.ts +9 -0
- package/dist/ui/brand.d.ts.map +1 -0
- package/dist/ui/brand.js +11 -0
- package/dist/ui/brand.js.map +1 -0
- package/dist/ui/confirm.d.ts +12 -0
- package/dist/ui/confirm.d.ts.map +1 -0
- package/dist/ui/confirm.js +28 -0
- package/dist/ui/confirm.js.map +1 -0
- package/dist/ui/fatal.d.ts +10 -0
- package/dist/ui/fatal.d.ts.map +1 -0
- package/dist/ui/fatal.js +34 -0
- package/dist/ui/fatal.js.map +1 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +9 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/interactive.d.ts +3 -0
- package/dist/ui/interactive.d.ts.map +1 -0
- package/dist/ui/interactive.js +5 -0
- package/dist/ui/interactive.js.map +1 -0
- package/dist/ui/messages.d.ts +10 -0
- package/dist/ui/messages.d.ts.map +1 -0
- package/dist/ui/messages.js +35 -0
- package/dist/ui/messages.js.map +1 -0
- package/dist/ui/next-steps.d.ts +3 -0
- package/dist/ui/next-steps.d.ts.map +1 -0
- package/dist/ui/next-steps.js +10 -0
- package/dist/ui/next-steps.js.map +1 -0
- package/dist/ui/progress.d.ts +5 -0
- package/dist/ui/progress.d.ts.map +1 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/prompts.d.ts +14 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +34 -0
- package/dist/ui/prompts.js.map +1 -0
- package/package.json +5 -2
- package/src/app/framework.ts +1 -3
- package/src/app/proxy-dev-app.ts +114 -6
- package/src/app-config.ts +80 -0
- package/src/binary-cache.ts +102 -52
- package/src/cli.ts +16 -2
- package/src/commands/add.ts +97 -0
- package/src/commands/admin.ts +381 -190
- package/src/commands/adopt.ts +82 -0
- package/src/commands/app.ts +20 -17
- package/src/commands/cache.ts +11 -10
- package/src/commands/cloud.ts +91 -142
- package/src/commands/db.ts +40 -63
- package/src/commands/deploy.ts +186 -126
- package/src/commands/dev.ts +98 -55
- package/src/commands/diff.ts +52 -43
- package/src/commands/doctor.ts +103 -0
- package/src/commands/engine.ts +5 -4
- package/src/commands/functions.ts +187 -123
- package/src/commands/generate.ts +5 -4
- package/src/commands/init.ts +1087 -104
- package/src/commands/introspect.ts +48 -0
- package/src/commands/keys.ts +56 -14
- package/src/commands/link-helpers.ts +273 -0
- package/src/commands/logs.ts +5 -4
- package/src/commands/migrate-from-v1.ts +3 -2
- package/src/commands/migrate.ts +167 -27
- package/src/commands/pg.ts +13 -18
- package/src/commands/plugins.ts +55 -46
- package/src/commands/pull.ts +38 -9
- package/src/commands/push.ts +148 -175
- package/src/commands/seed.ts +5 -4
- package/src/commands/self-host.ts +85 -54
- package/src/commands/self-update.ts +3 -2
- package/src/commands/status.ts +102 -33
- package/src/commands/types.ts +3 -2
- package/src/commands/update.ts +59 -23
- package/src/compose-rename.ts +76 -0
- package/src/config.ts +2 -1
- package/src/dev-compose.ts +462 -76
- package/src/dev-log-bus.ts +101 -0
- package/src/dev-log-filter.ts +32 -0
- package/src/dev-logo.ts +61 -0
- package/src/dev-ports.ts +212 -0
- package/src/dev-session-lock.ts +101 -0
- package/src/dev-session.ts +130 -0
- package/src/dev-shutdown.ts +147 -0
- package/src/dev-task-colors.ts +47 -0
- package/src/dev-tui.ts +232 -0
- package/src/diff-output.ts +79 -1
- package/src/docker-runtime.ts +151 -0
- package/src/engine-client.ts +81 -17
- package/src/engine-push-output.ts +75 -0
- package/src/ensure-binary.ts +2 -2
- package/src/env-file.ts +37 -0
- package/src/gitignore.ts +48 -0
- package/src/kong-config.ts +24 -1
- package/src/link.ts +243 -0
- package/src/process-manager.ts +66 -10
- package/src/project-config.ts +62 -7
- package/src/prompts.ts +2 -0
- package/src/pull-utils.ts +217 -23
- package/src/resolve-target.ts +419 -0
- package/src/restore-system-relation-targets.ts +45 -0
- package/src/runtime-routes.ts +7 -0
- package/src/schema-ast-v2.ts +2 -1
- package/src/schema-sources.ts +248 -0
- package/src/scripts/postinstall.ts +7 -1
- package/src/self-host-compose.ts +262 -46
- package/src/storage-provision.ts +33 -1
- package/src/supatype-eval-1781522769253.mts +1 -0
- package/src/systemd.ts +2 -2
- package/src/target-client.ts +40 -0
- package/src/type-extractor.ts +124 -11
- package/src/ui/README.md +17 -0
- package/src/ui/brand.ts +12 -0
- package/src/ui/confirm.ts +38 -0
- package/src/ui/fatal.ts +43 -0
- package/src/ui/index.ts +8 -0
- package/src/ui/interactive.ts +4 -0
- package/src/ui/messages.ts +43 -0
- package/src/ui/next-steps.ts +10 -0
- package/src/ui/progress.ts +28 -0
- package/src/ui/prompts.ts +40 -0
- package/tests/admin-ensure.test.ts +59 -0
- package/tests/cli-help.test.ts +27 -2
- package/tests/config.test.ts +29 -2
- package/tests/dev-ports.test.ts +41 -0
- package/tests/dev-session-lock.test.ts +54 -0
- package/tests/dev-ui.test.ts +162 -0
- package/tests/docker-runtime.test.ts +236 -0
- package/tests/engine-push-output.test.ts +67 -0
- package/tests/init.test.ts +197 -18
- package/tests/link.test.ts +148 -0
- package/tests/minisign.test.ts +102 -0
- package/tests/proxy-dev-app.test.ts +45 -1
- package/tests/pull-utils.test.ts +5 -4
- package/tests/runtime-contract.test.ts +186 -2
- package/tests/schema-sources.test.ts +119 -0
- package/tests/storage-provision.test.ts +100 -0
- package/tests/ui-confirm.test.ts +41 -0
- package/tests/ui-messages.test.ts +66 -0
- package/tsconfig.tsbuildinfo +1 -1
package/dist/commands/db.js
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { loadConfig } from "../config.js";
|
|
7
7
|
import { connectionString } from "../project-config.js";
|
|
8
|
-
import {
|
|
8
|
+
import { loadProjectLink } from "../link.js";
|
|
9
|
+
import { resolveTarget } from "../resolve-target.js";
|
|
10
|
+
import { targetFetch } from "../target-client.js";
|
|
11
|
+
import { error, info, plain } from "../ui/messages.js";
|
|
9
12
|
export function registerDb(program) {
|
|
10
13
|
const db = program
|
|
11
14
|
.command("db")
|
|
12
15
|
.description("Database connection management");
|
|
13
|
-
// supatype db connection-string
|
|
14
16
|
db
|
|
15
17
|
.command("connection-string")
|
|
16
18
|
.description("Show the database connection string for the linked project")
|
|
@@ -19,96 +21,73 @@ export function registerDb(program) {
|
|
|
19
21
|
.action(async (opts) => {
|
|
20
22
|
const cwd = process.cwd();
|
|
21
23
|
const config = loadConfig(cwd);
|
|
22
|
-
const
|
|
24
|
+
const link = loadProjectLink(cwd);
|
|
23
25
|
const localConn = connectionString(config);
|
|
24
|
-
|
|
25
|
-
if (!cloudCfg?.projectSlug) {
|
|
26
|
+
if (!link || link.kind !== "cloud") {
|
|
26
27
|
const connStr = opts.transaction ? localConn.replace(/:5432\//, ":6432/") : localConn;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
plain(connStr);
|
|
29
|
+
plain();
|
|
30
|
+
plain("Session mode (port 5432): for interactive tools (psql, DataGrip, TablePlus)");
|
|
31
|
+
plain("Transaction mode (port 6432): for application servers and serverless functions");
|
|
31
32
|
return;
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
-
const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com";
|
|
35
|
-
const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
|
|
34
|
+
const target = resolveTarget(cwd, { env: opts.env });
|
|
36
35
|
const envName = opts.env || "production";
|
|
37
36
|
try {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
38
|
+
method: "GET",
|
|
39
|
+
path: `/projects/${target.projectRef}/environments`,
|
|
40
|
+
token: target.token,
|
|
41
|
+
orgId: target.orgId,
|
|
42
42
|
});
|
|
43
|
-
if (!res.ok) {
|
|
44
|
-
console.error(`Failed to fetch project info: ${res.status}`);
|
|
45
|
-
process.exitCode = 1;
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const { data } = (await res.json());
|
|
49
43
|
const env = data.find((e) => e.name === envName);
|
|
50
44
|
if (!env) {
|
|
51
|
-
|
|
45
|
+
error(`Environment "${envName}" not found`);
|
|
52
46
|
process.exitCode = 1;
|
|
53
47
|
return;
|
|
54
48
|
}
|
|
55
49
|
const connStr = env.databaseUrl || "Connection string not available";
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
console.log(connStr);
|
|
61
|
-
}
|
|
62
|
-
console.log();
|
|
63
|
-
console.log("Session mode (port 5432): for interactive tools (psql, DataGrip, TablePlus)");
|
|
64
|
-
console.log("Transaction mode (port 6432): for application servers and serverless functions");
|
|
50
|
+
plain(opts.transaction ? connStr.replace(/:5432\//, ":6432/") : connStr);
|
|
51
|
+
plain();
|
|
52
|
+
plain("Session mode (port 5432): for interactive tools (psql, DataGrip, TablePlus)");
|
|
53
|
+
plain("Transaction mode (port 6432): for application servers and serverless functions");
|
|
65
54
|
}
|
|
66
55
|
catch (err) {
|
|
67
|
-
|
|
56
|
+
error(`Failed to fetch connection string: ${err.message}`);
|
|
68
57
|
process.exitCode = 1;
|
|
69
58
|
}
|
|
70
59
|
});
|
|
71
|
-
// supatype db reset-password
|
|
72
60
|
db
|
|
73
61
|
.command("reset-password")
|
|
74
62
|
.description("Reset the database password for the linked project")
|
|
75
63
|
.option("--env <name>", "Environment name", "production")
|
|
76
64
|
.action(async (opts) => {
|
|
77
65
|
const cwd = process.cwd();
|
|
78
|
-
const
|
|
79
|
-
if (!
|
|
80
|
-
|
|
66
|
+
const link = loadProjectLink(cwd);
|
|
67
|
+
if (!link || link.kind !== "cloud") {
|
|
68
|
+
error("Not linked to a cloud project. Run: supatype link --project <ref>");
|
|
81
69
|
process.exitCode = 1;
|
|
82
70
|
return;
|
|
83
71
|
}
|
|
84
|
-
const
|
|
85
|
-
const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
|
|
72
|
+
const target = resolveTarget(cwd, { env: opts.env });
|
|
86
73
|
const envName = opts.env || "production";
|
|
87
74
|
try {
|
|
88
|
-
const
|
|
75
|
+
const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
89
76
|
method: "POST",
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
77
|
+
path: `/projects/${target.projectRef}/environments/${envName}/reset-db-password`,
|
|
78
|
+
token: target.token,
|
|
79
|
+
orgId: target.orgId,
|
|
94
80
|
});
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
81
|
+
info("Database password reset successfully.");
|
|
82
|
+
if (data.databaseUrl) {
|
|
83
|
+
plain(`\nNew connection string:\n${data.databaseUrl}`);
|
|
84
|
+
}
|
|
85
|
+
else if (data.password) {
|
|
86
|
+
plain(`\nNew password: ${data.password}`);
|
|
100
87
|
}
|
|
101
|
-
const { data } = (await res.json());
|
|
102
|
-
console.log("Database password reset successfully.");
|
|
103
|
-
console.log();
|
|
104
|
-
console.log(`New password: ${data.password}`);
|
|
105
|
-
console.log(`Connection string: ${data.connectionString}`);
|
|
106
|
-
console.log();
|
|
107
|
-
console.log("Warning: Existing database connections have been terminated.");
|
|
108
|
-
console.log("Update your application with the new connection string.");
|
|
109
88
|
}
|
|
110
89
|
catch (err) {
|
|
111
|
-
|
|
90
|
+
error(`Failed to reset password: ${err.message}`);
|
|
112
91
|
process.exitCode = 1;
|
|
113
92
|
}
|
|
114
93
|
});
|
package/dist/commands/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgBxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwSrD"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -10,19 +10,25 @@
|
|
|
10
10
|
* supatype deploy status — show current deployment info
|
|
11
11
|
* supatype deploy logs <version> — show build logs
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { readdirSync, statSync, mkdirSync, cpSync } from "node:fs";
|
|
14
|
+
import { join, relative } from "node:path";
|
|
14
15
|
import { loadConfig, loadSchemaAst } from "../config.js";
|
|
15
16
|
import { connectionString, schemaPathFromProject } from "../project-config.js";
|
|
16
17
|
import { deploySchemaToLinkedProject, loadCloudConfig, pushSchemaToLinkedProject } from "./cloud.js";
|
|
18
|
+
import { loadProjectLink } from "../link.js";
|
|
19
|
+
import { resolveTarget } from "../resolve-target.js";
|
|
20
|
+
import { targetFetch } from "../target-client.js";
|
|
17
21
|
import { ensureEngine, engineRequest } from "../engine-client.js";
|
|
18
22
|
import { resolveAppConfig, validateStaticMode, validateBuildOutput, detectPackageManager } from "../app/framework.js";
|
|
19
23
|
import { spawnSync } from "node:child_process";
|
|
24
|
+
import { error, info, plain, step } from "../ui/messages.js";
|
|
20
25
|
export function registerDeploy(program) {
|
|
21
26
|
const deploy = program
|
|
22
27
|
.command("deploy")
|
|
23
28
|
.description("Deploy schema and app — Supatype Cloud by default when linked (`supatype link`); pass --local for engine + your database")
|
|
24
29
|
.option("--local", "Use local schema engine and database_url from config (skip cloud control plane)")
|
|
25
|
-
.option("--environment <name>", "
|
|
30
|
+
.option("--environment <name>", "Target environment when linked", "production")
|
|
31
|
+
.option("--env <name>", "Alias for --environment")
|
|
26
32
|
.option("--app-only", "Skip schema push, only deploy the static site")
|
|
27
33
|
.option("--schema-only", "Skip app build, only push schema changes")
|
|
28
34
|
.option("--skip-build", "Deploy existing build output without building")
|
|
@@ -31,14 +37,15 @@ export function registerDeploy(program) {
|
|
|
31
37
|
.action(async (opts) => {
|
|
32
38
|
const cwd = process.cwd();
|
|
33
39
|
const config = loadConfig(cwd);
|
|
40
|
+
const link = loadProjectLink(cwd);
|
|
34
41
|
const cloudCfg = loadCloudConfig(cwd);
|
|
42
|
+
const envName = opts.env ?? opts.environment ?? "production";
|
|
35
43
|
let schemaDone = false;
|
|
36
|
-
// Default: cloud — .supatype/cloud.json → control plane schema deploy
|
|
37
44
|
if (!opts.local &&
|
|
38
|
-
|
|
45
|
+
link &&
|
|
39
46
|
!opts.appOnly &&
|
|
40
47
|
!opts.skipBuild) {
|
|
41
|
-
await deploySchemaToLinkedProject(cwd,
|
|
48
|
+
await deploySchemaToLinkedProject(cwd, envName);
|
|
42
49
|
schemaDone = true;
|
|
43
50
|
if (opts.schemaOnly) {
|
|
44
51
|
return;
|
|
@@ -48,7 +55,7 @@ export function registerDeploy(program) {
|
|
|
48
55
|
if (!opts.appOnly && !opts.skipBuild && !schemaDone) {
|
|
49
56
|
const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd);
|
|
50
57
|
if (opts.local) {
|
|
51
|
-
|
|
58
|
+
step("Schema Push (local)");
|
|
52
59
|
await ensureEngine();
|
|
53
60
|
const diff = await engineRequest("/diff", {
|
|
54
61
|
ast,
|
|
@@ -57,25 +64,25 @@ export function registerDeploy(program) {
|
|
|
57
64
|
});
|
|
58
65
|
const ops = diff.operations ?? [];
|
|
59
66
|
if (ops.length > 0) {
|
|
60
|
-
|
|
67
|
+
info(`${ops.length} schema change(s) to apply.`);
|
|
61
68
|
await engineRequest("/push", {
|
|
62
69
|
ast,
|
|
63
70
|
database_url: connectionString(config),
|
|
64
71
|
schema: "public",
|
|
65
72
|
force: true,
|
|
66
73
|
});
|
|
67
|
-
|
|
74
|
+
info("Schema changes applied.");
|
|
68
75
|
}
|
|
69
76
|
else {
|
|
70
|
-
|
|
77
|
+
info("Schema is up to date.");
|
|
71
78
|
}
|
|
72
79
|
}
|
|
73
|
-
else if (
|
|
74
|
-
|
|
75
|
-
await pushSchemaToLinkedProject(cwd, { force: opts.yes ?? true });
|
|
80
|
+
else if (link) {
|
|
81
|
+
step("Schema Push (linked)");
|
|
82
|
+
await pushSchemaToLinkedProject(cwd, { force: opts.yes ?? true, env: envName });
|
|
76
83
|
}
|
|
77
84
|
else {
|
|
78
|
-
|
|
85
|
+
error("Not linked to Supatype Cloud. Run: supatype link\n" +
|
|
79
86
|
"Or deploy against your own database: supatype deploy --local");
|
|
80
87
|
process.exit(1);
|
|
81
88
|
}
|
|
@@ -84,26 +91,26 @@ export function registerDeploy(program) {
|
|
|
84
91
|
if (!opts.schemaOnly) {
|
|
85
92
|
if (!config.build) {
|
|
86
93
|
if (opts.appOnly) {
|
|
87
|
-
|
|
94
|
+
error("No build section found in supatype.config.ts");
|
|
88
95
|
process.exit(1);
|
|
89
96
|
}
|
|
90
97
|
// No build config — skip app deployment silently
|
|
91
98
|
return;
|
|
92
99
|
}
|
|
93
|
-
|
|
100
|
+
step("App Build & Deploy");
|
|
94
101
|
const appConfig = resolveAppConfig(config.build, cwd);
|
|
95
102
|
// Validate static mode
|
|
96
103
|
const staticError = validateStaticMode(appConfig.framework, appConfig.directory);
|
|
97
104
|
if (staticError) {
|
|
98
|
-
|
|
105
|
+
error(staticError);
|
|
99
106
|
process.exit(1);
|
|
100
107
|
}
|
|
101
108
|
// Build step
|
|
102
109
|
if (!opts.skipBuild && appConfig.buildCommand) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
110
|
+
info(`Framework: ${appConfig.framework}`);
|
|
111
|
+
info(`Build command: ${appConfig.buildCommand}`);
|
|
112
|
+
info(`Output directory: ${appConfig.outputDirectory}`);
|
|
113
|
+
plain();
|
|
107
114
|
// Inject environment variables
|
|
108
115
|
const buildEnv = {
|
|
109
116
|
...process.env,
|
|
@@ -118,7 +125,7 @@ export function registerDeploy(program) {
|
|
|
118
125
|
}
|
|
119
126
|
// Install dependencies
|
|
120
127
|
const pm = detectPackageManager(appConfig.directory);
|
|
121
|
-
|
|
128
|
+
info(`Installing dependencies (${pm})...`);
|
|
122
129
|
const installResult = spawnSync(pm, ["install"], {
|
|
123
130
|
cwd: appConfig.directory,
|
|
124
131
|
stdio: "inherit",
|
|
@@ -126,11 +133,11 @@ export function registerDeploy(program) {
|
|
|
126
133
|
timeout: 5 * 60 * 1000, // 5 minute timeout
|
|
127
134
|
});
|
|
128
135
|
if (installResult.status !== 0) {
|
|
129
|
-
|
|
136
|
+
error("Dependency installation failed.");
|
|
130
137
|
process.exit(1);
|
|
131
138
|
}
|
|
132
139
|
// Run build
|
|
133
|
-
|
|
140
|
+
plain("\nBuilding...");
|
|
134
141
|
const [buildCmd, ...buildArgs] = appConfig.buildCommand.split(" ");
|
|
135
142
|
const buildResult = spawnSync(buildCmd, buildArgs, {
|
|
136
143
|
cwd: appConfig.directory,
|
|
@@ -139,7 +146,7 @@ export function registerDeploy(program) {
|
|
|
139
146
|
timeout: 10 * 60 * 1000, // 10 minute timeout
|
|
140
147
|
});
|
|
141
148
|
if (buildResult.status !== 0) {
|
|
142
|
-
|
|
149
|
+
error("Build failed.");
|
|
143
150
|
process.exit(1);
|
|
144
151
|
}
|
|
145
152
|
}
|
|
@@ -147,22 +154,26 @@ export function registerDeploy(program) {
|
|
|
147
154
|
const maxSizeMb = 500; // Default, should be tier-aware in cloud
|
|
148
155
|
const validationError = validateBuildOutput(appConfig.outputDirectory, maxSizeMb);
|
|
149
156
|
if (validationError) {
|
|
150
|
-
|
|
157
|
+
error(validationError);
|
|
151
158
|
process.exit(1);
|
|
152
159
|
}
|
|
153
160
|
// Deploy (--local never uploads to cloud, even if linked)
|
|
154
|
-
if (
|
|
155
|
-
await
|
|
161
|
+
if (link && !opts.local) {
|
|
162
|
+
await deployStaticSite(cwd, appConfig.outputDirectory, {
|
|
163
|
+
preview: opts.preview ?? false,
|
|
164
|
+
env: envName,
|
|
165
|
+
});
|
|
156
166
|
}
|
|
157
167
|
else {
|
|
158
168
|
deploySelfHost(appConfig.outputDirectory, cwd);
|
|
159
169
|
}
|
|
160
|
-
|
|
161
|
-
if (
|
|
170
|
+
info("Deployment complete!");
|
|
171
|
+
if (link && !opts.local) {
|
|
172
|
+
const target = resolveTarget(cwd, { env: envName });
|
|
162
173
|
const url = opts.preview
|
|
163
|
-
?
|
|
164
|
-
:
|
|
165
|
-
|
|
174
|
+
? `${target.apiBaseUrl}/preview`
|
|
175
|
+
: target.apiBaseUrl;
|
|
176
|
+
info(`URL: ${url}`);
|
|
166
177
|
}
|
|
167
178
|
}
|
|
168
179
|
});
|
|
@@ -170,93 +181,128 @@ export function registerDeploy(program) {
|
|
|
170
181
|
deploy
|
|
171
182
|
.command("rollback")
|
|
172
183
|
.description("Roll back to the previous static site deployment")
|
|
173
|
-
.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
184
|
+
.option("--env <name>", "Target environment when linked")
|
|
185
|
+
.option("--to <id>", "Roll back to a specific deployment id or version")
|
|
186
|
+
.action(async (opts) => {
|
|
187
|
+
const cwd = process.cwd();
|
|
188
|
+
const link = loadProjectLink(cwd);
|
|
189
|
+
if (!link) {
|
|
190
|
+
error("Not linked to a project. Rollback requires a linked target.");
|
|
177
191
|
process.exit(1);
|
|
178
192
|
}
|
|
179
|
-
const
|
|
180
|
-
const
|
|
181
|
-
const
|
|
193
|
+
const target = resolveTarget(cwd, { env: opts.env });
|
|
194
|
+
const body = opts.to ? { to: opts.to } : undefined;
|
|
195
|
+
const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
182
196
|
method: "POST",
|
|
183
|
-
|
|
197
|
+
path: `/projects/${target.projectRef}/deployments/rollback`,
|
|
198
|
+
body,
|
|
199
|
+
token: target.token,
|
|
200
|
+
orgId: target.orgId,
|
|
201
|
+
environment: target.mode === "cloud" ? target.environment : undefined,
|
|
184
202
|
});
|
|
185
|
-
|
|
186
|
-
const body = await res.text();
|
|
187
|
-
console.error(`Rollback failed: ${res.status} ${body}`);
|
|
188
|
-
process.exit(1);
|
|
189
|
-
}
|
|
190
|
-
const { data } = await res.json();
|
|
191
|
-
console.log(`Rolled back to deployment ${data.version}.`);
|
|
203
|
+
info(`Rolled back to deployment ${data.version ?? "previous"}.`);
|
|
192
204
|
});
|
|
193
205
|
// supatype deploy status
|
|
194
206
|
deploy
|
|
195
207
|
.command("status")
|
|
196
208
|
.description("Show current deployment status")
|
|
197
|
-
.
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
209
|
+
.option("--env <name>", "Target environment when linked")
|
|
210
|
+
.action(async (opts) => {
|
|
211
|
+
const cwd = process.cwd();
|
|
212
|
+
const link = loadProjectLink(cwd);
|
|
213
|
+
if (!link) {
|
|
214
|
+
error("Not linked to a project.");
|
|
201
215
|
process.exit(1);
|
|
202
216
|
}
|
|
203
|
-
const
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
217
|
+
const target = resolveTarget(cwd, { env: opts.env });
|
|
218
|
+
const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
219
|
+
method: "GET",
|
|
220
|
+
path: `/projects/${target.projectRef}/deployments/current`,
|
|
221
|
+
token: target.token,
|
|
222
|
+
orgId: target.orgId,
|
|
223
|
+
environment: target.mode === "cloud" ? target.environment : undefined,
|
|
207
224
|
});
|
|
208
|
-
if (!
|
|
209
|
-
|
|
225
|
+
if (!data) {
|
|
226
|
+
info("No active deployment found.");
|
|
210
227
|
return;
|
|
211
228
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
229
|
+
info(`Deployment: ${data.version ?? data.id ?? "unknown"}`);
|
|
230
|
+
info(`Status: ${data.status ?? "live"}`);
|
|
231
|
+
if (data.timestamp ?? data.createdAt) {
|
|
232
|
+
info(`Deployed: ${data.timestamp ?? data.createdAt}`);
|
|
233
|
+
}
|
|
234
|
+
if (data.size)
|
|
235
|
+
info(`Size: ${(data.size / (1024 * 1024)).toFixed(1)}MB`);
|
|
236
|
+
if (data.buildDuration)
|
|
237
|
+
info(`Build duration: ${data.buildDuration}s`);
|
|
238
|
+
if (data.url)
|
|
239
|
+
info(`URL: ${data.url}`);
|
|
219
240
|
});
|
|
220
241
|
// supatype deploy logs <version>
|
|
221
242
|
deploy
|
|
222
243
|
.command("logs [version]")
|
|
223
244
|
.description("Show build logs for a deployment")
|
|
224
|
-
.
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
245
|
+
.option("--env <name>", "Target environment when linked")
|
|
246
|
+
.action(async (version, opts) => {
|
|
247
|
+
const cwd = process.cwd();
|
|
248
|
+
const link = loadProjectLink(cwd);
|
|
249
|
+
if (!link) {
|
|
250
|
+
error("Not linked to a project.");
|
|
228
251
|
process.exit(1);
|
|
229
252
|
}
|
|
230
|
-
const
|
|
231
|
-
const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
|
|
253
|
+
const target = resolveTarget(cwd, { env: opts.env });
|
|
232
254
|
const versionPath = version ? `/${version}` : "/current";
|
|
233
|
-
const
|
|
234
|
-
|
|
255
|
+
const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
256
|
+
method: "GET",
|
|
257
|
+
path: `/projects/${target.projectRef}/deployments${versionPath}/logs`,
|
|
258
|
+
token: target.token,
|
|
259
|
+
orgId: target.orgId,
|
|
260
|
+
environment: target.mode === "cloud" ? target.environment : undefined,
|
|
235
261
|
});
|
|
236
|
-
|
|
237
|
-
console.error("Logs not found.");
|
|
238
|
-
process.exit(1);
|
|
239
|
-
}
|
|
240
|
-
const { data } = await res.json();
|
|
241
|
-
console.log(data.logs);
|
|
262
|
+
plain(data.logs ?? "(no logs)");
|
|
242
263
|
});
|
|
243
264
|
}
|
|
244
|
-
async function
|
|
245
|
-
const
|
|
246
|
-
const token =
|
|
247
|
-
|
|
248
|
-
|
|
265
|
+
async function deployStaticSite(cwd, outputDir, opts) {
|
|
266
|
+
const target = resolveTarget(cwd, { env: opts.env });
|
|
267
|
+
const token = target.token;
|
|
268
|
+
if (!token) {
|
|
269
|
+
throw new Error("No token for linked target. Re-run supatype link --token ...");
|
|
270
|
+
}
|
|
271
|
+
info("Uploading build artifacts...");
|
|
249
272
|
const files = collectFiles(outputDir, outputDir);
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
273
|
+
info(`${files.length} files to upload (${formatSize(files.reduce((s, f) => s + f.size, 0))})`);
|
|
274
|
+
const { readFileSync } = await import("node:fs");
|
|
275
|
+
if (target.apiPrefix === "/platform/v1") {
|
|
276
|
+
const filePayload = files.map((f) => ({
|
|
277
|
+
path: f.relativePath,
|
|
278
|
+
content: readFileSync(f.absolutePath).toString("base64"),
|
|
279
|
+
encoding: "base64",
|
|
280
|
+
}));
|
|
281
|
+
const created = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
282
|
+
method: "POST",
|
|
283
|
+
path: `/projects/${target.projectRef}/deployments`,
|
|
284
|
+
body: { preview: opts.preview ?? false, files: filePayload },
|
|
285
|
+
token,
|
|
286
|
+
orgId: target.orgId,
|
|
287
|
+
});
|
|
288
|
+
await targetFetch(target.apiBaseUrl, target.apiPrefix, {
|
|
289
|
+
method: "POST",
|
|
290
|
+
path: `/projects/${target.projectRef}/deployments/${created.id}/finalize`,
|
|
291
|
+
token,
|
|
292
|
+
orgId: target.orgId,
|
|
293
|
+
});
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const createRes = await fetch(`${target.apiBaseUrl}/api/v1/projects/${target.projectRef}/deployments`, {
|
|
253
297
|
method: "POST",
|
|
254
298
|
headers: {
|
|
255
299
|
Authorization: `Bearer ${token}`,
|
|
256
300
|
"Content-Type": "application/json",
|
|
301
|
+
...(target.orgId ? { "X-Org-Id": target.orgId } : {}),
|
|
302
|
+
...(target.environment ? { "X-Supatype-Environment": target.environment } : {}),
|
|
257
303
|
},
|
|
258
304
|
body: JSON.stringify({
|
|
259
|
-
preview:
|
|
305
|
+
preview: opts.preview ?? false,
|
|
260
306
|
fileCount: files.length,
|
|
261
307
|
totalSize: files.reduce((s, f) => s + f.size, 0),
|
|
262
308
|
files: files.map((f) => ({ path: f.relativePath, size: f.size })),
|
|
@@ -267,9 +313,8 @@ async function deployToCloud(config, outputDir, isPreview) {
|
|
|
267
313
|
throw new Error(`Failed to create deployment: ${createRes.status} ${body}`);
|
|
268
314
|
}
|
|
269
315
|
const { data } = await createRes.json();
|
|
270
|
-
// Upload files (simplified — in production, use multipart or presigned URLs)
|
|
271
316
|
for (const file of files) {
|
|
272
|
-
const content =
|
|
317
|
+
const content = readFileSync(file.absolutePath);
|
|
273
318
|
await fetch(`${data.uploadUrl}/${file.relativePath}`, {
|
|
274
319
|
method: "PUT",
|
|
275
320
|
headers: {
|
|
@@ -280,23 +325,22 @@ async function deployToCloud(config, outputDir, isPreview) {
|
|
|
280
325
|
body: content,
|
|
281
326
|
});
|
|
282
327
|
}
|
|
283
|
-
|
|
284
|
-
await fetch(`${apiUrl}/platform/v1/projects/${config.projectRef}/deployments/${data.deploymentId}/finalize`, {
|
|
328
|
+
await fetch(`${target.apiBaseUrl}/api/v1/projects/${target.projectRef}/deployments/${data.deploymentId}/finalize`, {
|
|
285
329
|
method: "POST",
|
|
286
|
-
headers: {
|
|
330
|
+
headers: {
|
|
331
|
+
Authorization: `Bearer ${token}`,
|
|
332
|
+
...(target.orgId ? { "X-Org-Id": target.orgId } : {}),
|
|
333
|
+
},
|
|
287
334
|
});
|
|
288
335
|
}
|
|
289
336
|
function deploySelfHost(outputDir, cwd) {
|
|
290
337
|
const servingDir = join(cwd, ".supatype", "static");
|
|
291
|
-
const { mkdirSync, cpSync } = require("node:fs");
|
|
292
338
|
mkdirSync(servingDir, { recursive: true });
|
|
293
339
|
cpSync(outputDir, servingDir, { recursive: true });
|
|
294
|
-
|
|
340
|
+
info(`Static files deployed to ${servingDir}`);
|
|
295
341
|
}
|
|
296
342
|
function collectFiles(dir, baseDir) {
|
|
297
343
|
const files = [];
|
|
298
|
-
const { readdirSync, statSync } = require("node:fs");
|
|
299
|
-
const { relative } = require("node:path");
|
|
300
344
|
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
301
345
|
const fullPath = join(dir, entry.name);
|
|
302
346
|
if (entry.isFile()) {
|