@supatype/cli 0.1.0-alpha.8 → 0.1.0
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 +274 -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.map +1 -1
- package/dist/commands/admin.js +39 -53
- 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 +72 -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 +30 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +814 -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 +110 -137
- 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/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 +328 -34
- 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-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 +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/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/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 +37 -1
- package/dist/self-host-compose.d.ts.map +1 -1
- package/dist/self-host-compose.js +233 -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 +9 -4
- 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 +39 -73
- 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 +95 -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 +996 -105
- 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 +147 -174
- 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/config.ts +2 -1
- package/src/dev-compose.ts +426 -34
- 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-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 +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/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/seed.ts +43 -0
- package/src/self-host-compose.ts +261 -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/cli-help.test.ts +27 -2
- package/tests/config.test.ts +29 -2
- package/tests/dev-ui.test.ts +139 -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/src/commands/push.ts
CHANGED
|
@@ -1,17 +1,34 @@
|
|
|
1
1
|
import type { Command } from "commander"
|
|
2
2
|
import { mkdirSync, writeFileSync } from "node:fs"
|
|
3
|
-
import { createInterface } from "node:readline"
|
|
4
3
|
import { join } from "node:path"
|
|
5
4
|
import { loadConfig, loadSchemaAst } from "../config.js"
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { printDiffWarnings } from "../diff-output.js"
|
|
5
|
+
import { resolveRuntimeProvider, schemaPathFromProject, serverBaseUrl } from "../project-config.js"
|
|
6
|
+
import { ensureEngine, engineRequest, type DiffResult } from "../engine-client.js"
|
|
7
|
+
import { printDiffOperations, printDiffWarnings } from "../diff-output.js"
|
|
10
8
|
import { signJwt } from "../jwt.js"
|
|
11
|
-
import {
|
|
9
|
+
import { provisionBucketsFromAst } from "../storage-provision.js"
|
|
10
|
+
import type { ExtractedSchemaAstV2 } from "../schema-ast-v2.js"
|
|
12
11
|
import { promptFirstAdminUser } from "./admin.js"
|
|
13
12
|
import { withAdminRoles } from "../studio-admin-roles.js"
|
|
13
|
+
import { restoreSystemRelationTargets } from "../restore-system-relation-targets.js"
|
|
14
14
|
import type { SupatypeProjectConfig } from "../project-config.js"
|
|
15
|
+
import {
|
|
16
|
+
resolveTarget,
|
|
17
|
+
targetSchemaDiff,
|
|
18
|
+
targetSchemaPush,
|
|
19
|
+
schemaPgSchema,
|
|
20
|
+
type DeployTarget,
|
|
21
|
+
} from "../resolve-target.js"
|
|
22
|
+
import { loadProjectLink } from "../link.js"
|
|
23
|
+
import {
|
|
24
|
+
buildSchemaSourcesPayload,
|
|
25
|
+
cacheSchemaSourcesLocally,
|
|
26
|
+
resolvePushedBy,
|
|
27
|
+
} from "../schema-sources.js"
|
|
28
|
+
import { confirm, logSkippedConfirm } from "../ui/confirm.js"
|
|
29
|
+
import { info, plain } from "../ui/messages.js"
|
|
30
|
+
import { withSpinner } from "../ui/progress.js"
|
|
31
|
+
import { isInteractive } from "../ui/interactive.js"
|
|
15
32
|
|
|
16
33
|
const DEV_JWT_SECRET = "super-secret-jwt-token-with-at-least-32-characters-long"
|
|
17
34
|
|
|
@@ -23,202 +40,158 @@ export function registerPush(program: Command): void {
|
|
|
23
40
|
)
|
|
24
41
|
.option("--yes", "Skip confirmation prompts for destructive changes")
|
|
25
42
|
.option("--connection <url>", "Database connection URL (overrides config)")
|
|
26
|
-
.
|
|
43
|
+
.option("--env <name>", "Target environment when linked")
|
|
44
|
+
.option("--direct", "Use local engine subprocess (skip control plane)")
|
|
45
|
+
.option("--local", "Alias for --direct")
|
|
46
|
+
.action(async (opts: {
|
|
47
|
+
yes?: boolean
|
|
48
|
+
connection?: string
|
|
49
|
+
env?: string
|
|
50
|
+
direct?: boolean
|
|
51
|
+
local?: boolean
|
|
52
|
+
}) => {
|
|
27
53
|
const cwd = process.cwd()
|
|
28
|
-
|
|
29
|
-
if (isCloudLinked(cwd)) {
|
|
30
|
-
if (opts.connection) {
|
|
31
|
-
console.error("--connection is not allowed when linked to a cloud project (credentials stay server-side).")
|
|
32
|
-
process.exit(1)
|
|
33
|
-
}
|
|
34
|
-
await pushSchemaToLinkedProject(cwd, { force: opts.yes ?? true })
|
|
35
|
-
return
|
|
36
|
-
}
|
|
37
|
-
|
|
38
54
|
const config = loadConfig(cwd)
|
|
39
|
-
|
|
40
|
-
// Docker provider: the compose Postgres isn't published to the host, so
|
|
41
|
-
// apply the schema through the in-compose schema-engine (unless the user
|
|
42
|
-
// gave an explicit --connection to a reachable database).
|
|
43
|
-
if (!opts.connection && resolveRuntimeProvider(config) === "docker") {
|
|
44
|
-
const { pushSchemaDocker } = await import("../dev-compose.js")
|
|
45
|
-
await pushSchemaDocker(cwd, config)
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const connection = opts.connection ?? connectionString(config)
|
|
50
|
-
|
|
51
|
-
await ensureEngine()
|
|
52
|
-
|
|
53
|
-
console.log("Loading schema...")
|
|
55
|
+
const pgSchema = schemaPgSchema(cwd)
|
|
54
56
|
const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd)
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
ast,
|
|
59
|
-
database_url: connection,
|
|
60
|
-
schema: "public",
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
const ops = diff.operations ?? []
|
|
64
|
-
printDiffWarnings(diff)
|
|
65
|
-
|
|
66
|
-
if (ops.length === 0) {
|
|
67
|
-
console.log(
|
|
68
|
-
"Schema matches the database (no DDL). Syncing Studio metadata...",
|
|
69
|
-
)
|
|
70
|
-
} else {
|
|
71
|
-
printDiff(ops)
|
|
72
|
-
|
|
73
|
-
const risky = ops.filter(
|
|
74
|
-
(o) => o.risk === "cautious" || o.risk === "destructive" || o.risk === "warn" || o.risk === "danger",
|
|
75
|
-
)
|
|
76
|
-
if (risky.length > 0 && !opts.yes) {
|
|
77
|
-
const confirmed = await confirm(
|
|
78
|
-
`\n${risky.length} risky operation(s) above (type changes or data loss). Proceed? [y/N] `,
|
|
79
|
-
)
|
|
80
|
-
if (!confirmed) {
|
|
81
|
-
console.log("Aborted.")
|
|
82
|
-
return
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
console.log(ops.length > 0 ? "\nApplying migration..." : "\nSyncing with engine...")
|
|
88
|
-
const pushResult = await engineRequest<{
|
|
89
|
-
message?: string
|
|
90
|
-
status?: string
|
|
91
|
-
admin_refreshed?: boolean
|
|
92
|
-
}>("/push", {
|
|
93
|
-
ast,
|
|
94
|
-
database_url: connection,
|
|
95
|
-
schema: "public",
|
|
96
|
-
force: true,
|
|
97
|
-
})
|
|
98
|
-
if (pushResult.status === "up_to_date") {
|
|
99
|
-
console.log(
|
|
100
|
-
pushResult.admin_refreshed
|
|
101
|
-
? "Database schema unchanged — Studio metadata synced."
|
|
102
|
-
: "Schema is up to date.",
|
|
103
|
-
)
|
|
104
|
-
} else {
|
|
105
|
-
console.log(pushResult.message ?? "Migration applied.")
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
await writeLocalAdminConfig(ast, config)
|
|
58
|
+
const linked = loadProjectLink(cwd)
|
|
59
|
+
const useDirect = opts.direct || opts.local || Boolean(opts.connection)
|
|
109
60
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
61
|
+
if (linked && !useDirect && !opts.connection) {
|
|
62
|
+
const target = resolveTarget(cwd, { env: opts.env })
|
|
63
|
+
await pushViaTarget(cwd, config, target, ast, pgSchema, opts.yes ?? false)
|
|
64
|
+
return
|
|
114
65
|
}
|
|
115
66
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
? signJwt({ role: "service_role", iss: "supatype", iat: Math.floor(Date.now() / 1000) }, DEV_JWT_SECRET)
|
|
122
|
-
: undefined)
|
|
123
|
-
|
|
124
|
-
if (baseUrl && serviceRoleKey) {
|
|
125
|
-
const parsedAst = await engineRequest<{
|
|
126
|
-
storageBuckets?: Array<{
|
|
127
|
-
id: string
|
|
128
|
-
public: boolean
|
|
129
|
-
accessMode?: "public" | "private" | "custom"
|
|
130
|
-
allowedMimeTypes?: string[]
|
|
131
|
-
fileSizeLimit?: number
|
|
132
|
-
s3BucketPolicy?: string
|
|
133
|
-
}>
|
|
134
|
-
}>("/parse", { ast })
|
|
135
|
-
const buckets = (parsedAst.storageBuckets ?? []).map((b) => ({
|
|
136
|
-
id: b.id,
|
|
137
|
-
public: b.public,
|
|
138
|
-
...(b.accessMode !== undefined && { access_mode: b.accessMode }),
|
|
139
|
-
...(b.allowedMimeTypes != null && { allowed_mime_types: b.allowedMimeTypes }),
|
|
140
|
-
...(b.fileSizeLimit != null && { file_size_limit: b.fileSizeLimit }),
|
|
141
|
-
...(b.s3BucketPolicy != null &&
|
|
142
|
-
b.s3BucketPolicy !== "" && { s3_bucket_policy: b.s3BucketPolicy }),
|
|
143
|
-
}))
|
|
144
|
-
if (buckets.length > 0) {
|
|
145
|
-
console.log("Provisioning storage buckets...")
|
|
146
|
-
await provisionBuckets(`${baseUrl}/storage/v1`, serviceRoleKey, buckets)
|
|
67
|
+
if (!opts.connection && !useDirect && resolveRuntimeProvider(config) === "docker") {
|
|
68
|
+
const localTarget = resolveTarget(cwd, { env: opts.env })
|
|
69
|
+
if (localTarget.mode === "local" && localTarget.token) {
|
|
70
|
+
await pushViaTarget(cwd, config, localTarget, ast, pgSchema, opts.yes ?? false)
|
|
71
|
+
return
|
|
147
72
|
}
|
|
73
|
+
const { pushSchemaDocker } = await import("../dev-compose.js")
|
|
74
|
+
await withSpinner("Applying schema via Docker Compose", () => pushSchemaDocker(cwd, config))
|
|
75
|
+
return
|
|
148
76
|
}
|
|
149
77
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const genResult = await engineRequest<{ code?: string; message?: string }>("/generate", genBody)
|
|
157
|
-
console.log(genResult.message ?? "Types generated.")
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const studioBase = baseUrl?.replace(/\/$/, "") ?? ""
|
|
161
|
-
if (studioBase) {
|
|
162
|
-
console.log(`\nStudio: ${studioBase}/studio/ — sign in with the admin user you created.`)
|
|
163
|
-
} else {
|
|
164
|
-
console.log("\nDone.")
|
|
165
|
-
}
|
|
78
|
+
const target = resolveTarget(cwd, {
|
|
79
|
+
env: opts.env,
|
|
80
|
+
direct: true,
|
|
81
|
+
connection: opts.connection,
|
|
82
|
+
})
|
|
83
|
+
await pushViaTarget(cwd, config, target, ast, pgSchema, opts.yes ?? false)
|
|
166
84
|
})
|
|
167
85
|
}
|
|
168
86
|
|
|
169
|
-
function
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
87
|
+
async function pushViaTarget(
|
|
88
|
+
cwd: string,
|
|
89
|
+
config: SupatypeProjectConfig,
|
|
90
|
+
target: DeployTarget,
|
|
91
|
+
ast: unknown,
|
|
92
|
+
pgSchema: string,
|
|
93
|
+
skipConfirm: boolean,
|
|
94
|
+
): Promise<void> {
|
|
95
|
+
const diff = await withSpinner("Diffing against database", () =>
|
|
96
|
+
targetSchemaDiff(target, ast, { schema: pgSchema }),
|
|
97
|
+
)
|
|
98
|
+
const ops = diff.operations ?? []
|
|
99
|
+
printDiffWarnings(diff)
|
|
100
|
+
|
|
101
|
+
if (ops.length === 0) {
|
|
102
|
+
info("Schema matches the database (no DDL). Syncing Studio metadata...")
|
|
103
|
+
} else {
|
|
104
|
+
printDiffOperations({ operations: ops })
|
|
105
|
+
const risky = ops.filter(
|
|
106
|
+
(o) => o.risk === "cautious" || o.risk === "destructive" || o.risk === "warn" || o.risk === "danger",
|
|
107
|
+
)
|
|
108
|
+
if (risky.length > 0 && !skipConfirm) {
|
|
109
|
+
if (!isInteractive()) {
|
|
110
|
+
logSkippedConfirm(`${risky.length} risky operation(s) require confirmation`)
|
|
111
|
+
plain("Aborted.")
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
const confirmed = await confirm(
|
|
115
|
+
`${risky.length} risky operation(s) above. Proceed?`,
|
|
116
|
+
{ default: false },
|
|
117
|
+
)
|
|
118
|
+
if (!confirmed) {
|
|
119
|
+
plain("Aborted.")
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
}
|
|
183
123
|
}
|
|
184
|
-
}
|
|
185
124
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
125
|
+
const pushResult = await withSpinner(
|
|
126
|
+
ops.length > 0 ? "Applying migration" : "Syncing with engine",
|
|
127
|
+
() =>
|
|
128
|
+
targetSchemaPush(target, ast, {
|
|
129
|
+
force: true,
|
|
130
|
+
schema: pgSchema,
|
|
131
|
+
schemaSources: buildSchemaSourcesPayload(cwd, resolvePushedBy()),
|
|
132
|
+
}),
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
if ((pushResult as { status?: string }).status === "up_to_date") {
|
|
136
|
+
info("Schema is up to date.")
|
|
137
|
+
} else {
|
|
138
|
+
info((pushResult as { message?: string }).message ?? "Migration applied.")
|
|
139
|
+
const migrationName = (pushResult as { name?: string }).name
|
|
140
|
+
const schemaSources = buildSchemaSourcesPayload(cwd, resolvePushedBy())
|
|
141
|
+
if (migrationName && schemaSources) {
|
|
142
|
+
cacheSchemaSourcesLocally(cwd, migrationName, schemaSources.gz)
|
|
143
|
+
}
|
|
189
144
|
}
|
|
190
145
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
146
|
+
if (target.mode === "direct" || target.mode === "local") {
|
|
147
|
+
await writeLocalAdminConfig(ast, config)
|
|
148
|
+
if (ops.length > 0 && target.databaseUrl) {
|
|
149
|
+
await promptFirstAdminUser(target.databaseUrl)
|
|
150
|
+
}
|
|
151
|
+
await generateTypesLocal(ast, config)
|
|
152
|
+
await provisionLocalStorage(ast, config)
|
|
153
|
+
} else {
|
|
154
|
+
info(`Pushed to ${target.mode} (${target.environment}).`)
|
|
198
155
|
}
|
|
199
|
-
|
|
200
|
-
|
|
156
|
+
|
|
157
|
+
const baseUrl = (serverBaseUrl(config) ?? "").replace(/\/$/, "")
|
|
158
|
+
if (baseUrl) {
|
|
159
|
+
plain(`\nStudio: ${baseUrl}/studio/`)
|
|
201
160
|
}
|
|
161
|
+
}
|
|
202
162
|
|
|
203
|
-
|
|
204
|
-
|
|
163
|
+
async function generateTypesLocal(ast: unknown, config: SupatypeProjectConfig): Promise<void> {
|
|
164
|
+
if (!config.output?.types && !config.output?.client) return
|
|
165
|
+
await withSpinner("Generating types", async () => {
|
|
166
|
+
await ensureEngine()
|
|
167
|
+
const genBody: Record<string, unknown> = { ast, lang: "typescript" }
|
|
168
|
+
if (config.output?.types) genBody["types_path"] = config.output.types
|
|
169
|
+
if (config.output?.client) genBody["client_path"] = config.output.client
|
|
170
|
+
const genResult = await engineRequest<{ message?: string }>("/generate", genBody)
|
|
171
|
+
return genResult.message ?? "Types generated."
|
|
172
|
+
}).then((msg) => info(msg))
|
|
205
173
|
}
|
|
206
174
|
|
|
207
|
-
async function
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
175
|
+
async function provisionLocalStorage(ast: unknown, config: SupatypeProjectConfig): Promise<void> {
|
|
176
|
+
const baseUrl = serverBaseUrl(config)
|
|
177
|
+
const serviceRoleKey =
|
|
178
|
+
process.env["SUPATYPE_SERVICE_ROLE_KEY"] ??
|
|
179
|
+
process.env["SERVICE_ROLE_KEY"] ??
|
|
180
|
+
(config.server.mode === "dev"
|
|
181
|
+
? signJwt({ role: "service_role", iss: "supatype", iat: Math.floor(Date.now() / 1000) }, DEV_JWT_SECRET)
|
|
182
|
+
: undefined)
|
|
183
|
+
if (!baseUrl || !serviceRoleKey) return
|
|
184
|
+
await ensureEngine()
|
|
185
|
+
const parsedAst = await engineRequest<Pick<ExtractedSchemaAstV2, "storageBuckets">>("/parse", { ast })
|
|
186
|
+
await provisionBucketsFromAst(parsedAst, `${baseUrl}/storage/v1`, serviceRoleKey)
|
|
215
187
|
}
|
|
216
188
|
|
|
217
|
-
/** Write `.supatype/admin-config.json` for local Studio (same layout as `supatype dev`). */
|
|
218
189
|
async function writeLocalAdminConfig(ast: unknown, config: SupatypeProjectConfig): Promise<void> {
|
|
219
190
|
const cwd = process.cwd()
|
|
220
191
|
const dir = join(cwd, ".supatype")
|
|
221
192
|
mkdirSync(dir, { recursive: true })
|
|
193
|
+
await ensureEngine()
|
|
222
194
|
const admin = withAdminRoles(await engineRequest<unknown>("/admin", { ast }), config)
|
|
195
|
+
restoreSystemRelationTargets(admin, ast)
|
|
223
196
|
writeFileSync(join(dir, "admin-config.json"), `${JSON.stringify(admin, null, 2)}\n`)
|
|
224
197
|
}
|
package/src/commands/seed.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { isLinkedToCloudProject } from "../binary-cache.js"
|
|
|
5
5
|
import { loadConfig } from "../config.js"
|
|
6
6
|
import { projectRootFromConfig } from "../project-config.js"
|
|
7
7
|
import { runTsFile } from "../tsx-runner.js"
|
|
8
|
+
import { error, info } from "../ui/messages.js"
|
|
8
9
|
|
|
9
10
|
const SEED_EXT = /\.(ts|mts|tsx)$/
|
|
10
11
|
|
|
@@ -31,8 +32,8 @@ export function registerSeed(program: Command): void {
|
|
|
31
32
|
const cwd = process.cwd()
|
|
32
33
|
const config = loadConfig(cwd)
|
|
33
34
|
if (isLinkedToCloudProject(cwd, config) && !opts.force) {
|
|
34
|
-
|
|
35
|
-
"
|
|
35
|
+
error(
|
|
36
|
+
"This project is linked to Supatype Cloud. Refusing to run seeds locally.\n" +
|
|
36
37
|
" Pass --force only if you intend to target this linked project (advanced).",
|
|
37
38
|
)
|
|
38
39
|
process.exit(1)
|
|
@@ -53,12 +54,12 @@ export function registerSeed(program: Command): void {
|
|
|
53
54
|
|
|
54
55
|
const missing = paths.filter((p) => !existsSync(p))
|
|
55
56
|
if (missing.length > 0) {
|
|
56
|
-
|
|
57
|
+
error(`Seed file(s) not found:\n ${missing.join("\n ")}`)
|
|
57
58
|
process.exit(1)
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
for (const seedFile of paths) {
|
|
61
|
-
|
|
62
|
+
info(`Running ${seedFile}...`)
|
|
62
63
|
const result = runTsFile(seedFile, { cwd, stdio: "inherit" })
|
|
63
64
|
if (result.exitCode !== 0) {
|
|
64
65
|
process.exit(result.exitCode)
|