@supatype/cli 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +128 -128
- package/.turbo/turbo-typecheck.log +1 -1
- package/LICENSE +202 -0
- package/deno.d.ts +1 -1
- package/dist/app/framework.js +1 -1
- package/dist/app/framework.js.map +1 -1
- package/dist/augmentation-generator.d.ts +1 -1
- package/dist/augmentation-generator.js +3 -3
- package/dist/augmentation-generator.js.map +1 -1
- package/dist/binary-cache.d.ts +30 -8
- package/dist/binary-cache.d.ts.map +1 -1
- package/dist/binary-cache.js +47 -35
- package/dist/binary-cache.js.map +1 -1
- package/dist/cache-pins.d.ts +1 -1
- package/dist/cache-pins.js +2 -2
- package/dist/cache-pins.js.map +1 -1
- package/dist/cli-artifacts.d.ts +32 -0
- package/dist/cli-artifacts.d.ts.map +1 -0
- package/dist/cli-artifacts.js +49 -0
- package/dist/cli-artifacts.js.map +1 -0
- package/dist/cli-install-method.d.ts +9 -1
- package/dist/cli-install-method.d.ts.map +1 -1
- package/dist/cli-install-method.js +22 -4
- package/dist/cli-install-method.js.map +1 -1
- package/dist/cli-package-version.d.ts +1 -1
- package/dist/cli-package-version.d.ts.map +1 -1
- package/dist/cli-package-version.js +6 -1
- package/dist/cli-package-version.js.map +1 -1
- package/dist/cli-standalone.d.ts +13 -4
- package/dist/cli-standalone.d.ts.map +1 -1
- package/dist/cli-standalone.js +86 -31
- package/dist/cli-standalone.js.map +1 -1
- package/dist/cli-version-embedded.d.ts +10 -0
- package/dist/cli-version-embedded.d.ts.map +1 -0
- package/dist/cli-version-embedded.js +13 -0
- package/dist/cli-version-embedded.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.js +1 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/admin.js +6 -6
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/adopt.js +1 -1
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/app.js +2 -2
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/cache.d.ts +1 -1
- package/dist/commands/cache.js +3 -3
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/db.d.ts +3 -3
- package/dist/commands/db.js +9 -9
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.d.ts +9 -9
- package/dist/commands/deploy.js +12 -12
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +3 -3
- package/dist/commands/dev.js +17 -17
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/engine.d.ts +1 -1
- package/dist/commands/engine.js +1 -1
- package/dist/commands/functions.js +5 -5
- package/dist/commands/functions.js.map +1 -1
- package/dist/commands/hooks.d.ts +2 -2
- package/dist/commands/hooks.js +4 -4
- package/dist/commands/hooks.js.map +1 -1
- package/dist/commands/init.js +28 -28
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -1
- package/dist/commands/migrate.js +5 -5
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/pg.d.ts +1 -1
- package/dist/commands/pg.js +1 -1
- package/dist/commands/plugins.js +1 -1
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/pull.js +2 -2
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.js +3 -3
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/self-host.d.ts +1 -1
- package/dist/commands/self-host.js +1 -1
- package/dist/commands/self-update.d.ts +2 -8
- package/dist/commands/self-update.d.ts.map +1 -1
- package/dist/commands/self-update.js +20 -12
- package/dist/commands/self-update.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/update.d.ts +1 -1
- package/dist/commands/update.js +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/dist/db-preflight.d.ts +4 -4
- package/dist/db-preflight.js +14 -14
- package/dist/db-preflight.js.map +1 -1
- package/dist/dev-compose.d.ts +3 -3
- package/dist/dev-compose.js +27 -27
- package/dist/dev-compose.js.map +1 -1
- package/dist/dev-log-filter.d.ts +1 -1
- package/dist/dev-log-filter.d.ts.map +1 -1
- package/dist/dev-log-filter.js +1 -1
- package/dist/dev-log-filter.js.map +1 -1
- package/dist/dev-ports.d.ts +2 -2
- package/dist/dev-ports.d.ts.map +1 -1
- package/dist/dev-ports.js +2 -2
- package/dist/dev-ports.js.map +1 -1
- package/dist/dev-session.d.ts +5 -5
- package/dist/dev-session.d.ts.map +1 -1
- package/dist/dev-session.js +6 -6
- package/dist/dev-session.js.map +1 -1
- package/dist/dev-shutdown.d.ts +5 -5
- package/dist/dev-shutdown.d.ts.map +1 -1
- package/dist/dev-shutdown.js +7 -7
- package/dist/dev-shutdown.js.map +1 -1
- package/dist/dev-task-colors.d.ts +1 -1
- package/dist/dev-task-colors.d.ts.map +1 -1
- package/dist/dev-task-colors.js +1 -1
- package/dist/dev-task-colors.js.map +1 -1
- package/dist/docker-postgres.d.ts +5 -5
- package/dist/docker-postgres.d.ts.map +1 -1
- package/dist/docker-postgres.js +5 -5
- package/dist/docker-postgres.js.map +1 -1
- package/dist/docker-runtime.d.ts +2 -2
- package/dist/docker-runtime.d.ts.map +1 -1
- package/dist/docker-runtime.js +5 -5
- package/dist/docker-runtime.js.map +1 -1
- package/dist/engine-client.d.ts +1 -1
- package/dist/engine-client.js +3 -3
- package/dist/engine-client.js.map +1 -1
- package/dist/engine-push-output.js +1 -1
- package/dist/engine-push-output.js.map +1 -1
- package/dist/ensure-binary.d.ts.map +1 -1
- package/dist/ensure-binary.js +17 -0
- package/dist/ensure-binary.js.map +1 -1
- package/dist/ensure-component-binaries.js +1 -1
- package/dist/ensure-component-binaries.js.map +1 -1
- package/dist/env-file.d.ts +2 -2
- package/dist/env-file.d.ts.map +1 -1
- package/dist/env-file.js +1 -1
- package/dist/env-file.js.map +1 -1
- package/dist/field-masking-tier.d.ts +5 -5
- package/dist/field-masking-tier.d.ts.map +1 -1
- package/dist/field-masking-tier.js +6 -6
- package/dist/field-masking-tier.js.map +1 -1
- package/dist/functions-deno-types.d.ts +1 -1
- package/dist/functions-deno-types.d.ts.map +1 -1
- package/dist/functions-deno-types.js +3 -3
- package/dist/functions-deno-types.js.map +1 -1
- package/dist/functions-router-gen.js +1 -1
- package/dist/gitignore.d.ts +2 -2
- package/dist/gitignore.d.ts.map +1 -1
- package/dist/gitignore.js +3 -3
- package/dist/gitignore.js.map +1 -1
- package/dist/hook-upload.d.ts +1 -1
- package/dist/hook-upload.js +3 -3
- package/dist/hooks-generator.d.ts +1 -1
- package/dist/hooks-generator.js +9 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/init-project-detect.d.ts +1 -1
- package/dist/init-project-detect.d.ts.map +1 -1
- package/dist/init-project-detect.js +1 -1
- package/dist/init-project-detect.js.map +1 -1
- package/dist/link.d.ts +1 -1
- package/dist/link.d.ts.map +1 -1
- package/dist/local-secrets.d.ts +5 -5
- package/dist/local-secrets.js +5 -5
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +20 -0
- package/dist/main.js.map +1 -0
- package/dist/model-hooks.d.ts +3 -3
- package/dist/model-hooks.js +4 -4
- package/dist/pgbouncer-userlist.d.ts +1 -1
- package/dist/pgbouncer-userlist.d.ts.map +1 -1
- package/dist/pgbouncer-userlist.js +2 -2
- package/dist/pgbouncer-userlist.js.map +1 -1
- package/dist/postgres-ctl.d.ts +1 -1
- package/dist/postgres-ctl.js +4 -4
- package/dist/postgres-ctl.js.map +1 -1
- package/dist/process-manager.d.ts +2 -2
- package/dist/process-manager.d.ts.map +1 -1
- package/dist/process-manager.js +4 -4
- package/dist/process-manager.js.map +1 -1
- package/dist/project-config.d.ts +12 -12
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +9 -9
- package/dist/project-config.js.map +1 -1
- package/dist/pull-utils.d.ts +2 -2
- package/dist/pull-utils.d.ts.map +1 -1
- package/dist/pull-utils.js +4 -4
- package/dist/pull-utils.js.map +1 -1
- package/dist/realtime-launch.js +1 -1
- package/dist/realtime-launch.js.map +1 -1
- package/dist/release-pins.d.ts +1 -1
- package/dist/release-pins.js +2 -2
- package/dist/release-pins.js.map +1 -1
- package/dist/resolve-api-url.js +1 -1
- package/dist/resolve-api-url.js.map +1 -1
- package/dist/resolve-target.d.ts +1 -1
- package/dist/resolve-target.d.ts.map +1 -1
- package/dist/rest-cache-admin.js +2 -2
- package/dist/rest-cache-admin.js.map +1 -1
- package/dist/runtime-routes.d.ts +1 -1
- package/dist/runtime-routes.js +1 -1
- package/dist/schema-ast-v2.d.ts +3 -3
- 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-push-lock.js +3 -3
- package/dist/schema-push-lock.js.map +1 -1
- package/dist/scripts/postinstall.d.ts +1 -1
- package/dist/scripts/postinstall.js +1 -1
- package/dist/self-host-compose.d.ts +5 -5
- package/dist/self-host-compose.d.ts.map +1 -1
- package/dist/self-host-compose.js +24 -24
- package/dist/self-host-compose.js.map +1 -1
- package/dist/service-role-check.js +3 -3
- package/dist/service-role-check.js.map +1 -1
- package/dist/storage-provision.d.ts +1 -1
- package/dist/storage-provision.js +3 -3
- package/dist/storage-provision.js.map +1 -1
- package/dist/studio-dev-server.d.ts +1 -1
- package/dist/studio-dev-server.d.ts.map +1 -1
- package/dist/systemd.d.ts +1 -1
- package/dist/systemd.js +1 -1
- package/dist/target-client.js +1 -1
- package/dist/target-client.js.map +1 -1
- package/dist/tsx-runner.js +1 -1
- package/dist/tsx-runner.js.map +1 -1
- package/dist/type-extractor.js +27 -27
- package/dist/type-extractor.js.map +1 -1
- package/dist/type-resolver.js +1 -1
- package/dist/type-resolver.js.map +1 -1
- package/dist/ui/brand.d.ts +1 -1
- package/dist/ui/brand.js +1 -1
- package/dist/ui/components/LogoWordmark.d.ts +1 -1
- package/dist/ui/components/LogoWordmark.d.ts.map +1 -1
- package/dist/ui/components/LogoWordmark.js +1 -1
- package/dist/ui/components/LogoWordmark.js.map +1 -1
- package/dist/ui/components/SelectField.js +1 -1
- package/dist/ui/components/SelectField.js.map +1 -1
- package/dist/ui/confirm.d.ts +1 -1
- package/dist/ui/confirm.js +1 -1
- package/dist/ui/fatal.d.ts +1 -1
- package/dist/ui/fatal.d.ts.map +1 -1
- package/dist/ui/fatal.js +1 -1
- package/dist/ui/fatal.js.map +1 -1
- package/dist/ui/flows/prompt-fields.js +1 -1
- package/dist/ui/flows/prompt-fields.js.map +1 -1
- package/dist/ui/interactive.d.ts +1 -1
- package/dist/ui/interactive.d.ts.map +1 -1
- package/dist/ui/interactive.js +1 -1
- package/dist/ui/interactive.js.map +1 -1
- package/dist/ui/progress.d.ts +1 -1
- package/dist/ui/progress.js +1 -1
- package/dist/ui/runtime/command-chrome.js +1 -1
- package/dist/ui/runtime/command-chrome.js.map +1 -1
- package/dist/ui/runtime/run-clack-flow.js +1 -1
- package/dist/ui/runtime/run-clack-flow.js.map +1 -1
- package/dist/ui/runtime/stdin-after-ink.js +1 -1
- package/dist/ui/runtime/stdin-after-ink.js.map +1 -1
- package/dist/ui/theme.d.ts +1 -1
- package/dist/ui/theme.js +1 -1
- package/dist/valkey-sidecar.d.ts +1 -1
- package/dist/valkey-sidecar.d.ts.map +1 -1
- package/dist/valkey-sidecar.js +2 -2
- package/dist/valkey-sidecar.js.map +1 -1
- package/package.json +3 -2
- package/scripts/build-release-artifacts.sh +112 -0
- package/scripts/generate-homebrew-formula.mjs +47 -45
- package/scripts/mirror-deno-release.sh +1 -1
- package/src/TYPE-RESOLUTION.md +31 -31
- package/src/app/framework.ts +1 -1
- package/src/augmentation-generator.ts +3 -3
- package/src/binary-cache.ts +51 -36
- package/src/cache-pins.ts +2 -2
- package/src/cli-artifacts.ts +65 -0
- package/src/cli-install-method.ts +24 -4
- package/src/cli-package-version.ts +5 -1
- package/src/cli-standalone.ts +116 -34
- package/src/cli-version-embedded.ts +12 -0
- package/src/cli.ts +1 -1
- package/src/commands/add.ts +1 -1
- package/src/commands/admin.ts +6 -6
- package/src/commands/adopt.ts +1 -1
- package/src/commands/app.ts +2 -2
- package/src/commands/cache.ts +3 -3
- package/src/commands/db.ts +9 -9
- package/src/commands/deploy.ts +12 -12
- package/src/commands/dev.ts +19 -19
- package/src/commands/doctor.ts +3 -3
- package/src/commands/engine.ts +1 -1
- package/src/commands/functions.ts +5 -5
- package/src/commands/hooks.ts +6 -6
- package/src/commands/init.ts +28 -28
- package/src/commands/login.ts +2 -2
- package/src/commands/logs.ts +1 -1
- package/src/commands/migrate.ts +5 -5
- package/src/commands/pg.ts +1 -1
- package/src/commands/plugins.ts +1 -1
- package/src/commands/pull.ts +2 -2
- package/src/commands/push.ts +3 -3
- package/src/commands/self-host.ts +1 -1
- package/src/commands/self-update.ts +23 -73
- package/src/commands/status.ts +1 -1
- package/src/commands/update.ts +1 -1
- package/src/config.ts +3 -3
- package/src/db-preflight.ts +15 -15
- package/src/dev-compose.ts +27 -27
- package/src/dev-log-filter.ts +1 -1
- package/src/dev-ports.ts +3 -3
- package/src/dev-session.ts +6 -6
- package/src/dev-shutdown.ts +8 -8
- package/src/dev-task-colors.ts +1 -1
- package/src/docker-postgres.ts +6 -6
- package/src/docker-runtime.ts +5 -5
- package/src/engine-client.ts +3 -3
- package/src/engine-push-output.ts +1 -1
- package/src/ensure-binary.ts +20 -0
- package/src/ensure-component-binaries.ts +1 -1
- package/src/env-file.ts +2 -2
- package/src/field-masking-tier.ts +6 -6
- package/src/functions-deno-types.ts +3 -3
- package/src/functions-router-gen.ts +1 -1
- package/src/gitignore.ts +3 -3
- package/src/hook-upload.ts +3 -3
- package/src/hooks-generator.ts +9 -9
- package/src/index.ts +1 -1
- package/src/init-project-detect.ts +1 -1
- package/src/link.ts +1 -1
- package/src/local-secrets.ts +5 -5
- package/src/main.ts +20 -0
- package/src/model-hooks.ts +4 -4
- package/src/pgbouncer-userlist.ts +2 -2
- package/src/postgres-ctl.ts +4 -4
- package/src/process-manager.ts +4 -4
- package/src/project-config.ts +16 -16
- package/src/pull-utils.ts +4 -4
- package/src/realtime-launch.ts +1 -1
- package/src/release-pins.ts +2 -2
- package/src/resolve-api-url.ts +1 -1
- package/src/resolve-target.ts +1 -1
- package/src/rest-cache-admin.ts +2 -2
- package/src/runtime-routes.ts +2 -2
- package/src/schema-ast-v2.ts +4 -4
- package/src/schema-push-lock.ts +3 -3
- package/src/scripts/postinstall.ts +1 -1
- package/src/self-host-compose.ts +25 -25
- package/src/service-role-check.ts +3 -3
- package/src/storage-provision.ts +3 -3
- package/src/studio-dev-server.ts +1 -1
- package/src/systemd.ts +1 -1
- package/src/target-client.ts +1 -1
- package/src/tsx-runner.ts +1 -1
- package/src/type-extractor.ts +27 -27
- package/src/type-resolver.ts +1 -1
- package/src/ui/README.md +1 -1
- package/src/ui/brand.ts +1 -1
- package/src/ui/components/LogoWordmark.tsx +1 -1
- package/src/ui/components/SelectField.tsx +1 -1
- package/src/ui/confirm.ts +1 -1
- package/src/ui/fatal.ts +1 -1
- package/src/ui/flows/prompt-fields.tsx +1 -1
- package/src/ui/interactive.ts +1 -1
- package/src/ui/progress.ts +1 -1
- package/src/ui/runtime/command-chrome.ts +1 -1
- package/src/ui/runtime/run-clack-flow.tsx +1 -1
- package/src/ui/runtime/stdin-after-ink.ts +1 -1
- package/src/ui/theme.ts +1 -1
- package/src/valkey-sidecar.ts +2 -2
- package/tests/access-composition.test.ts +6 -6
- package/tests/admin-studio-membership.test.ts +1 -1
- package/tests/api-schemas.test.ts +1 -1
- package/tests/archive-name-alias.test.ts +1 -1
- package/tests/cli-help.test.ts +8 -2
- package/tests/db-preflight.test.ts +1 -1
- package/tests/doctor-render.test.ts +3 -3
- package/tests/doctor-service-role.test.ts +2 -2
- package/tests/engine-push-output.test.ts +1 -1
- package/tests/env-file.test.ts +3 -3
- package/tests/external-database-compose.test.ts +5 -5
- package/tests/external-database-config.test.ts +2 -2
- package/tests/field-masking-tier.test.ts +1 -1
- package/tests/homebrew-formula.test.ts +68 -26
- package/tests/hook-upload.test.ts +1 -1
- package/tests/hooks-generator.test.ts +1 -1
- package/tests/init.test.ts +2 -2
- package/tests/keys.test.ts +8 -2
- package/tests/local-secrets.test.ts +3 -3
- package/tests/model-hooks.test.ts +6 -6
- package/tests/runtime-contract.test.ts +2 -2
- package/tests/service-role-check.test.ts +3 -3
- package/tests/storage-provision.test.ts +1 -1
- package/tests/type-extractor.test.ts +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +7 -1
- package/scripts/build-release-bundle.mjs +0 -27
package/src/pull-utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Utilities for `pull` and `introspect
|
|
2
|
+
* Utilities for `pull` and `introspect`, map engine DatabaseState to Model<> scaffold.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export interface DbColumnState {
|
|
@@ -104,7 +104,7 @@ export function pgTypeToModelField(col: ColumnInfo): string {
|
|
|
104
104
|
const base = name.replace(/_id$/, "")
|
|
105
105
|
const rel = base.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase())
|
|
106
106
|
const relName = rel.charAt(0).toUpperCase() + rel.slice(1)
|
|
107
|
-
return `${name}: UUID\n // TODO: relation
|
|
107
|
+
return `${name}: UUID\n // TODO: relation, RelatedTo<"${relName}">`
|
|
108
108
|
}
|
|
109
109
|
if (name === "created_at" || name === "updated_at") {
|
|
110
110
|
return `${name}: Timestamp`
|
|
@@ -160,7 +160,7 @@ export function databaseStateToSchemaScaffold(state: DatabaseStateJson): string
|
|
|
160
160
|
const skipTables = new Set(["spatial_ref_sys", "schema_migrations"])
|
|
161
161
|
|
|
162
162
|
const lines: string[] = [
|
|
163
|
-
"// DRAFT
|
|
163
|
+
"// DRAFT: generated by `supatype pull`. Review access rules, relations, and indexes before push.",
|
|
164
164
|
'import type { Model, Public, UUID, Timestamp, Optional, Unique, Email, Slug, SupatypeAuthUserId, JSON, Int, BigInt } from "@supatype/types"',
|
|
165
165
|
"",
|
|
166
166
|
]
|
|
@@ -231,7 +231,7 @@ export function printIntrospectSummary(state: DatabaseStateJson): void {
|
|
|
231
231
|
}
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
/** @deprecated Legacy pull helper
|
|
234
|
+
/** @deprecated Legacy pull helper, use {@link pgTypeToModelField}. */
|
|
235
235
|
export function pgTypeToField(col: ColumnInfo): string {
|
|
236
236
|
const opts: Record<string, unknown> = { required: !col.nullable }
|
|
237
237
|
if (col.isPrimary) opts["primaryKey"] = true
|
package/src/realtime-launch.ts
CHANGED
|
@@ -46,7 +46,7 @@ export async function resolveRealtimeLaunch(
|
|
|
46
46
|
return { bin: process.execPath, args: [entry] }
|
|
47
47
|
}
|
|
48
48
|
throw new Error(
|
|
49
|
-
"realtime binary not available
|
|
49
|
+
"realtime binary not available, run `supatype update` or set overrides.realtime in supatype.config.ts",
|
|
50
50
|
)
|
|
51
51
|
}
|
|
52
52
|
}
|
package/src/release-pins.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Release pins read from files under packages/cli/releases/.
|
|
3
|
-
* CI (deno-releases workflow) uses the same paths
|
|
3
|
+
* CI (deno-releases workflow) uses the same paths, bump only releases/deno/VERSION.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { readFileSync } from "node:fs"
|
|
@@ -17,7 +17,7 @@ function readPinFile(...segments: string[]): string {
|
|
|
17
17
|
} catch {
|
|
18
18
|
throw new Error(
|
|
19
19
|
`Missing release pin file: ${path}\n` +
|
|
20
|
-
"Expected packages/cli/releases
|
|
20
|
+
"Expected packages/cli/releases/…: reinstall @supatype/cli or build from the monorepo.",
|
|
21
21
|
)
|
|
22
22
|
}
|
|
23
23
|
const version = raw.trim()
|
package/src/resolve-api-url.ts
CHANGED
|
@@ -35,7 +35,7 @@ export function resolveProjectApiUrl(cwd: string): string {
|
|
|
35
35
|
return fromConfig.replace(/\/+$/, "")
|
|
36
36
|
}
|
|
37
37
|
} catch {
|
|
38
|
-
// No supatype.config
|
|
38
|
+
// No supatype.config: fall through to PORT default.
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const port = readEnvValue(cwd, "PORT", "54321").trim() || "54321"
|
package/src/resolve-target.ts
CHANGED
|
@@ -48,7 +48,7 @@ export interface DeployTarget {
|
|
|
48
48
|
refreshToken?: string | undefined
|
|
49
49
|
orgId?: string | undefined
|
|
50
50
|
link: ProjectLink | null
|
|
51
|
-
/** Project cwd
|
|
51
|
+
/** Project cwd: needed to persist refreshed cloud tokens. */
|
|
52
52
|
cwd?: string
|
|
53
53
|
/** Engine subprocess path when mode is direct or local without control plane. */
|
|
54
54
|
databaseUrl?: string
|
package/src/rest-cache-admin.ts
CHANGED
|
@@ -34,7 +34,7 @@ function serviceRoleKey(cwd: string): string {
|
|
|
34
34
|
readEnvValue(cwd, "SUPATYPE_SERVICE_ROLE_KEY", "").trim() ||
|
|
35
35
|
readEnvValue(cwd, "SERVICE_ROLE_KEY", "").trim()
|
|
36
36
|
if (!key) {
|
|
37
|
-
throw new Error("SERVICE_ROLE_KEY not found in .env
|
|
37
|
+
throw new Error("SERVICE_ROLE_KEY not found in .env, run supatype dev or supatype keys")
|
|
38
38
|
}
|
|
39
39
|
return key.trim()
|
|
40
40
|
}
|
|
@@ -66,7 +66,7 @@ function formatCacheApiError(
|
|
|
66
66
|
return "REST server cache is not available on this plan or deployment."
|
|
67
67
|
}
|
|
68
68
|
if (status === 503 && trimmed.includes("valkey")) {
|
|
69
|
-
return "Valkey is not configured
|
|
69
|
+
return "Valkey is not configured, server-side REST cache requires Valkey (supatype dev with docker)."
|
|
70
70
|
}
|
|
71
71
|
return `${operation} failed (${status}): ${trimmed || "(empty body)"}`
|
|
72
72
|
}
|
package/src/runtime-routes.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface RuntimeRouteOptions {
|
|
|
17
17
|
functionsServiceUrl?: string
|
|
18
18
|
/**
|
|
19
19
|
* Self-host Compose: Kong forwards API traffic to supatype-server (unified gateway),
|
|
20
|
-
* which proxies to internal services
|
|
20
|
+
* which proxies to internal services, same model as `supatype dev`.
|
|
21
21
|
*/
|
|
22
22
|
unifiedGateway?: boolean
|
|
23
23
|
/** Studio UI upstream (default: in-compose `studio:3002`). */
|
|
@@ -161,7 +161,7 @@ function runtimeRouteSpecUnified(opts: RuntimeRouteOptions): RuntimeRoute[] {
|
|
|
161
161
|
|
|
162
162
|
/**
|
|
163
163
|
* Legacy split-stack routes (PostgREST/storage/realtime directly from Kong).
|
|
164
|
-
* Kept for tests or explicit opt-out only
|
|
164
|
+
* Kept for tests or explicit opt-out only, self-host uses unifiedGateway.
|
|
165
165
|
*/
|
|
166
166
|
function runtimeRouteSpecSplit(opts: RuntimeRouteOptions): RuntimeRoute[] {
|
|
167
167
|
const studioUrl = studioServiceUrl(opts)
|
package/src/schema-ast-v2.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AST v2 wire format
|
|
2
|
+
* AST v2 wire format, canonical types and emitters.
|
|
3
3
|
* Parsers build {@link ParsedField}; only `emitField` / `emitModel` / `emitSchema` produce JSON.
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -30,7 +30,7 @@ export interface FieldAnnotations {
|
|
|
30
30
|
platform?: PlatformFieldAnnotations
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
/** Kernel facts only
|
|
33
|
+
/** Kernel facts only: never db/platform keys at this layer. */
|
|
34
34
|
export interface KernelFieldFacts {
|
|
35
35
|
required?: boolean
|
|
36
36
|
primaryKey?: boolean
|
|
@@ -62,7 +62,7 @@ export interface KernelFieldFacts {
|
|
|
62
62
|
index?: boolean
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
/** Internal parse result
|
|
65
|
+
/** Internal parse result: not serialized. */
|
|
66
66
|
export interface ParsedField {
|
|
67
67
|
kind: string
|
|
68
68
|
kernel: KernelFieldFacts
|
|
@@ -302,7 +302,7 @@ export function emitModel(
|
|
|
302
302
|
options,
|
|
303
303
|
annotations: {
|
|
304
304
|
db: { tableName, indexes },
|
|
305
|
-
// Hooks sit in `platform` beside `access`: they are an API-layer concern, not a column one
|
|
305
|
+
// Hooks sit in `platform` beside `access`: they are an API-layer concern, not a column one,
|
|
306
306
|
// supatype-server reads them, Postgres never sees them.
|
|
307
307
|
platform: { access, ...(Object.keys(hooks).length > 0 && { hooks }) },
|
|
308
308
|
},
|
package/src/schema-push-lock.ts
CHANGED
|
@@ -87,7 +87,7 @@ export async function withComposeSchemaPushLock<T>(
|
|
|
87
87
|
//
|
|
88
88
|
// Killing the local `docker` client does not stop the process inside the container: `docker
|
|
89
89
|
// compose exec` does not forward the signal. With a sleeping session that meant every push
|
|
90
|
-
// left a backend holding this advisory lock for 24 hours
|
|
90
|
+
// left a backend holding this advisory lock for 24 hours, so `supatype push` never exited and
|
|
91
91
|
// the next push blocked on it. Observed end-to-end before this change.
|
|
92
92
|
//
|
|
93
93
|
// Closing stdin *does* propagate: psql sees EOF, exits, and the session ends, which is what
|
|
@@ -102,7 +102,7 @@ export async function withComposeSchemaPushLock<T>(
|
|
|
102
102
|
holder.stdin?.write(
|
|
103
103
|
`SELECT pg_advisory_lock(${SCHEMA_PUSH_LOCK_CLASSID}, ${SCHEMA_PUSH_LOCK_OBJID});\n`,
|
|
104
104
|
)
|
|
105
|
-
// Deliberately not ended
|
|
105
|
+
// Deliberately not ended: the open pipe is what keeps the session, and the lock, alive.
|
|
106
106
|
holder.stderr?.on("data", (chunk: Buffer) => {
|
|
107
107
|
stderrBuf += chunk.toString()
|
|
108
108
|
})
|
|
@@ -131,7 +131,7 @@ export async function withComposeSchemaPushLock<T>(
|
|
|
131
131
|
/**
|
|
132
132
|
* End the holder session, then confirm the lock is actually gone.
|
|
133
133
|
*
|
|
134
|
-
* Closing stdin is the mechanism; the check is because a leaked holder is silent and expensive
|
|
134
|
+
* Closing stdin is the mechanism; the check is because a leaked holder is silent and expensive,
|
|
135
135
|
* it blocks every later push. If EOF did not do it, terminate the backend directly.
|
|
136
136
|
*/
|
|
137
137
|
async function releaseHolder(
|
package/src/self-host-compose.ts
CHANGED
|
@@ -130,7 +130,7 @@ export function composePullNeedsIgnoreFailures(
|
|
|
130
130
|
/**
|
|
131
131
|
* Schema-engine image for a one-off `docker compose run` when pushing schema.
|
|
132
132
|
* Uses config pin when set; otherwise CDN engine semver (Docker Hub `:latest` can lag).
|
|
133
|
-
* Does not touch `.env
|
|
133
|
+
* Does not touch `.env`, server/postgres still use compose `:latest` defaults.
|
|
134
134
|
*/
|
|
135
135
|
export async function schemaEngineImageForPush(
|
|
136
136
|
config: SupatypeProjectConfig,
|
|
@@ -174,7 +174,7 @@ export function staticDirForCompose(config: SupatypeProjectConfig): string | und
|
|
|
174
174
|
/**
|
|
175
175
|
* Bind-mount source for `/project` in generated compose files.
|
|
176
176
|
* Paths are resolved from `--project-directory` (always the project root in `runDockerCompose`),
|
|
177
|
-
* not from the compose file directory
|
|
177
|
+
* not from the compose file directory, use `.` not `../..`.
|
|
178
178
|
*/
|
|
179
179
|
function projectMountPath(_cwd: string): string {
|
|
180
180
|
return "."
|
|
@@ -198,13 +198,13 @@ function kongMountPath(_cwd: string): string {
|
|
|
198
198
|
*
|
|
199
199
|
* One expression instead of six identical constructions of `@db:5432`. With an external database it
|
|
200
200
|
* becomes `${DATABASE_URL:?…}`: the URL is the operator's, so there is nothing for the generator to
|
|
201
|
-
* build
|
|
201
|
+
* build: and interpolating the value into the compose file would write a password into a generated
|
|
202
202
|
* file. Compose resolves the variable from `.env` at up-time, the same place the config's
|
|
203
203
|
* `process.env.DATABASE_URL` read it from.
|
|
204
204
|
*/
|
|
205
205
|
function ownerDatabaseUrl(config: SupatypeProjectConfig, scheme = "postgresql"): string {
|
|
206
206
|
if (usesExternalDatabase(config)) {
|
|
207
|
-
return "${DATABASE_URL:?DATABASE_URL is missing from .env
|
|
207
|
+
return "${DATABASE_URL:?DATABASE_URL is missing from .env, required by database.external}"
|
|
208
208
|
}
|
|
209
209
|
return (
|
|
210
210
|
`${scheme}://\${POSTGRES_USER:-supatype_admin}:` +
|
|
@@ -217,7 +217,7 @@ function ownerDatabaseUrl(config: SupatypeProjectConfig, scheme = "postgresql"):
|
|
|
217
217
|
* PostgREST's DSN, which connects as `authenticator` rather than the owner.
|
|
218
218
|
*
|
|
219
219
|
* For an external database the host, port, database and query string are taken from the operator's
|
|
220
|
-
* URL and only the password stays a variable. The alternative
|
|
220
|
+
* URL and only the password stays a variable. The alternative, a second full URL in `.env`, is one
|
|
221
221
|
* more thing to keep in step with the first, and two URLs that disagree about *which database* is a
|
|
222
222
|
* split-brain nobody notices until the API is serving one and migrations are landing in the other.
|
|
223
223
|
* A hostname is not the secret here; the password is, and it stays out of the generated file.
|
|
@@ -237,7 +237,7 @@ function postgrestDatabaseUrl(config: SupatypeProjectConfig): string {
|
|
|
237
237
|
/** Host Vite dev server as seen from Kong inside Docker Compose. */
|
|
238
238
|
export const COMPOSE_STUDIO_HOST_URL = "http://host.docker.internal:3002"
|
|
239
239
|
|
|
240
|
-
/** Studio container
|
|
240
|
+
/** Studio container: always Docker Hub unless SUPATYPE_STUDIO_IMAGE is set in .env. */
|
|
241
241
|
function studioServiceBlock(): string {
|
|
242
242
|
return ` image: \${SUPATYPE_STUDIO_IMAGE:-supatype/studio:latest}`
|
|
243
243
|
}
|
|
@@ -281,7 +281,7 @@ export interface SelfHostComposeOptions {
|
|
|
281
281
|
/**
|
|
282
282
|
* Which mechanism enforces per-column rules, when the caller knows.
|
|
283
283
|
*
|
|
284
|
-
* Only the call sites that have loaded the schema can say
|
|
284
|
+
* Only the call sites that have loaded the schema can say, see `field-masking-tier.ts`. Left
|
|
285
285
|
* unset, the exposed schema list is today's, which is correct for every project without field
|
|
286
286
|
* rules and for every project on `supatype/postgres`.
|
|
287
287
|
*/
|
|
@@ -385,7 +385,7 @@ ${external ? "" : " db-data:\n"} minio-data:
|
|
|
385
385
|
|
|
386
386
|
// `depends_on` for the services that talk to Postgres. With an external database there is no
|
|
387
387
|
// container to wait on, so the clause disappears entirely and each service retries on connect
|
|
388
|
-
// instead
|
|
388
|
+
// instead: which is also what covers a database that restarts *after* boot, something no
|
|
389
389
|
// healthcheck ever did.
|
|
390
390
|
const dbDependencyClause = external
|
|
391
391
|
? ""
|
|
@@ -412,8 +412,8 @@ ${external ? "" : " db-data:\n"} minio-data:
|
|
|
412
412
|
DATABASE_URL: "${ownerUrl}"
|
|
413
413
|
JWT_SECRET: \${JWT_SECRET:?JWT_SECRET is missing from .env}
|
|
414
414
|
SLOT_NAME: supatype_realtime
|
|
415
|
-
# Matches the publication the supatype/postgres image creates. Read by nothing today
|
|
416
|
-
# wal2json decodes from the slot
|
|
415
|
+
# Matches the publication the supatype/postgres image creates. Read by nothing today,
|
|
416
|
+
# wal2json decodes from the slot, and kept for a future pgoutput decoder.
|
|
417
417
|
PUBLICATION_NAME: supatype_realtime
|
|
418
418
|
${dbDependency}`
|
|
419
419
|
: ` # No \`realtime\` service: database.external.realtime is false. Subscriptions are
|
|
@@ -443,7 +443,7 @@ ${dbPorts} volumes:
|
|
|
443
443
|
- db-data:/var/lib/postgresql/data
|
|
444
444
|
healthcheck:
|
|
445
445
|
# -h 127.0.0.1 forces TCP. Without it \`pg_isready\` uses the Unix socket, which the
|
|
446
|
-
# entrypoint's temporary init server is already listening on while TCP is still refused
|
|
446
|
+
# entrypoint's temporary init server is already listening on while TCP is still refused,
|
|
447
447
|
# so the container reported healthy, \`depends_on: service_healthy\` released, and every
|
|
448
448
|
# service that connects over the network died with ECONNREFUSED on first boot. PostgREST
|
|
449
449
|
# survived only because it retries. Observed on a clean stack: server, storage and
|
|
@@ -466,7 +466,7 @@ ${dbServiceBlock} postgrest:
|
|
|
466
466
|
expose:
|
|
467
467
|
- "3000"
|
|
468
468
|
environment:
|
|
469
|
-
# Connects as \`authenticator\`, not \${POSTGRES_USER}
|
|
469
|
+
# Connects as \`authenticator\`, not \${POSTGRES_USER}, which is a superuser, and a
|
|
470
470
|
# superuser session may SET ROLE to any role in the cluster, so a request whose JWT
|
|
471
471
|
# named one got it. \`authenticator\` is NOINHERIT with membership in only
|
|
472
472
|
# anon/authenticated/service_role, so the same SET ROLE is refused.
|
|
@@ -476,7 +476,7 @@ ${dbServiceBlock} postgrest:
|
|
|
476
476
|
PGRST_DB_URI: ${postgrestUrl}
|
|
477
477
|
# Derived from schema.pg_schema (or schema.api_schemas). Hardcoding this is why choosing a
|
|
478
478
|
# non-public pg_schema used to give a correct push and an API that answered PGRST106 for
|
|
479
|
-
# everything
|
|
479
|
+
# everything: the engine moved and PostgREST was never told.
|
|
480
480
|
PGRST_DB_SCHEMA: "${apiSchemaList(config, options?.fieldMaskingTier)}"
|
|
481
481
|
PGRST_DB_ANON_ROLE: anon
|
|
482
482
|
PGRST_JWT_SECRET: \${JWT_SECRET:?JWT_SECRET is missing from .env}
|
|
@@ -511,12 +511,12 @@ ${dbDependency}
|
|
|
511
511
|
# cloud, for isolation the route boundary already provides.
|
|
512
512
|
SUPATYPE_HOOKS_ROOT: /project/hooks
|
|
513
513
|
PORT: "8001"
|
|
514
|
-
# In-compose loopback to Kong (not API_EXTERNAL_URL / localhost
|
|
514
|
+
# In-compose loopback to Kong (not API_EXTERNAL_URL / localhost, unreachable from this container).
|
|
515
515
|
SUPATYPE_URL: http://kong:8000
|
|
516
516
|
SUPATYPE_INTERNAL_URL: http://kong:8000
|
|
517
517
|
SUPATYPE_ANON_KEY: \${ANON_KEY:-}
|
|
518
|
-
# Present so the worker can hand it to hooks
|
|
519
|
-
# outside
|
|
518
|
+
# Present so the worker can hand it to hooks, which are procedural and unreachable from
|
|
519
|
+
# outside: and to the public functions named below. Withheld from every other handler before
|
|
520
520
|
# any of them is imported: a function is a public endpoint, and an ambient admin credential made
|
|
521
521
|
# each one able to read past every access rule in the schema.
|
|
522
522
|
SUPATYPE_SERVICE_ROLE_KEY: \${SERVICE_ROLE_KEY:-}
|
|
@@ -629,7 +629,7 @@ ${kongDependsOn}${kongValkeyDepends}
|
|
|
629
629
|
${volumesBlock}`
|
|
630
630
|
}
|
|
631
631
|
|
|
632
|
-
/** In-compose worker address
|
|
632
|
+
/** In-compose worker address: matches the `functions-worker` service this file always generates. */
|
|
633
633
|
const COMPOSE_FUNCTIONS_WORKER_URL = "http://functions-worker:8001"
|
|
634
634
|
|
|
635
635
|
function ensureComposeManifest(cwd: string, config: SupatypeProjectConfig): void {
|
|
@@ -653,7 +653,7 @@ function ensureComposeManifest(cwd: string, config: SupatypeProjectConfig): void
|
|
|
653
653
|
...(realtimeEnabled(config) && { realtime_url: "http://realtime:4000" }),
|
|
654
654
|
// True because this file *always* generates a `functions-worker` service and hands the server
|
|
655
655
|
// `SUPATYPE_FUNCTIONS_WORKER_URL`. It said false, so the server answered 404 for every function
|
|
656
|
-
// in a stack that was running a worker for them
|
|
656
|
+
// in a stack that was running a worker for them, provisioned, then switched off.
|
|
657
657
|
functions_enabled: true,
|
|
658
658
|
functions_worker_url: COMPOSE_FUNCTIONS_WORKER_URL,
|
|
659
659
|
}
|
|
@@ -664,8 +664,8 @@ function ensureComposeManifest(cwd: string, config: SupatypeProjectConfig): void
|
|
|
664
664
|
* Turn functions on in a manifest written by an older CLI, leaving every other key alone.
|
|
665
665
|
*
|
|
666
666
|
* Without this, only new projects get working functions: a stack generated before the flag was
|
|
667
|
-
* corrected keeps `functions_enabled: false` on disk, and regenerating the compose file
|
|
668
|
-
* obvious thing to try
|
|
667
|
+
* corrected keeps `functions_enabled: false` on disk, and regenerating the compose file, the
|
|
668
|
+
* obvious thing to try, does not fix it.
|
|
669
669
|
*/
|
|
670
670
|
function repairComposeFunctionsFlag(manifestPath: string): void {
|
|
671
671
|
let parsed: Record<string, unknown>
|
|
@@ -696,7 +696,7 @@ function ensureProjectFunctionsDir(cwd: string, config: SupatypeProjectConfig):
|
|
|
696
696
|
* The config's external URL and `.env`'s `DATABASE_URL` must be the same string.
|
|
697
697
|
*
|
|
698
698
|
* The CLI resolves the URL from config; Compose substitutes `.env` at up-time. If the two disagree,
|
|
699
|
-
* `push` migrates one database while the services serve another
|
|
699
|
+
* `push` migrates one database while the services serve another, which reads as data loss and
|
|
700
700
|
* isn't. It also makes the generated GoTrue DSN wrong, since whether to append `search_path` with
|
|
701
701
|
* `?` or `&` is decided from the config URL's query string.
|
|
702
702
|
*/
|
|
@@ -731,14 +731,14 @@ function assertExternalUrlMatchesEnv(cwd: string, config: SupatypeProjectConfig)
|
|
|
731
731
|
* A loopback host in the external URL cannot work from inside a container.
|
|
732
732
|
*
|
|
733
733
|
* `127.0.0.1` means "this container" to every service in the stack, so an external database on the
|
|
734
|
-
* host machine is unreachable
|
|
734
|
+
* host machine is unreachable, while the *CLI* reaches it fine, because the CLI runs on the host.
|
|
735
735
|
* That asymmetry is the trap: `supatype db check` passes, `push` applies the schema, and then
|
|
736
736
|
* storage, realtime and the server all die with ECONNREFUSED against their own loopback. Found by
|
|
737
737
|
* rehearsing exactly that.
|
|
738
738
|
*
|
|
739
739
|
* Refused rather than rewritten. The compose file interpolates one `${DATABASE_URL}` for every
|
|
740
740
|
* service, so silently substituting a different host would mean the CLI and the stack no longer
|
|
741
|
-
* agree about which database they are talking to
|
|
741
|
+
* agree about which database they are talking to, the thing every other check here exists to
|
|
742
742
|
* prevent.
|
|
743
743
|
*/
|
|
744
744
|
export function loopbackExternalHost(config: SupatypeProjectConfig): string | undefined {
|
|
@@ -767,7 +767,7 @@ function assertExternalUrlReachableFromContainers(config: SupatypeProjectConfig)
|
|
|
767
767
|
fatalError(
|
|
768
768
|
`database.external.url points at ${host}, which no container can reach`,
|
|
769
769
|
[
|
|
770
|
-
"Inside a container, localhost is that container
|
|
770
|
+
"Inside a container, localhost is that container, not the machine running Docker. Every",
|
|
771
771
|
"service in the stack would fail to connect, while the CLI succeeds because it runs on the host.",
|
|
772
772
|
"",
|
|
773
773
|
"Use a host the containers can resolve:",
|
|
@@ -902,7 +902,7 @@ export function runDockerCompose(
|
|
|
902
902
|
return result.status ?? 1
|
|
903
903
|
}
|
|
904
904
|
|
|
905
|
-
/** Compose project name for a Supatype project
|
|
905
|
+
/** Compose project name for a Supatype project, isolates docker state per project. */
|
|
906
906
|
export function composeProjectName(projectName: string): string {
|
|
907
907
|
const slug = projectName.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "")
|
|
908
908
|
return `supatype-${slug || "project"}`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Check that every name in `functions.serviceRole` is a function that exists.
|
|
3
3
|
*
|
|
4
4
|
* The grant fails **closed**: a typo, or a function that has since been renamed, means that function
|
|
5
|
-
* quietly does not receive the service-role key. Nothing breaks loudly
|
|
5
|
+
* quietly does not receive the service-role key. Nothing breaks loudly, the handler simply reads
|
|
6
6
|
* `undefined` and whatever it does with the key stops working, at runtime, in a deploy that reported
|
|
7
7
|
* success. So the name is checked where it is declared, against the directory it must match.
|
|
8
8
|
*
|
|
@@ -77,7 +77,7 @@ export function checkServiceRoleRoutes(
|
|
|
77
77
|
// Not an error: it was the documented form once, and the worker grants hooks whatever this says.
|
|
78
78
|
// Still worth saying, because a reader would reasonably assume the line is what does the granting.
|
|
79
79
|
warnings.push(
|
|
80
|
-
` "${name}" is not needed
|
|
80
|
+
` "${name}" is not needed, a hook receives the service-role key because only the API server ` +
|
|
81
81
|
`can reach it`,
|
|
82
82
|
)
|
|
83
83
|
continue
|
|
@@ -85,7 +85,7 @@ export function checkServiceRoleRoutes(
|
|
|
85
85
|
if (!known.has(name)) {
|
|
86
86
|
const where =
|
|
87
87
|
searched.length > 1 ? ` (searched ${searched.join(", ")})` : ""
|
|
88
|
-
errors.push(` "${name}"
|
|
88
|
+
errors.push(` "${name}": no ${primary}/${name}/index.ts${where}`)
|
|
89
89
|
missing.push(name)
|
|
90
90
|
}
|
|
91
91
|
}
|
package/src/storage-provision.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Provision storage buckets declared in a schema AST via the storage server API.
|
|
3
3
|
*
|
|
4
|
-
* The storage server is the authority on bucket existence
|
|
4
|
+
* The storage server is the authority on bucket existence, going through the API
|
|
5
5
|
* ensures it creates any backing resources (directories, S3 buckets, etc.).
|
|
6
6
|
* Buckets already registered return 409 Conflict, which is treated as success.
|
|
7
7
|
*/
|
|
@@ -76,10 +76,10 @@ export async function provisionBuckets(
|
|
|
76
76
|
.catch(() => null)
|
|
77
77
|
|
|
78
78
|
if (res === null) {
|
|
79
|
-
console.warn(`[storage] Storage API unreachable
|
|
79
|
+
console.warn(`[storage] Storage API unreachable, skipped bucket "${bucket.id}"`)
|
|
80
80
|
continue
|
|
81
81
|
}
|
|
82
|
-
if (res.status === 409) continue // already exists
|
|
82
|
+
if (res.status === 409) continue // already exists, fine
|
|
83
83
|
if (!res.ok) {
|
|
84
84
|
const msg = await res.text().catch(() => res.statusText)
|
|
85
85
|
console.warn(`[storage] Failed to provision bucket "${bucket.id}": ${msg}`)
|
package/src/studio-dev-server.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface StudioDevServerOptions {
|
|
|
20
20
|
* so fetches hit the Vite proxy (SUPATYPE_PROXY_TARGET) and avoid CORS.
|
|
21
21
|
*/
|
|
22
22
|
viteSupatypeUrl: string
|
|
23
|
-
/** Vite `base
|
|
23
|
+
/** Vite `base`: `/studio/` when behind Kong at `/studio/`; `/` for native dev on :3002. */
|
|
24
24
|
basePath?: string
|
|
25
25
|
}
|
|
26
26
|
|
package/src/systemd.ts
CHANGED
package/src/target-client.ts
CHANGED
|
@@ -115,7 +115,7 @@ export async function targetFetch<T>(
|
|
|
115
115
|
!opts.authRefresh
|
|
116
116
|
) {
|
|
117
117
|
throw new TargetApiError(
|
|
118
|
-
`${message}. Session expired
|
|
118
|
+
`${message}. Session expired, run: supatype login`,
|
|
119
119
|
result.status,
|
|
120
120
|
result.json.code,
|
|
121
121
|
)
|
package/src/tsx-runner.ts
CHANGED
|
@@ -13,7 +13,7 @@ import { tmpdir } from "node:os"
|
|
|
13
13
|
|
|
14
14
|
const _require = createRequire(import.meta.url)
|
|
15
15
|
|
|
16
|
-
// The CLI's own source directory
|
|
16
|
+
// The CLI's own source directory, workspace packages are
|
|
17
17
|
// resolvable from here. Eval snippets are written here so ESM resolution finds them.
|
|
18
18
|
const CLI_SRC_DIR = dirname(fileURLToPath(import.meta.url))
|
|
19
19
|
|