@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/dev.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
|
|
|
16
16
|
import { homedir } from "node:os"
|
|
17
17
|
import { isAbsolute, join, relative, resolve } from "node:path"
|
|
18
18
|
import { loadConfig } from "../config.js"
|
|
19
|
+
import type { ExtractedSchemaAstV2 } from "../schema-ast-v2.js"
|
|
19
20
|
import {
|
|
20
21
|
functionsPathCandidatesFromProject,
|
|
21
22
|
resolveRuntimeProvider,
|
|
@@ -36,7 +37,12 @@ import { ensureBinary } from "../ensure-binary.js"
|
|
|
36
37
|
import { startProxyDevApp } from "../app/proxy-dev-app.js"
|
|
37
38
|
import { ProcessManager } from "../process-manager.js"
|
|
38
39
|
import { startStudioViteDevServer } from "../studio-dev-server.js"
|
|
40
|
+
import { restoreSystemRelationTargets } from "../restore-system-relation-targets.js"
|
|
39
41
|
import { localStorageEnv } from "../local-storage.js"
|
|
42
|
+
import { beginDevSession, endDevSession, resolveDevUiMode, startDevSession } from "../dev-session.js"
|
|
43
|
+
import { probeDockerDaemon, reportDockerUnavailable } from "../docker-runtime.js"
|
|
44
|
+
import { fatalError } from "../ui/fatal.js"
|
|
45
|
+
import { registerDevShutdown } from "../dev-shutdown.js"
|
|
40
46
|
import {
|
|
41
47
|
initdb,
|
|
42
48
|
start as pgStart,
|
|
@@ -63,17 +69,71 @@ function gotrueSMTPFromEmailConfig(email: SupatypeProjectConfig["email"] | undef
|
|
|
63
69
|
return out
|
|
64
70
|
}
|
|
65
71
|
|
|
72
|
+
const NATIVE_PG_PORT = 5432
|
|
73
|
+
|
|
74
|
+
function portCheckCommand(port: number): string {
|
|
75
|
+
return process.platform === "win32"
|
|
76
|
+
? `netstat -ano | findstr :${port}`
|
|
77
|
+
: `lsof -i :${port}`
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function assertNativeDevPortsFree(serverPort: number, postgrestPort: number): Promise<void> {
|
|
81
|
+
const brand = { intro: "Local development" }
|
|
82
|
+
if (await isPortInUse(NATIVE_PG_PORT)) {
|
|
83
|
+
fatalError(
|
|
84
|
+
`Port ${NATIVE_PG_PORT} is already in use.`,
|
|
85
|
+
["Another Postgres instance may be running.", `Check: ${portCheckCommand(NATIVE_PG_PORT)}`],
|
|
86
|
+
{ brand },
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
if (await isPortInUse(serverPort)) {
|
|
90
|
+
fatalError(
|
|
91
|
+
`Port ${serverPort} is already in use.`,
|
|
92
|
+
["Another supatype-server may be running.", `Check: ${portCheckCommand(serverPort)}`],
|
|
93
|
+
{ brand },
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
if (await isPortInUse(postgrestPort)) {
|
|
97
|
+
fatalError(
|
|
98
|
+
`Port ${postgrestPort} is already in use.`,
|
|
99
|
+
["Another service may be running.", `Check: ${portCheckCommand(postgrestPort)}`],
|
|
100
|
+
{ brand },
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
66
105
|
export function registerDev(program: Command): void {
|
|
67
106
|
program
|
|
68
107
|
.command("dev")
|
|
69
108
|
.description("Start local Postgres, apply schema, and run supatype-server")
|
|
70
109
|
.option("--no-watch", "Start services but do not watch for schema changes")
|
|
110
|
+
.option("--stream", "Print interleaved logs instead of the interactive TUI")
|
|
71
111
|
.option("--port <port>", "Port for supatype-server (overrides config)", String)
|
|
72
|
-
.action(async (opts: { watch: boolean; port?: string }) => {
|
|
112
|
+
.action(async (opts: { watch: boolean; stream?: boolean; port?: string }) => {
|
|
73
113
|
const cwd = process.cwd()
|
|
74
114
|
|
|
75
|
-
// ── 1. Load project config
|
|
115
|
+
// ── 1. Load project config (before TUI — fatal errors must hit real stderr) ──
|
|
76
116
|
const config = loadConfig(cwd)
|
|
117
|
+
const provider = resolveRuntimeProvider(config)
|
|
118
|
+
|
|
119
|
+
if (provider === "docker") {
|
|
120
|
+
const probe = probeDockerDaemon()
|
|
121
|
+
if (!probe.ok) {
|
|
122
|
+
reportDockerUnavailable(probe, { brand: { intro: "Local development" } })
|
|
123
|
+
process.exit(1)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const projectName = config.project.name
|
|
128
|
+
const serverPort = opts.port ?? String(config.server.port ?? 54321)
|
|
129
|
+
const postgrestPort = String(config.server.postgrestPort ?? 3001)
|
|
130
|
+
|
|
131
|
+
if (provider !== "docker") {
|
|
132
|
+
await assertNativeDevPortsFree(Number(serverPort), Number(postgrestPort))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
beginDevSession(resolveDevUiMode(opts.stream === true))
|
|
136
|
+
startDevSession()
|
|
77
137
|
if (hasMeaningfulOverrides(config)) {
|
|
78
138
|
console.warn("[supatype] Local binary overrides active:")
|
|
79
139
|
for (const line of describeActiveOverrides(config)) {
|
|
@@ -81,10 +141,6 @@ export function registerDev(program: Command): void {
|
|
|
81
141
|
}
|
|
82
142
|
console.warn("")
|
|
83
143
|
}
|
|
84
|
-
const projectName = config.project.name
|
|
85
|
-
const serverPort = opts.port ?? String(config.server.port ?? 54321)
|
|
86
|
-
const postgrestPort = String(config.server.postgrestPort ?? 3001)
|
|
87
|
-
const provider = resolveRuntimeProvider(config)
|
|
88
144
|
|
|
89
145
|
if (provider === "docker") {
|
|
90
146
|
const { runDevCompose } = await import("../dev-compose.js")
|
|
@@ -109,33 +165,10 @@ export function registerDev(program: Command): void {
|
|
|
109
165
|
mkdirSync(d, { recursive: true })
|
|
110
166
|
}
|
|
111
167
|
|
|
112
|
-
// ── 4. Port collision check ───────────────────────────────────────────
|
|
113
|
-
const pgPort = 5432
|
|
114
|
-
if (await isPortInUse(pgPort)) {
|
|
115
|
-
console.error(
|
|
116
|
-
`[supatype] Port ${pgPort} is already in use. Another Postgres instance may be running.\n` +
|
|
117
|
-
` Check: lsof -i :${pgPort}`,
|
|
118
|
-
)
|
|
119
|
-
process.exit(1)
|
|
120
|
-
}
|
|
121
|
-
if (await isPortInUse(Number(serverPort))) {
|
|
122
|
-
console.error(
|
|
123
|
-
`[supatype] Port ${serverPort} is already in use. Another supatype-server may be running.\n` +
|
|
124
|
-
` Check: lsof -i :${serverPort}`,
|
|
125
|
-
)
|
|
126
|
-
process.exit(1)
|
|
127
|
-
}
|
|
128
|
-
if (await isPortInUse(Number(postgrestPort))) {
|
|
129
|
-
console.error(
|
|
130
|
-
`[supatype] Port ${postgrestPort} is already in use. Another service may be running.\n` +
|
|
131
|
-
` Check: lsof -i :${postgrestPort}`,
|
|
132
|
-
)
|
|
133
|
-
process.exit(1)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
168
|
// ── 5–7. Start Postgres ───────────────────────────────────────────────
|
|
137
169
|
let dbURL: string
|
|
138
170
|
let stopPostgres: () => void | Promise<void>
|
|
171
|
+
const pgPort = NATIVE_PG_PORT
|
|
139
172
|
const pgPassword = "postgres"
|
|
140
173
|
// pgBinDir is set on the native path and used to add DLL search path for
|
|
141
174
|
// PostgREST on Windows (PostgREST links against libpq + SSL from MinGW).
|
|
@@ -252,7 +285,8 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
|
|
|
252
285
|
console.log(`[supatype] Edge functions enabled (${functionsDir})`)
|
|
253
286
|
try {
|
|
254
287
|
denoBinPath = await ensureBinary("deno", config)
|
|
255
|
-
|
|
288
|
+
const denoVersion = await (await import("../binary-cache.js")).resolveVersionFor("deno", config)
|
|
289
|
+
console.log(`[supatype] Deno runtime: ${denoBinPath} (v${denoVersion})`)
|
|
256
290
|
if (functionRoutes.length > 0) {
|
|
257
291
|
console.log(
|
|
258
292
|
`[supatype] Edge functions router: ${relative(cwd, denoServeScriptAbs) || ".supatype/functions-router.ts"} ` +
|
|
@@ -263,7 +297,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
|
|
|
263
297
|
}
|
|
264
298
|
} catch (err) {
|
|
265
299
|
console.warn(
|
|
266
|
-
`[supatype] ⚠ Found ${functionsDir} but could not provision Deno
|
|
300
|
+
`[supatype] ⚠ Found ${functionsDir} but could not provision Deno — edge functions will not run.\n` +
|
|
267
301
|
` ${(err as Error).message}\n` +
|
|
268
302
|
" (Functions still appear in Studio; invocations need Deno.)",
|
|
269
303
|
)
|
|
@@ -473,8 +507,8 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
|
|
|
473
507
|
|
|
474
508
|
|
|
475
509
|
// ── Shutdown handler ──────────────────────────────────────────────────
|
|
476
|
-
|
|
477
|
-
console.log("
|
|
510
|
+
registerDevShutdown(async () => {
|
|
511
|
+
console.log("[supatype] Shutting down...")
|
|
478
512
|
await Promise.all([
|
|
479
513
|
serverProc.stop(),
|
|
480
514
|
postgrestProc?.stop(),
|
|
@@ -482,10 +516,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
|
|
|
482
516
|
appProc?.stop(),
|
|
483
517
|
])
|
|
484
518
|
await stopPostgres()
|
|
485
|
-
|
|
486
|
-
}
|
|
487
|
-
process.once("SIGINT", cleanup)
|
|
488
|
-
process.once("SIGTERM", cleanup)
|
|
519
|
+
})
|
|
489
520
|
|
|
490
521
|
// ── 10. Schema watch ──────────────────────────────────────────────────
|
|
491
522
|
if (opts.watch) {
|
|
@@ -564,14 +595,27 @@ async function runSchemaPush(
|
|
|
564
595
|
|
|
565
596
|
// Push schema.
|
|
566
597
|
console.log("[supatype] Applying schema...")
|
|
567
|
-
const
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
)
|
|
572
|
-
|
|
598
|
+
const { ensureEngine, engineRequest } = await import("../engine-client.js")
|
|
599
|
+
const { writeSchemaSourcePushArtifacts } = await import("../schema-sources.js")
|
|
600
|
+
await ensureEngine()
|
|
601
|
+
const pgSchema = config?.schema?.pg_schema ?? "public"
|
|
602
|
+
const sources = writeSchemaSourcePushArtifacts(cwd)
|
|
603
|
+
try {
|
|
604
|
+
await engineRequest("/push", {
|
|
605
|
+
ast,
|
|
606
|
+
database_url: dbURL,
|
|
607
|
+
schema: pgSchema,
|
|
608
|
+
force: true,
|
|
609
|
+
...(sources
|
|
610
|
+
? {
|
|
611
|
+
schema_sources_gz_base64: sources.payload.dataBase64,
|
|
612
|
+
schema_sources_manifest: sources.payload.manifest,
|
|
613
|
+
}
|
|
614
|
+
: {}),
|
|
615
|
+
})
|
|
616
|
+
} catch (err) {
|
|
573
617
|
_lastFailedAst = astJson
|
|
574
|
-
throw
|
|
618
|
+
throw err
|
|
575
619
|
}
|
|
576
620
|
_lastPushedAst = astJson
|
|
577
621
|
_lastFailedAst = null
|
|
@@ -623,6 +667,7 @@ async function runSchemaPush(
|
|
|
623
667
|
} catch {
|
|
624
668
|
admin = adminResult.stdout
|
|
625
669
|
}
|
|
670
|
+
restoreSystemRelationTargets(admin, ast)
|
|
626
671
|
const merged = config ? withAdminRoles(admin, config) : admin
|
|
627
672
|
writeFileSync(adminConfigPath, `${JSON.stringify(merged, null, 2)}\n`)
|
|
628
673
|
}
|
|
@@ -631,10 +676,6 @@ async function runSchemaPush(
|
|
|
631
676
|
console.log("[supatype] Schema applied.")
|
|
632
677
|
}
|
|
633
678
|
|
|
634
|
-
// ---------------------------------------------------------------------------
|
|
635
|
-
// Storage bucket provisioning (local dev only)
|
|
636
|
-
// ---------------------------------------------------------------------------
|
|
637
|
-
|
|
638
679
|
function provisionStorageBuckets(
|
|
639
680
|
declared: Array<{
|
|
640
681
|
id: string
|
|
@@ -702,10 +743,9 @@ async function resolvePgBinDir(config: Awaited<ReturnType<typeof loadConfig>>):
|
|
|
702
743
|
}
|
|
703
744
|
|
|
704
745
|
// Locate cached Postgres archive.
|
|
705
|
-
const { cachePath } = await import("../binary-cache.js")
|
|
706
|
-
const version = config.versions.postgres
|
|
707
|
-
const { currentPlatform } = await import("../binary-cache.js")
|
|
746
|
+
const { cachePath, currentPlatform, resolveVersionFor } = await import("../binary-cache.js")
|
|
708
747
|
const platform = currentPlatform()
|
|
748
|
+
const version = await resolveVersionFor("postgres", config)
|
|
709
749
|
|
|
710
750
|
const pgCacheDir = cachePath("postgres", version)
|
|
711
751
|
const extractedDir = join(pgCacheDir, `pg-${version}`)
|
|
@@ -915,9 +955,9 @@ const EXTENSION_FIELDS: Record<string, { ext: string; fallback: AstField }> = {
|
|
|
915
955
|
}
|
|
916
956
|
|
|
917
957
|
function adaptUnsupportedKinds(
|
|
918
|
-
ast:
|
|
958
|
+
ast: ExtractedSchemaAstV2,
|
|
919
959
|
skipKinds: ReadonlySet<string>,
|
|
920
|
-
): { filtered:
|
|
960
|
+
): { filtered: ExtractedSchemaAstV2; adapted: string[] } {
|
|
921
961
|
const adapted: string[] = []
|
|
922
962
|
if (!ast || typeof ast !== "object") return { filtered: ast, adapted }
|
|
923
963
|
const schema = ast as AstSchema
|
|
@@ -937,7 +977,7 @@ function adaptUnsupportedKinds(
|
|
|
937
977
|
return { ...model, fields }
|
|
938
978
|
})
|
|
939
979
|
|
|
940
|
-
return { filtered: { ...schema, models }, adapted }
|
|
980
|
+
return { filtered: { ...schema, models } as ExtractedSchemaAstV2, adapted }
|
|
941
981
|
}
|
|
942
982
|
|
|
943
983
|
// ---------------------------------------------------------------------------
|
package/src/commands/diff.ts
CHANGED
|
@@ -1,63 +1,72 @@
|
|
|
1
1
|
import type { Command } from "commander"
|
|
2
2
|
import { loadConfig, loadSchemaAst } from "../config.js"
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { resolveRuntimeProvider, schemaPathFromProject } from "../project-config.js"
|
|
4
|
+
import { printDiffOperations, printDiffWarnings } from "../diff-output.js"
|
|
5
|
+
import { resolveTarget, targetSchemaDiff, schemaPgSchema } from "../resolve-target.js"
|
|
6
|
+
import { loadProjectLink } from "../link.js"
|
|
7
|
+
import { withSpinner } from "../ui/progress.js"
|
|
6
8
|
|
|
7
9
|
export function registerDiff(program: Command): void {
|
|
8
10
|
program
|
|
9
11
|
.command("diff")
|
|
10
12
|
.description("Show planned schema changes without applying them (dry run)")
|
|
11
13
|
.option("--connection <url>", "Database connection URL (overrides config)")
|
|
12
|
-
.
|
|
14
|
+
.option("--env <name>", "Target environment when linked")
|
|
15
|
+
.option("--direct", "Use local engine subprocess")
|
|
16
|
+
.action(async (opts: { connection?: string; env?: string; direct?: boolean }) => {
|
|
13
17
|
const cwd = process.cwd()
|
|
14
18
|
const config = loadConfig(cwd)
|
|
15
|
-
const
|
|
19
|
+
const pgSchema = schemaPgSchema(cwd)
|
|
16
20
|
|
|
17
|
-
await
|
|
21
|
+
const ast = await withSpinner("Loading schema", async () =>
|
|
22
|
+
loadSchemaAst(schemaPathFromProject(config, cwd), cwd),
|
|
23
|
+
)
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
const
|
|
25
|
+
const linked = loadProjectLink(cwd)
|
|
26
|
+
const useDirect = opts.direct || Boolean(opts.connection)
|
|
21
27
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
printDiffWarnings(diff)
|
|
30
|
-
|
|
31
|
-
if (ops.length === 0) {
|
|
32
|
-
console.log("No changes.")
|
|
28
|
+
if (linked && !useDirect && !opts.connection) {
|
|
29
|
+
const target = resolveTarget(cwd, { env: opts.env })
|
|
30
|
+
const diff = await withSpinner("Computing diff", () =>
|
|
31
|
+
targetSchemaDiff(target, ast, { schema: pgSchema }),
|
|
32
|
+
)
|
|
33
|
+
printDiffWarnings(diff)
|
|
34
|
+
printDiffOperations(diff)
|
|
33
35
|
return
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
38
|
+
if (
|
|
39
|
+
!opts.connection &&
|
|
40
|
+
!useDirect &&
|
|
41
|
+
resolveRuntimeProvider(config) === "docker"
|
|
42
|
+
) {
|
|
43
|
+
const localTarget = resolveTarget(cwd, { env: opts.env })
|
|
44
|
+
if (localTarget.mode === "local" && localTarget.token) {
|
|
45
|
+
const diff = await withSpinner("Computing diff", () =>
|
|
46
|
+
targetSchemaDiff(localTarget, ast, { schema: pgSchema }),
|
|
47
|
+
)
|
|
48
|
+
printDiffWarnings(diff)
|
|
49
|
+
printDiffOperations(diff)
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
const { diffSchemaDocker } = await import("../dev-compose.js")
|
|
53
|
+
const diff = await withSpinner("Computing diff via Docker Compose", () =>
|
|
54
|
+
diffSchemaDocker(cwd, config),
|
|
55
|
+
)
|
|
56
|
+
printDiffWarnings(diff)
|
|
57
|
+
printDiffOperations(diff)
|
|
58
|
+
return
|
|
55
59
|
}
|
|
56
60
|
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
const target = resolveTarget(cwd, {
|
|
62
|
+
env: opts.env,
|
|
63
|
+
direct: true,
|
|
64
|
+
connection: opts.connection,
|
|
65
|
+
})
|
|
66
|
+
const diff = await withSpinner("Computing diff", () =>
|
|
67
|
+
targetSchemaDiff(target, ast, { schema: pgSchema }),
|
|
68
|
+
)
|
|
69
|
+
printDiffWarnings(diff)
|
|
70
|
+
printDiffOperations(diff)
|
|
62
71
|
})
|
|
63
72
|
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Command } from "commander"
|
|
2
|
+
import { loadConfig, loadSchemaAst } from "../config.js"
|
|
3
|
+
import { info, plain } from "../ui/messages.js"
|
|
4
|
+
import { schemaPathFromProject } from "../project-config.js"
|
|
5
|
+
import { resolveTarget, targetSchemaDoctor, schemaPgSchema } from "../resolve-target.js"
|
|
6
|
+
import { loadProjectLink } from "../link.js"
|
|
7
|
+
import { resolveHostEngineDatabaseUrl } from "../dev-compose.js"
|
|
8
|
+
|
|
9
|
+
interface DoctorItem {
|
|
10
|
+
kind: string
|
|
11
|
+
table: string
|
|
12
|
+
name: string
|
|
13
|
+
fields: string[]
|
|
14
|
+
message: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface DoctorReport {
|
|
18
|
+
missing: DoctorItem[]
|
|
19
|
+
staleManaged: DoctorItem[]
|
|
20
|
+
unmanagedDrift: DoctorItem[]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function printSection(title: string, items: DoctorItem[]): void {
|
|
24
|
+
if (items.length === 0) return
|
|
25
|
+
plain(`\n${title} (${items.length}):\n`)
|
|
26
|
+
for (const item of items) {
|
|
27
|
+
const fields = item.fields.length > 0 ? ` (${item.fields.join(", ")})` : ""
|
|
28
|
+
plain(` • ${item.table}.${item.name}${fields}`)
|
|
29
|
+
plain(` ${item.message}`)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function registerDoctor(program: Command): void {
|
|
34
|
+
program
|
|
35
|
+
.command("doctor")
|
|
36
|
+
.description("Report schema drift between schema/index.ts and the live database")
|
|
37
|
+
.option("--connection <url>", "Database connection URL (overrides config)")
|
|
38
|
+
.option("--env <name>", "Target environment when linked")
|
|
39
|
+
.option("--strict", "Exit non-zero when missing or stale managed drift exists")
|
|
40
|
+
.option("--no-cache", "Force full database introspection")
|
|
41
|
+
.option("--direct", "Use local engine subprocess")
|
|
42
|
+
.action(async (opts: {
|
|
43
|
+
connection?: string
|
|
44
|
+
env?: string
|
|
45
|
+
strict?: boolean
|
|
46
|
+
noCache?: boolean
|
|
47
|
+
direct?: boolean
|
|
48
|
+
}) => {
|
|
49
|
+
const cwd = process.cwd()
|
|
50
|
+
const config = loadConfig(cwd)
|
|
51
|
+
const pgSchema = schemaPgSchema(cwd)
|
|
52
|
+
|
|
53
|
+
info("Loading schema...")
|
|
54
|
+
const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd)
|
|
55
|
+
|
|
56
|
+
let report: DoctorReport
|
|
57
|
+
|
|
58
|
+
const linked = loadProjectLink(cwd)
|
|
59
|
+
if (linked && !opts.direct && !opts.connection) {
|
|
60
|
+
const target = resolveTarget(cwd, { env: opts.env })
|
|
61
|
+
report = (await targetSchemaDoctor(target, ast, {
|
|
62
|
+
noCache: opts.noCache,
|
|
63
|
+
schema: pgSchema,
|
|
64
|
+
})) as DoctorReport
|
|
65
|
+
} else if (!opts.direct && !opts.connection) {
|
|
66
|
+
const connection = await resolveHostEngineDatabaseUrl(cwd, config, opts.connection)
|
|
67
|
+
const target = resolveTarget(cwd, { direct: true, connection })
|
|
68
|
+
report = (await targetSchemaDoctor(target, ast, {
|
|
69
|
+
noCache: opts.noCache,
|
|
70
|
+
schema: pgSchema,
|
|
71
|
+
})) as DoctorReport
|
|
72
|
+
void connection
|
|
73
|
+
} else {
|
|
74
|
+
const target = resolveTarget(cwd, {
|
|
75
|
+
env: opts.env,
|
|
76
|
+
direct: true,
|
|
77
|
+
connection: opts.connection,
|
|
78
|
+
})
|
|
79
|
+
report = (await targetSchemaDoctor(target, ast, {
|
|
80
|
+
noCache: opts.noCache,
|
|
81
|
+
schema: pgSchema,
|
|
82
|
+
})) as DoctorReport
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
printSection("Missing (in AST, not in DB)", report.missing ?? [])
|
|
86
|
+
printSection("Stale managed (stamped, not in AST)", report.staleManaged ?? [])
|
|
87
|
+
printSection("Unmanaged drift (manual decision)", report.unmanagedDrift ?? [])
|
|
88
|
+
|
|
89
|
+
const missing = report.missing?.length ?? 0
|
|
90
|
+
const stale = report.staleManaged?.length ?? 0
|
|
91
|
+
const unmanaged = report.unmanagedDrift?.length ?? 0
|
|
92
|
+
|
|
93
|
+
if (missing + stale + unmanaged === 0) {
|
|
94
|
+
info("No drift detected.")
|
|
95
|
+
} else {
|
|
96
|
+
plain(`\nSummary: ${missing} missing, ${stale} stale managed, ${unmanaged} unmanaged`)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (opts.strict && (missing > 0 || stale > 0)) {
|
|
100
|
+
process.exit(1)
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
}
|
package/src/commands/engine.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import type { Command } from "commander"
|
|
7
7
|
import { engineHealth } from "../engine-client.js"
|
|
8
|
+
import { error, info } from "../ui/messages.js"
|
|
8
9
|
|
|
9
10
|
export function registerEngine(program: Command): void {
|
|
10
11
|
const engine = program
|
|
@@ -16,14 +17,14 @@ export function registerEngine(program: Command): void {
|
|
|
16
17
|
.description("Check if the schema engine container is reachable")
|
|
17
18
|
.action(async () => {
|
|
18
19
|
const url = process.env["SUPATYPE_ENGINE_URL"] ?? "http://localhost:7500"
|
|
19
|
-
|
|
20
|
+
info(`Checking engine at ${url}...`)
|
|
20
21
|
|
|
21
22
|
const healthy = await engineHealth()
|
|
22
23
|
if (healthy) {
|
|
23
|
-
|
|
24
|
+
info("Engine is reachable and healthy.")
|
|
24
25
|
} else {
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
error("Engine is not reachable.")
|
|
27
|
+
error("Make sure the engine container is running (supatype dev or docker compose up).")
|
|
27
28
|
process.exitCode = 1
|
|
28
29
|
}
|
|
29
30
|
})
|