@supatype/cli 0.1.0 → 0.1.2
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 +121 -86
- package/.turbo/turbo-typecheck.log +2 -2
- package/dist/binary-cache.d.ts +2 -0
- package/dist/binary-cache.d.ts.map +1 -1
- package/dist/binary-cache.js +36 -0
- package/dist/binary-cache.js.map +1 -1
- package/dist/binary-download-lock.d.ts +12 -0
- package/dist/binary-download-lock.d.ts.map +1 -0
- package/dist/binary-download-lock.js +106 -0
- package/dist/binary-download-lock.js.map +1 -0
- package/dist/cli-package-version.d.ts +3 -0
- package/dist/cli-package-version.d.ts.map +1 -0
- package/dist/cli-package-version.js +15 -0
- package/dist/cli-package-version.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.js +25 -19
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/admin.d.ts +28 -1
- package/dist/commands/admin.d.ts.map +1 -1
- package/dist/commands/admin.js +290 -112
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/cache.d.ts +1 -1
- package/dist/commands/cache.d.ts.map +1 -1
- package/dist/commands/cache.js +98 -5
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +28 -22
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.d.ts +8 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +278 -139
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/link-helpers.d.ts.map +1 -1
- package/dist/commands/link-helpers.js +26 -25
- package/dist/commands/link-helpers.js.map +1 -1
- package/dist/commands/push.js +3 -3
- package/dist/commands/push.js.map +1 -1
- package/dist/compose-local-server-image.d.ts +13 -0
- package/dist/compose-local-server-image.d.ts.map +1 -0
- package/dist/compose-local-server-image.js +57 -0
- package/dist/compose-local-server-image.js.map +1 -0
- package/dist/compose-rename.d.ts +10 -0
- package/dist/compose-rename.d.ts.map +1 -0
- package/dist/compose-rename.js +64 -0
- package/dist/compose-rename.js.map +1 -0
- package/dist/dev-compose.d.ts.map +1 -1
- package/dist/dev-compose.js +138 -97
- package/dist/dev-compose.js.map +1 -1
- package/dist/dev-log-bus.d.ts +5 -0
- package/dist/dev-log-bus.d.ts.map +1 -1
- package/dist/dev-log-bus.js +14 -0
- package/dist/dev-log-bus.js.map +1 -1
- package/dist/dev-log-filter.d.ts +4 -0
- package/dist/dev-log-filter.d.ts.map +1 -1
- package/dist/dev-log-filter.js +52 -0
- package/dist/dev-log-filter.js.map +1 -1
- package/dist/dev-ports.d.ts +27 -0
- package/dist/dev-ports.d.ts.map +1 -0
- package/dist/dev-ports.js +178 -0
- package/dist/dev-ports.js.map +1 -0
- package/dist/dev-ready-panel.d.ts +19 -0
- package/dist/dev-ready-panel.d.ts.map +1 -0
- package/dist/dev-ready-panel.js +49 -0
- package/dist/dev-ready-panel.js.map +1 -0
- package/dist/dev-session-lock.d.ts +25 -0
- package/dist/dev-session-lock.d.ts.map +1 -0
- package/dist/dev-session-lock.js +78 -0
- package/dist/dev-session-lock.js.map +1 -0
- package/dist/dev-session.d.ts +18 -5
- package/dist/dev-session.d.ts.map +1 -1
- package/dist/dev-session.js +91 -18
- package/dist/dev-session.js.map +1 -1
- package/dist/dev-shutdown.d.ts +20 -2
- package/dist/dev-shutdown.d.ts.map +1 -1
- package/dist/dev-shutdown.js +88 -10
- package/dist/dev-shutdown.js.map +1 -1
- package/dist/dev-task-colors.d.ts +3 -1
- package/dist/dev-task-colors.d.ts.map +1 -1
- package/dist/dev-task-colors.js +23 -3
- package/dist/dev-task-colors.js.map +1 -1
- package/dist/docker-runtime.js +1 -1
- package/dist/docker-runtime.js.map +1 -1
- package/dist/engine-push-output.d.ts +1 -0
- package/dist/engine-push-output.d.ts.map +1 -1
- package/dist/engine-push-output.js +4 -1
- package/dist/engine-push-output.js.map +1 -1
- package/dist/ensure-binary.d.ts.map +1 -1
- package/dist/ensure-binary.js +14 -2
- package/dist/ensure-binary.js.map +1 -1
- package/dist/ensure-component-binaries.d.ts +17 -0
- package/dist/ensure-component-binaries.d.ts.map +1 -0
- package/dist/ensure-component-binaries.js +45 -0
- package/dist/ensure-component-binaries.js.map +1 -0
- package/dist/ensure-dev-api-config.d.ts +3 -0
- package/dist/ensure-dev-api-config.d.ts.map +1 -0
- package/dist/ensure-dev-api-config.js +17 -0
- package/dist/ensure-dev-api-config.js.map +1 -0
- package/dist/env-file.d.ts +5 -0
- package/dist/env-file.d.ts.map +1 -0
- package/dist/env-file.js +33 -0
- package/dist/env-file.js.map +1 -0
- package/dist/init-dependency-versions.d.ts +13 -0
- package/dist/init-dependency-versions.d.ts.map +1 -0
- package/dist/init-dependency-versions.js +53 -0
- package/dist/init-dependency-versions.js.map +1 -0
- package/dist/init-package-json.d.ts +21 -0
- package/dist/init-package-json.d.ts.map +1 -0
- package/dist/init-package-json.js +46 -0
- package/dist/init-package-json.js.map +1 -0
- package/dist/postgres-ctl.d.ts.map +1 -1
- package/dist/postgres-ctl.js +2 -1
- package/dist/postgres-ctl.js.map +1 -1
- package/dist/required-host-components.d.ts +11 -0
- package/dist/required-host-components.d.ts.map +1 -0
- package/dist/required-host-components.js +25 -0
- package/dist/required-host-components.js.map +1 -0
- package/dist/resolve-api-url.d.ts +6 -0
- package/dist/resolve-api-url.d.ts.map +1 -0
- package/dist/resolve-api-url.js +39 -0
- package/dist/resolve-api-url.js.map +1 -0
- package/dist/rest-cache-admin.d.ts +33 -0
- package/dist/rest-cache-admin.d.ts.map +1 -0
- package/dist/rest-cache-admin.js +96 -0
- package/dist/rest-cache-admin.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +4 -6
- package/dist/scripts/postinstall.d.ts.map +1 -1
- package/dist/scripts/postinstall.js +8 -41
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/self-host-compose.d.ts.map +1 -1
- package/dist/self-host-compose.js +24 -13
- package/dist/self-host-compose.js.map +1 -1
- package/dist/studio-dev-server.d.ts +4 -2
- package/dist/studio-dev-server.d.ts.map +1 -1
- package/dist/studio-dev-server.js +3 -2
- package/dist/studio-dev-server.js.map +1 -1
- package/dist/ui/brand.d.ts +2 -5
- package/dist/ui/brand.d.ts.map +1 -1
- package/dist/ui/brand.js +2 -7
- package/dist/ui/brand.js.map +1 -1
- package/dist/ui/clack-api.d.ts +44 -0
- package/dist/ui/clack-api.d.ts.map +1 -0
- package/dist/ui/clack-api.js +76 -0
- package/dist/ui/clack-api.js.map +1 -0
- package/dist/ui/clack.d.ts +14 -0
- package/dist/ui/clack.d.ts.map +1 -0
- package/dist/ui/clack.js +147 -0
- package/dist/ui/clack.js.map +1 -0
- package/dist/ui/components/FlowSpinner.d.ts +5 -0
- package/dist/ui/components/FlowSpinner.d.ts.map +1 -0
- package/dist/ui/components/FlowSpinner.js +8 -0
- package/dist/ui/components/FlowSpinner.js.map +1 -0
- package/dist/ui/components/LogoWordmark.d.ts +9 -0
- package/dist/ui/components/LogoWordmark.d.ts.map +1 -0
- package/dist/ui/components/LogoWordmark.js +17 -0
- package/dist/ui/components/LogoWordmark.js.map +1 -0
- package/dist/ui/components/PromptPanel.d.ts +5 -0
- package/dist/ui/components/PromptPanel.d.ts.map +1 -0
- package/dist/ui/components/PromptPanel.js +7 -0
- package/dist/ui/components/PromptPanel.js.map +1 -0
- package/dist/ui/components/SelectField.d.ts +11 -0
- package/dist/ui/components/SelectField.d.ts.map +1 -0
- package/dist/ui/components/SelectField.js +19 -0
- package/dist/ui/components/SelectField.js.map +1 -0
- package/dist/ui/confirm.d.ts +2 -1
- package/dist/ui/confirm.d.ts.map +1 -1
- package/dist/ui/confirm.js +4 -4
- package/dist/ui/confirm.js.map +1 -1
- package/dist/ui/dev/DevDashboard.d.ts +8 -0
- package/dist/ui/dev/DevDashboard.d.ts.map +1 -0
- package/dist/ui/dev/DevDashboard.js +151 -0
- package/dist/ui/dev/DevDashboard.js.map +1 -0
- package/dist/ui/dev/DevReadyPanelView.d.ts +7 -0
- package/dist/ui/dev/DevReadyPanelView.d.ts.map +1 -0
- package/dist/ui/dev/DevReadyPanelView.js +29 -0
- package/dist/ui/dev/DevReadyPanelView.js.map +1 -0
- package/dist/ui/fatal.d.ts.map +1 -1
- package/dist/ui/fatal.js +5 -11
- package/dist/ui/fatal.js.map +1 -1
- package/dist/ui/flows/FlowApp.d.ts +8 -0
- package/dist/ui/flows/FlowApp.d.ts.map +1 -0
- package/dist/ui/flows/FlowApp.js +42 -0
- package/dist/ui/flows/FlowApp.js.map +1 -0
- package/dist/ui/flows/prompt-fields.d.ts +48 -0
- package/dist/ui/flows/prompt-fields.d.ts.map +1 -0
- package/dist/ui/flows/prompt-fields.js +88 -0
- package/dist/ui/flows/prompt-fields.js.map +1 -0
- package/dist/ui/flows/types.d.ts +41 -0
- package/dist/ui/flows/types.d.ts.map +1 -0
- package/dist/ui/flows/types.js +2 -0
- package/dist/ui/flows/types.js.map +1 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -1
- package/dist/ui/messages.d.ts +1 -0
- package/dist/ui/messages.d.ts.map +1 -1
- package/dist/ui/messages.js +48 -8
- package/dist/ui/messages.js.map +1 -1
- package/dist/ui/progress.d.ts +5 -1
- package/dist/ui/progress.d.ts.map +1 -1
- package/dist/ui/progress.js +12 -3
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/prompts.d.ts +7 -5
- package/dist/ui/prompts.d.ts.map +1 -1
- package/dist/ui/prompts.js +15 -8
- package/dist/ui/prompts.js.map +1 -1
- package/dist/ui/runtime/cancel.d.ts +4 -0
- package/dist/ui/runtime/cancel.d.ts.map +1 -0
- package/dist/ui/runtime/cancel.js +6 -0
- package/dist/ui/runtime/cancel.js.map +1 -0
- package/dist/ui/runtime/command-chrome.d.ts +17 -0
- package/dist/ui/runtime/command-chrome.d.ts.map +1 -0
- package/dist/ui/runtime/command-chrome.js +123 -0
- package/dist/ui/runtime/command-chrome.js.map +1 -0
- package/dist/ui/runtime/dev-prompt-queue.d.ts +30 -0
- package/dist/ui/runtime/dev-prompt-queue.d.ts.map +1 -0
- package/dist/ui/runtime/dev-prompt-queue.js +57 -0
- package/dist/ui/runtime/dev-prompt-queue.js.map +1 -0
- package/dist/ui/runtime/flow-session.d.ts +4 -0
- package/dist/ui/runtime/flow-session.d.ts.map +1 -0
- package/dist/ui/runtime/flow-session.js +8 -0
- package/dist/ui/runtime/flow-session.js.map +1 -0
- package/dist/ui/runtime/run-clack-flow.d.ts +5 -0
- package/dist/ui/runtime/run-clack-flow.d.ts.map +1 -0
- package/dist/ui/runtime/run-clack-flow.js +34 -0
- package/dist/ui/runtime/run-clack-flow.js.map +1 -0
- package/dist/ui/theme.d.ts +24 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +34 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/valkey-sidecar.d.ts +17 -0
- package/dist/valkey-sidecar.d.ts.map +1 -0
- package/dist/valkey-sidecar.js +94 -0
- package/dist/valkey-sidecar.js.map +1 -0
- package/package.json +11 -3
- package/src/binary-cache.ts +61 -0
- package/src/binary-download-lock.ts +124 -0
- package/src/cli-package-version.ts +15 -0
- package/src/cli.ts +6 -2
- package/src/commands/add.ts +26 -19
- package/src/commands/admin.ts +380 -137
- package/src/commands/cache.ts +105 -5
- package/src/commands/dev.ts +29 -21
- package/src/commands/init.ts +217 -46
- package/src/commands/link-helpers.ts +30 -29
- package/src/commands/push.ts +3 -3
- package/src/compose-local-server-image.ts +68 -0
- package/src/compose-rename.ts +73 -0
- package/src/dev-compose.ts +175 -96
- package/src/dev-log-bus.ts +18 -0
- package/src/dev-log-filter.ts +42 -0
- package/src/dev-ports.ts +223 -0
- package/src/dev-ready-panel.ts +63 -0
- package/src/dev-session-lock.ts +98 -0
- package/src/dev-session.ts +98 -18
- package/src/dev-shutdown.ts +114 -9
- package/src/dev-task-colors.ts +22 -3
- package/src/docker-runtime.ts +1 -1
- package/src/engine-push-output.ts +5 -1
- package/src/ensure-binary.ts +21 -1
- package/src/ensure-component-binaries.ts +71 -0
- package/src/ensure-dev-api-config.ts +18 -0
- package/src/env-file.ts +37 -0
- package/src/init-dependency-versions.ts +69 -0
- package/src/init-package-json.ts +63 -0
- package/src/postgres-ctl.ts +2 -1
- package/src/required-host-components.ts +37 -0
- package/src/resolve-api-url.ts +43 -0
- package/src/rest-cache-admin.ts +135 -0
- package/src/scripts/postinstall.ts +9 -46
- package/src/self-host-compose.ts +23 -12
- package/src/studio-dev-server.ts +5 -4
- package/src/ui/README.md +13 -9
- package/src/ui/brand.ts +2 -8
- package/src/ui/clack-api.ts +123 -0
- package/src/ui/clack.ts +153 -0
- package/src/ui/components/FlowSpinner.tsx +15 -0
- package/src/ui/components/LogoWordmark.tsx +36 -0
- package/src/ui/components/PromptPanel.tsx +17 -0
- package/src/ui/components/SelectField.tsx +58 -0
- package/src/ui/confirm.ts +5 -4
- package/src/ui/dev/DevDashboard.tsx +213 -0
- package/src/ui/dev/DevReadyPanelView.tsx +67 -0
- package/src/ui/fatal.ts +5 -10
- package/src/ui/flows/FlowApp.tsx +67 -0
- package/src/ui/flows/prompt-fields.tsx +192 -0
- package/src/ui/flows/types.ts +50 -0
- package/src/ui/index.ts +1 -1
- package/src/ui/messages.ts +50 -8
- package/src/ui/progress.ts +14 -3
- package/src/ui/prompts.ts +17 -9
- package/src/ui/runtime/cancel.ts +6 -0
- package/src/ui/runtime/command-chrome.ts +147 -0
- package/src/ui/runtime/dev-prompt-queue.ts +84 -0
- package/src/ui/runtime/flow-session.ts +11 -0
- package/src/ui/runtime/run-clack-flow.tsx +52 -0
- package/src/ui/theme.ts +41 -0
- package/src/valkey-sidecar.ts +126 -0
- package/tests/admin-ensure.test.ts +59 -0
- package/tests/binary-cache-cloud-overrides.test.ts +2 -2
- package/tests/binary-download-lock.test.ts +41 -0
- package/tests/cli-help.test.ts +7 -4
- package/tests/cli-package-version.test.ts +15 -0
- package/tests/command-chrome-coverage.test.ts +149 -0
- package/tests/command-chrome-wrap.test.ts +51 -0
- package/tests/config.test.ts +8 -4
- package/tests/dev-ports.test.ts +41 -0
- package/tests/dev-ready-panel.test.ts +20 -0
- package/tests/dev-session-lock.test.ts +54 -0
- package/tests/dev-ui.test.ts +66 -3
- package/tests/docker-runtime.test.ts +9 -20
- package/tests/ensure-dev-api-config.test.ts +22 -0
- package/tests/init-dependency-versions.test.ts +62 -0
- package/tests/init-package-json.test.ts +18 -0
- package/tests/init.test.ts +30 -3
- package/tests/required-host-components.test.ts +51 -0
- package/tests/resolve-api-url.test.ts +23 -0
- package/tests/rest-cache-admin.test.ts +28 -0
- package/tests/runtime-contract.test.ts +12 -3
- package/tests/tsconfig.json +8 -2
- package/tests/ui-confirm.test.ts +13 -9
- package/tests/ui-messages.test.ts +4 -18
- package/tsconfig.json +1 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +3 -0
- package/dist/dev-tui.d.ts +0 -24
- package/dist/dev-tui.d.ts.map +0 -1
- package/dist/dev-tui.js +0 -188
- package/dist/dev-tui.js.map +0 -1
- package/src/dev-tui.ts +0 -232
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
import { devReadyPanelRowCount } from "../src/dev-ready-panel.js"
|
|
3
|
+
|
|
4
|
+
describe("devReadyPanelRowCount", () => {
|
|
5
|
+
it("accounts for border, keys block, and hints", () => {
|
|
6
|
+
const rows = devReadyPanelRowCount({
|
|
7
|
+
title: "Services running",
|
|
8
|
+
links: [
|
|
9
|
+
{ label: "API", url: "http://localhost:1" },
|
|
10
|
+
{ label: "Studio", url: "http://localhost:1/studio/" },
|
|
11
|
+
],
|
|
12
|
+
hints: ["Demo data: pnpm seed"],
|
|
13
|
+
anonKey: "anon-jwt",
|
|
14
|
+
serviceRoleKey: "svc-jwt",
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
// border(2) + title(1) + links(2) + hint(1) + keys header(1) + anon(1) + svc(1) + margin(1)
|
|
18
|
+
expect(rows).toBe(10)
|
|
19
|
+
})
|
|
20
|
+
})
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
|
|
2
|
+
import { mkdtempSync, writeFileSync, existsSync, mkdirSync } from "node:fs"
|
|
3
|
+
import { join } from "node:path"
|
|
4
|
+
import { tmpdir } from "node:os"
|
|
5
|
+
import {
|
|
6
|
+
clearDevSessionLock,
|
|
7
|
+
devSessionLockPath,
|
|
8
|
+
readDevSessionLock,
|
|
9
|
+
writeDevSessionLock,
|
|
10
|
+
} from "../src/dev-session-lock.js"
|
|
11
|
+
|
|
12
|
+
describe("dev-session-lock", () => {
|
|
13
|
+
let dir: string
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
dir = mkdtempSync(join(tmpdir(), "supatype-lock-"))
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
clearDevSessionLock(dir)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it("writes and reads a lock file", () => {
|
|
24
|
+
writeDevSessionLock(dir, {
|
|
25
|
+
composeProject: "supatype-demo",
|
|
26
|
+
projectRef: "demo",
|
|
27
|
+
composePath: join(dir, ".supatype/self-host/docker-compose.yml"),
|
|
28
|
+
kongPort: 18473,
|
|
29
|
+
startedAt: "2026-01-01T00:00:00.000Z",
|
|
30
|
+
})
|
|
31
|
+
expect(existsSync(devSessionLockPath(dir))).toBe(true)
|
|
32
|
+
const lock = readDevSessionLock(dir)
|
|
33
|
+
expect(lock?.composeProject).toBe("supatype-demo")
|
|
34
|
+
expect(lock?.kongPort).toBe(18473)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it("clears the lock file", () => {
|
|
38
|
+
mkdirSync(join(dir, ".supatype"), { recursive: true })
|
|
39
|
+
writeFileSync(
|
|
40
|
+
devSessionLockPath(dir),
|
|
41
|
+
JSON.stringify({
|
|
42
|
+
version: 1,
|
|
43
|
+
composeProject: "supatype-demo",
|
|
44
|
+
projectRef: "demo",
|
|
45
|
+
composePath: "x",
|
|
46
|
+
kongPort: 1,
|
|
47
|
+
startedAt: "t",
|
|
48
|
+
}),
|
|
49
|
+
"utf8",
|
|
50
|
+
)
|
|
51
|
+
clearDevSessionLock(dir)
|
|
52
|
+
expect(existsSync(devSessionLockPath(dir))).toBe(false)
|
|
53
|
+
})
|
|
54
|
+
})
|
package/tests/dev-ui.test.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
|
|
2
|
+
import { mkdtempSync, writeFileSync } from "node:fs"
|
|
3
|
+
import { join } from "node:path"
|
|
4
|
+
import { tmpdir } from "node:os"
|
|
5
|
+
|
|
6
|
+
vi.mock("ink", () => ({
|
|
7
|
+
render: vi.fn(() => ({ unmount: vi.fn() })),
|
|
8
|
+
}))
|
|
2
9
|
import { DevLogBus } from "../src/dev-log-bus.js"
|
|
3
|
-
import { filterDevSubprocessLine, formatConsoleArgs, stripAnsi } from "../src/dev-log-filter.js"
|
|
4
|
-
import { appendDevTaskLog, beginDevSession, endDevSession, resolveDevUiMode } from "../src/dev-session.js"
|
|
10
|
+
import { filterCommandLogLine, filterDevSubprocessLine, filterStackLogLine, formatConsoleArgs, stripAnsi } from "../src/dev-log-filter.js"
|
|
11
|
+
import { appendDevTaskLog, beginDevSession, endDevSession, getActiveDevSession, resolveDevUiMode, withDevSessionSuspended } from "../src/dev-session.js"
|
|
5
12
|
import {
|
|
6
13
|
layoutLogoBlock,
|
|
7
14
|
logoRowCount,
|
|
@@ -22,6 +29,28 @@ describe("filterDevSubprocessLine()", () => {
|
|
|
22
29
|
})
|
|
23
30
|
})
|
|
24
31
|
|
|
32
|
+
describe("filterStackLogLine()", () => {
|
|
33
|
+
it("drops docker build progress but keeps supatype messages", () => {
|
|
34
|
+
expect(filterStackLogLine("#1 [internal] load build definition from Dockerfile")).toBe(false)
|
|
35
|
+
expect(filterStackLogLine(" Container supatype-demo-db-1 Running")).toBe(false)
|
|
36
|
+
expect(filterStackLogLine("[supatype] Waiting for Postgres (compose)...")).toBe(true)
|
|
37
|
+
expect(filterStackLogLine("Services running.")).toBe(true)
|
|
38
|
+
expect(filterStackLogLine(" API (Kong) http://localhost:18473")).toBe(true)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it("keeps override banner lines", () => {
|
|
42
|
+
expect(filterStackLogLine(" engine → ../supatype-schema-engine/bin/engine")).toBe(true)
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
describe("filterCommandLogLine()", () => {
|
|
47
|
+
it("keeps diff output but drops docker container progress", () => {
|
|
48
|
+
expect(filterCommandLogLine(" [+] add_column users.email")).toBe(true)
|
|
49
|
+
expect(filterCommandLogLine(" Container supatype-demo-db-1 Running")).toBe(false)
|
|
50
|
+
expect(filterCommandLogLine("[supatype] Schema pushed.")).toBe(true)
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
|
|
25
54
|
describe("stripAnsi()", () => {
|
|
26
55
|
it("removes colour codes", () => {
|
|
27
56
|
expect(stripAnsi("\x1b[33mhello\x1b[0m")).toBe("hello")
|
|
@@ -75,6 +104,20 @@ describe("appendDevTaskLog()", () => {
|
|
|
75
104
|
expect(session.bus.getTask("app")?.lines).toEqual(["Proxy mode: running npm run vite (/tmp/app)"])
|
|
76
105
|
expect(session.bus.getTask("stack")?.lines ?? []).toEqual([])
|
|
77
106
|
})
|
|
107
|
+
|
|
108
|
+
it("captures console.log to the bus before ink mounts", () => {
|
|
109
|
+
beginDevSession("tui")
|
|
110
|
+
console.log("[supatype] bootstrap line")
|
|
111
|
+
expect(getActiveDevSession()?.bus.getTask("stack")?.lines).toEqual(["bootstrap line"])
|
|
112
|
+
expect(getActiveDevSession()?.isInkMounted()).toBe(true)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it("withDevSessionSuspended is a no-op during bootstrap", async () => {
|
|
116
|
+
beginDevSession("tui")
|
|
117
|
+
await withDevSessionSuspended(async () => "ok")
|
|
118
|
+
expect(getActiveDevSession()?.isConsoleCaptured()).toBe(true)
|
|
119
|
+
expect(getActiveDevSession()?.isInkMounted()).toBe(true)
|
|
120
|
+
})
|
|
78
121
|
})
|
|
79
122
|
|
|
80
123
|
describe("dev-logo", () => {
|
|
@@ -104,9 +147,11 @@ describe("dev-task-colors", () => {
|
|
|
104
147
|
|
|
105
148
|
describe("dev-shutdown", () => {
|
|
106
149
|
const exitSpy = vi.spyOn(process, "exit").mockImplementation((() => undefined) as typeof process.exit)
|
|
150
|
+
const stderrSpy = vi.spyOn(process.stderr, "write").mockImplementation(() => true)
|
|
107
151
|
|
|
108
152
|
beforeEach(() => {
|
|
109
153
|
exitSpy.mockClear()
|
|
154
|
+
stderrSpy.mockClear()
|
|
110
155
|
})
|
|
111
156
|
|
|
112
157
|
afterEach(() => {
|
|
@@ -125,7 +170,7 @@ describe("dev-shutdown", () => {
|
|
|
125
170
|
expect(ran).toBe(true)
|
|
126
171
|
})
|
|
127
172
|
|
|
128
|
-
it("force-exits
|
|
173
|
+
it("warns on second interrupt then force-exits on third", async () => {
|
|
129
174
|
vi.resetModules()
|
|
130
175
|
const { registerDevShutdown, requestDevShutdown } = await import("../src/dev-shutdown.js")
|
|
131
176
|
registerDevShutdown(async () => {
|
|
@@ -134,6 +179,24 @@ describe("dev-shutdown", () => {
|
|
|
134
179
|
requestDevShutdown()
|
|
135
180
|
await vi.waitFor(() => expect(exitSpy).toHaveBeenCalledTimes(0))
|
|
136
181
|
requestDevShutdown()
|
|
182
|
+
expect(stderrSpy).toHaveBeenCalled()
|
|
183
|
+
expect(exitSpy).toHaveBeenCalledTimes(0)
|
|
184
|
+
requestDevShutdown()
|
|
137
185
|
expect(exitSpy).toHaveBeenCalledWith(130)
|
|
138
186
|
})
|
|
187
|
+
|
|
188
|
+
it("registers compose fallback for sync exit cleanup", async () => {
|
|
189
|
+
vi.resetModules()
|
|
190
|
+
const { registerDevShutdown, hasComposeShutdownFallback, resetDevShutdownForTests } =
|
|
191
|
+
await import("../src/dev-shutdown.js")
|
|
192
|
+
resetDevShutdownForTests()
|
|
193
|
+
const dir = mkdtempSync(join(tmpdir(), "supatype-shutdown-"))
|
|
194
|
+
const composePath = join(dir, "docker-compose.yml")
|
|
195
|
+
writeFileSync(composePath, "services: {}\n", "utf8")
|
|
196
|
+
registerDevShutdown(async () => undefined, {
|
|
197
|
+
cwd: dir,
|
|
198
|
+
compose: { cwd: dir, composePath, composeProject: "supatype-test" },
|
|
199
|
+
})
|
|
200
|
+
expect(hasComposeShutdownFallback()).toBe(true)
|
|
201
|
+
})
|
|
139
202
|
})
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { describe, expect, it, vi, beforeEach, afterEach, afterAll } from "vitest"
|
|
1
|
+
import { describe, expect, it, vi, beforeEach, afterEach, afterAll, type MockInstance } from "vitest"
|
|
2
2
|
import type { SpawnSyncReturns } from "node:child_process"
|
|
3
3
|
|
|
4
4
|
const spawnSyncMock = vi.hoisted(() => vi.fn())
|
|
5
5
|
const isInteractiveMock = vi.hoisted(() => vi.fn(() => false))
|
|
6
|
-
const clackLogErrorMock = vi.hoisted(() => vi.fn())
|
|
7
6
|
const clackNoteMock = vi.hoisted(() => vi.fn())
|
|
8
7
|
const clackIntroMock = vi.hoisted(() => vi.fn())
|
|
9
8
|
const printLogoMock = vi.hoisted(() => vi.fn())
|
|
@@ -16,18 +15,12 @@ vi.mock("../src/ui/interactive.js", () => ({
|
|
|
16
15
|
isInteractive: isInteractiveMock,
|
|
17
16
|
}))
|
|
18
17
|
|
|
19
|
-
vi.mock("
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
...original,
|
|
18
|
+
vi.mock("../src/ui/clack.js", () => ({
|
|
19
|
+
p: {
|
|
23
20
|
intro: clackIntroMock,
|
|
24
21
|
note: clackNoteMock,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
error: clackLogErrorMock,
|
|
28
|
-
},
|
|
29
|
-
}
|
|
30
|
-
})
|
|
22
|
+
},
|
|
23
|
+
}))
|
|
31
24
|
|
|
32
25
|
vi.mock("../src/ui/prompts.js", async (importOriginal) => {
|
|
33
26
|
const original = await importOriginal<typeof import("../src/ui/prompts.js")>()
|
|
@@ -124,7 +117,6 @@ describe("reportDockerUnavailable", () => {
|
|
|
124
117
|
isInteractiveMock.mockReturnValue(false)
|
|
125
118
|
errorMock.mockClear()
|
|
126
119
|
logMock.mockClear()
|
|
127
|
-
clackLogErrorMock.mockClear()
|
|
128
120
|
clackNoteMock.mockClear()
|
|
129
121
|
clackIntroMock.mockClear()
|
|
130
122
|
printLogoMock.mockClear()
|
|
@@ -171,7 +163,7 @@ describe("reportDockerUnavailable", () => {
|
|
|
171
163
|
expect(logMock.mock.calls.some((call) => String(call[0]).includes("docker-desktop"))).toBe(true)
|
|
172
164
|
})
|
|
173
165
|
|
|
174
|
-
it("uses
|
|
166
|
+
it("uses Ink intro + note and themed error in interactive mode", () => {
|
|
175
167
|
isInteractiveMock.mockReturnValue(true)
|
|
176
168
|
|
|
177
169
|
reportDockerUnavailable(
|
|
@@ -185,20 +177,17 @@ describe("reportDockerUnavailable", () => {
|
|
|
185
177
|
|
|
186
178
|
expect(printLogoMock).toHaveBeenCalled()
|
|
187
179
|
expect(clackIntroMock).toHaveBeenCalledWith("Local development")
|
|
188
|
-
expect(
|
|
189
|
-
"Docker is installed but the daemon is not running.",
|
|
190
|
-
)
|
|
180
|
+
expect(logMock.mock.calls.some((call) => String(call[0]).includes("daemon is not running"))).toBe(true)
|
|
191
181
|
expect(clackNoteMock).toHaveBeenCalledWith(
|
|
192
182
|
expect.stringContaining("Unpause Docker Desktop"),
|
|
193
183
|
)
|
|
194
184
|
expect(errorMock).not.toHaveBeenCalled()
|
|
195
|
-
expect(logMock).not.toHaveBeenCalled()
|
|
196
185
|
})
|
|
197
186
|
})
|
|
198
187
|
|
|
199
188
|
describe("requireDockerDaemon", () => {
|
|
200
|
-
let exitMock:
|
|
201
|
-
let errorMock:
|
|
189
|
+
let exitMock: MockInstance<(code?: string | number | null | undefined) => never>
|
|
190
|
+
let errorMock: MockInstance<typeof console.error>
|
|
202
191
|
|
|
203
192
|
beforeEach(() => {
|
|
204
193
|
spawnSyncMock.mockReset()
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs"
|
|
3
|
+
import { join } from "node:path"
|
|
4
|
+
import { tmpdir } from "node:os"
|
|
5
|
+
import { ensureDevApiConfig } from "../src/ensure-dev-api-config.js"
|
|
6
|
+
|
|
7
|
+
describe("ensureDevApiConfig()", () => {
|
|
8
|
+
it("copies config/api-config.json when target is missing", () => {
|
|
9
|
+
const dir = mkdtempSync(join(tmpdir(), "supatype-api-config-"))
|
|
10
|
+
const configDir = join(dir, "config")
|
|
11
|
+
const template = join(configDir, "api-config.json")
|
|
12
|
+
const target = join(dir, ".supatype", "api-config.json")
|
|
13
|
+
|
|
14
|
+
mkdirSync(configDir, { recursive: true })
|
|
15
|
+
writeFileSync(template, '{"rest":{"schema":"public"}}\n', "utf8")
|
|
16
|
+
|
|
17
|
+
expect(ensureDevApiConfig(dir)).toBe(true)
|
|
18
|
+
expect(existsSync(target)).toBe(true)
|
|
19
|
+
expect(readFileSync(target, "utf8")).toContain('"rest"')
|
|
20
|
+
expect(ensureDevApiConfig(dir)).toBe(false)
|
|
21
|
+
})
|
|
22
|
+
})
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest"
|
|
2
|
+
import {
|
|
3
|
+
initDependencyVersionsFallback,
|
|
4
|
+
resolveInitDependencyVersions,
|
|
5
|
+
} from "../src/init-dependency-versions.js"
|
|
6
|
+
|
|
7
|
+
function mockRegistry(packages: Record<string, { latest: string; versions: string[] }>) {
|
|
8
|
+
vi.stubGlobal(
|
|
9
|
+
"fetch",
|
|
10
|
+
vi.fn(async (url: string) => {
|
|
11
|
+
const name = decodeURIComponent(url.replace("https://registry.npmjs.org/", ""))
|
|
12
|
+
const pkg = packages[name]
|
|
13
|
+
if (!pkg) return new Response(null, { status: 404 })
|
|
14
|
+
const versions = Object.fromEntries(pkg.versions.map((v) => [v, {}]))
|
|
15
|
+
return Response.json({ versions, "dist-tags": { latest: pkg.latest } })
|
|
16
|
+
}),
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
describe("resolveInitDependencyVersions", () => {
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
vi.unstubAllGlobals()
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it("uses the running CLI version when both packages publish it", async () => {
|
|
26
|
+
mockRegistry({
|
|
27
|
+
"@supatype/cli": { latest: "0.1.3", versions: ["0.1.1", "0.1.3"] },
|
|
28
|
+
"@supatype/types": { latest: "0.1.3", versions: ["0.1.1", "0.1.3"] },
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const deps = await resolveInitDependencyVersions()
|
|
32
|
+
expect(deps.cli).toBe("0.1.3")
|
|
33
|
+
expect(deps.types).toBe("0.1.3")
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it("falls back to npm latest when the running CLI version is unpublished", async () => {
|
|
37
|
+
mockRegistry({
|
|
38
|
+
"@supatype/cli": { latest: "0.1.1", versions: ["0.1.1"] },
|
|
39
|
+
"@supatype/types": { latest: "0.1.1", versions: ["0.1.1"] },
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
const deps = await resolveInitDependencyVersions()
|
|
43
|
+
expect(deps.cli).toBe("0.1.1")
|
|
44
|
+
expect(deps.types).toBe("0.1.1")
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it("can pin cli and types to different published versions", async () => {
|
|
48
|
+
mockRegistry({
|
|
49
|
+
"@supatype/cli": { latest: "0.1.3", versions: ["0.1.1", "0.1.3"] },
|
|
50
|
+
"@supatype/types": { latest: "0.1.1", versions: ["0.1.1"] },
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
const deps = await resolveInitDependencyVersions()
|
|
54
|
+
expect(deps.cli).toBe("0.1.3")
|
|
55
|
+
expect(deps.types).toBe("0.1.1")
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it("falls back to the running CLI version when the registry is unreachable", async () => {
|
|
59
|
+
vi.stubGlobal("fetch", vi.fn(async () => new Response(null, { status: 500 })))
|
|
60
|
+
expect(await resolveInitDependencyVersions()).toEqual(initDependencyVersionsFallback())
|
|
61
|
+
})
|
|
62
|
+
})
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
import { mergeSupatypePackageJson } from "../src/init-package-json.js"
|
|
3
|
+
|
|
4
|
+
describe("mergeSupatypePackageJson", () => {
|
|
5
|
+
it("adds Supatype deps and scripts without overwriting existing dev script", () => {
|
|
6
|
+
const merged = mergeSupatypePackageJson(
|
|
7
|
+
{ name: "existing", scripts: { dev: "next dev" } },
|
|
8
|
+
{ projectName: "existing", app: { mode: "none" }, helloFunction: false },
|
|
9
|
+
{ cli: "0.1.1", types: "0.1.1" },
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
expect(merged.dependencies?.["@supatype/cli"]).toBe("^0.1.1")
|
|
13
|
+
expect(merged.dependencies?.["@supatype/types"]).toBe("^0.1.1")
|
|
14
|
+
expect(merged.scripts?.dev).toBe("next dev")
|
|
15
|
+
expect(merged.scripts?.["supatype:dev"]).toBe("supatype dev")
|
|
16
|
+
expect(merged.scripts?.push).toBe("supatype push")
|
|
17
|
+
})
|
|
18
|
+
})
|
package/tests/init.test.ts
CHANGED
|
@@ -53,11 +53,15 @@ describe("scaffold()", () => {
|
|
|
53
53
|
expect(content).toContain("pkg-app")
|
|
54
54
|
})
|
|
55
55
|
|
|
56
|
-
it("
|
|
56
|
+
it("merges Supatype deps into package.json when it already exists", () => {
|
|
57
57
|
const pkgPath = join(tmpRoot, "package.json")
|
|
58
|
-
writeFileSync(pkgPath, '{"name":"existing"}', "utf8")
|
|
58
|
+
writeFileSync(pkgPath, '{"name":"existing","scripts":{"dev":"next dev"}}', "utf8")
|
|
59
59
|
scaffold(tmpRoot, defaultScaffoldOptions("my-app"))
|
|
60
|
-
|
|
60
|
+
const content = readFileSync(pkgPath, "utf8")
|
|
61
|
+
expect(content).toContain("@supatype/cli")
|
|
62
|
+
expect(content).toContain("@supatype/types")
|
|
63
|
+
expect(content).toContain("next dev")
|
|
64
|
+
expect(content).toContain("supatype:dev")
|
|
61
65
|
})
|
|
62
66
|
|
|
63
67
|
it("supatype.config.ts documents self-host workflow", () => {
|
|
@@ -185,6 +189,29 @@ describe("scaffold()", () => {
|
|
|
185
189
|
expect(html).toContain("github.com/supatype")
|
|
186
190
|
})
|
|
187
191
|
|
|
192
|
+
it("static app mode with Vite on self-host splits production static and local proxy override", () => {
|
|
193
|
+
scaffold(tmpRoot, {
|
|
194
|
+
...defaultScaffoldOptions("my-app", "self-host"),
|
|
195
|
+
domain: "api.example.com",
|
|
196
|
+
app: {
|
|
197
|
+
mode: "static",
|
|
198
|
+
staticDir: "./public",
|
|
199
|
+
viteDevUrl: "http://127.0.0.1:5173",
|
|
200
|
+
},
|
|
201
|
+
})
|
|
202
|
+
const committed = readFileSync(join(tmpRoot, "supatype.config.ts"), "utf8")
|
|
203
|
+
expect(committed).toContain('mode: "static"')
|
|
204
|
+
expect(committed).toContain('static_dir: "./dist"')
|
|
205
|
+
expect(committed).not.toContain("vite_dev_url")
|
|
206
|
+
|
|
207
|
+
const local = readFileSync(join(tmpRoot, "supatype.local.config.ts"), "utf8")
|
|
208
|
+
expect(local).toContain('mode: "proxy"')
|
|
209
|
+
expect(local).toContain('start: "vite"')
|
|
210
|
+
expect(local).toContain('vite_dev_url: "http://127.0.0.1:5173"')
|
|
211
|
+
expect(existsSync(join(tmpRoot, "dist/index.html"))).toBe(true)
|
|
212
|
+
expect(existsSync(join(tmpRoot, "vite.config.ts"))).toBe(true)
|
|
213
|
+
})
|
|
214
|
+
|
|
188
215
|
it("static app mode with Vite scaffolds root index.html and vite.config.ts", () => {
|
|
189
216
|
scaffold(tmpRoot, {
|
|
190
217
|
...defaultScaffoldOptions("my-app"),
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
import { mkdirSync, rmSync } from "node:fs"
|
|
3
|
+
import { join } from "node:path"
|
|
4
|
+
import { tmpdir } from "node:os"
|
|
5
|
+
import { requiredHostComponents } from "../src/required-host-components.js"
|
|
6
|
+
import type { SupatypeProjectConfig } from "../src/project-config.js"
|
|
7
|
+
|
|
8
|
+
function baseConfig(provider: "docker" | "native"): SupatypeProjectConfig {
|
|
9
|
+
return {
|
|
10
|
+
project: { name: "test" },
|
|
11
|
+
provider,
|
|
12
|
+
database: { provider },
|
|
13
|
+
server: { mode: "dev" },
|
|
14
|
+
app: { mode: "none" },
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe("requiredHostComponents", () => {
|
|
19
|
+
it("returns engine for docker (types + admin config on the host)", () => {
|
|
20
|
+
expect(requiredHostComponents(baseConfig("docker"))).toEqual(["engine"])
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it("returns engine for docker with overrides.engine", () => {
|
|
24
|
+
const config = baseConfig("docker")
|
|
25
|
+
config.overrides = { engine: "/path/to/engine" }
|
|
26
|
+
expect(requiredHostComponents(config)).toEqual(["engine"])
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it("returns native core binaries without functions/", () => {
|
|
30
|
+
const dir = join(tmpdir(), `supatype-req-host-${Date.now()}`)
|
|
31
|
+
mkdirSync(dir, { recursive: true })
|
|
32
|
+
expect(requiredHostComponents(baseConfig("native"), dir)).toEqual([
|
|
33
|
+
"engine",
|
|
34
|
+
"server",
|
|
35
|
+
"postgres",
|
|
36
|
+
])
|
|
37
|
+
rmSync(dir, { recursive: true, force: true })
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it("includes deno for native when functions/ exists", () => {
|
|
41
|
+
const dir = join(tmpdir(), `supatype-req-host-fn-${Date.now()}`)
|
|
42
|
+
mkdirSync(join(dir, "functions"), { recursive: true })
|
|
43
|
+
expect(requiredHostComponents(baseConfig("native"), dir)).toEqual([
|
|
44
|
+
"engine",
|
|
45
|
+
"server",
|
|
46
|
+
"postgres",
|
|
47
|
+
"deno",
|
|
48
|
+
])
|
|
49
|
+
rmSync(dir, { recursive: true, force: true })
|
|
50
|
+
})
|
|
51
|
+
})
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
import { mkdtempSync, writeFileSync } from "node:fs"
|
|
3
|
+
import { join } from "node:path"
|
|
4
|
+
import { tmpdir } from "node:os"
|
|
5
|
+
import { resolveProjectApiUrl } from "../src/resolve-api-url.js"
|
|
6
|
+
|
|
7
|
+
describe("resolveProjectApiUrl()", () => {
|
|
8
|
+
it("prefers PUBLIC_SUPATYPE_URL from .env (docker dev)", () => {
|
|
9
|
+
const cwd = mkdtempSync(join(tmpdir(), "supatype-api-url-"))
|
|
10
|
+
writeFileSync(
|
|
11
|
+
join(cwd, ".env"),
|
|
12
|
+
"PUBLIC_SUPATYPE_URL=http://localhost:18473\nPORT=54321\n",
|
|
13
|
+
"utf8",
|
|
14
|
+
)
|
|
15
|
+
expect(resolveProjectApiUrl(cwd)).toBe("http://localhost:18473")
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it("uses SUPATYPE_KONG_PORT when no URL env is set", () => {
|
|
19
|
+
const cwd = mkdtempSync(join(tmpdir(), "supatype-api-url-"))
|
|
20
|
+
writeFileSync(join(cwd, ".env"), "SUPATYPE_KONG_PORT=19200\nPORT=54321\n", "utf8")
|
|
21
|
+
expect(resolveProjectApiUrl(cwd)).toBe("http://localhost:19200")
|
|
22
|
+
})
|
|
23
|
+
})
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest"
|
|
2
|
+
|
|
3
|
+
vi.mock("../src/env-file.js", () => ({
|
|
4
|
+
readEnvValue: () => "test-service-role-key",
|
|
5
|
+
}))
|
|
6
|
+
|
|
7
|
+
vi.mock("../src/resolve-api-url.js", () => ({
|
|
8
|
+
resolveProjectApiUrl: () => "http://localhost:1234",
|
|
9
|
+
}))
|
|
10
|
+
|
|
11
|
+
describe("listRestCacheEntries", () => {
|
|
12
|
+
it("coerces null entries to an empty array", async () => {
|
|
13
|
+
const { listRestCacheEntries } = await import("../src/rest-cache-admin.js")
|
|
14
|
+
|
|
15
|
+
const originalFetch = globalThis.fetch
|
|
16
|
+
globalThis.fetch = vi.fn(async () =>
|
|
17
|
+
new Response(JSON.stringify({ entries: null, cursor: "0" }), { status: 200 }),
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const result = await listRestCacheEntries(process.cwd())
|
|
22
|
+
expect(result.entries).toEqual([])
|
|
23
|
+
expect(result.cursor).toBe("0")
|
|
24
|
+
} finally {
|
|
25
|
+
globalThis.fetch = originalFetch
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
})
|
|
@@ -115,7 +115,9 @@ describe("runtime contract", () => {
|
|
|
115
115
|
SUPATYPE_SERVER_IMAGE: "supatype/server:v0.1.0",
|
|
116
116
|
SUPATYPE_POSTGRES_IMAGE: "supatype/postgres:17-latest",
|
|
117
117
|
})
|
|
118
|
-
|
|
118
|
+
const withoutVersions = { ...baseConfig }
|
|
119
|
+
delete withoutVersions.versions
|
|
120
|
+
expect(composeDockerImageEnv(withoutVersions)).toEqual({})
|
|
119
121
|
expect(
|
|
120
122
|
composeDockerImageEnv({
|
|
121
123
|
...baseConfig,
|
|
@@ -483,9 +485,16 @@ export default defineConfig({
|
|
|
483
485
|
expect(compose).not.toContain("HTTPS is off")
|
|
484
486
|
})
|
|
485
487
|
|
|
488
|
+
it("self-host compose always includes Valkey and SUPATYPE_VALKEY_ADDR on server", () => {
|
|
489
|
+
const compose = renderSelfHostCompose(baseConfig)
|
|
490
|
+
expect(compose).toContain("\n valkey:\n")
|
|
491
|
+
expect(compose).toContain("valkey/valkey:8-alpine")
|
|
492
|
+
expect(compose).toContain("SUPATYPE_VALKEY_ADDR: valkey:6379")
|
|
493
|
+
expect(compose).toMatch(/^\s{2}valkey-data:/m)
|
|
494
|
+
})
|
|
495
|
+
|
|
486
496
|
it("self-host compose stays plain HTTP with a discoverable hint when TLS is off", () => {
|
|
487
497
|
const compose = renderSelfHostCompose(baseConfig)
|
|
488
|
-
expect(compose).not.toContain("\n valkey:\n")
|
|
489
498
|
expect(compose).not.toContain('- "443:8443"')
|
|
490
499
|
expect(compose).toContain("${SUPATYPE_KONG_PORT:-18473}:8000")
|
|
491
500
|
expect(compose).toContain("HTTPS is off")
|
|
@@ -496,7 +505,7 @@ export default defineConfig({
|
|
|
496
505
|
...baseConfig,
|
|
497
506
|
server: { mode: "standalone", domain: "api.example.com" },
|
|
498
507
|
})
|
|
499
|
-
expect(compose).
|
|
508
|
+
expect(compose).toContain("\n valkey:\n")
|
|
500
509
|
expect(compose).not.toContain('- "443:8443"')
|
|
501
510
|
})
|
|
502
511
|
|
package/tests/tsconfig.json
CHANGED
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"noEmit": true,
|
|
5
5
|
"composite": false,
|
|
6
|
-
"rootDir": "
|
|
6
|
+
"rootDir": "../.."
|
|
7
7
|
},
|
|
8
|
-
"include": [
|
|
8
|
+
"include": [
|
|
9
|
+
"./**/*.ts",
|
|
10
|
+
"../src/**/*.ts",
|
|
11
|
+
"../../studio/src/lib/normalize-admin-config.ts",
|
|
12
|
+
"../../studio/src/config.ts"
|
|
13
|
+
],
|
|
14
|
+
"exclude": ["engine-distribution.test.ts"]
|
|
9
15
|
}
|
package/tests/ui-confirm.test.ts
CHANGED
|
@@ -1,35 +1,39 @@
|
|
|
1
1
|
import { describe, expect, it, vi, beforeEach } from "vitest"
|
|
2
2
|
|
|
3
|
-
vi.
|
|
4
|
-
|
|
3
|
+
const confirmMock = vi.hoisted(() => vi.fn())
|
|
4
|
+
|
|
5
|
+
vi.mock("../src/ui/clack.js", () => ({
|
|
6
|
+
p: {
|
|
7
|
+
confirm: confirmMock,
|
|
8
|
+
cancel: vi.fn(() => process.exit(0)),
|
|
9
|
+
},
|
|
5
10
|
isCancel: vi.fn((v: unknown) => v === Symbol.for("cancel")),
|
|
6
|
-
|
|
11
|
+
CLACK_CANCEL: Symbol.for("cancel"),
|
|
7
12
|
}))
|
|
8
13
|
|
|
9
14
|
vi.mock("../src/ui/interactive.js", () => ({
|
|
10
15
|
isInteractive: vi.fn(() => true),
|
|
11
16
|
}))
|
|
12
17
|
|
|
13
|
-
import * as clack from "@clack/prompts"
|
|
14
18
|
import { confirm, logSkippedConfirm } from "../src/ui/confirm.js"
|
|
15
19
|
import { isInteractive } from "../src/ui/interactive.js"
|
|
16
20
|
|
|
17
21
|
describe("ui confirm", () => {
|
|
18
22
|
beforeEach(() => {
|
|
19
|
-
|
|
23
|
+
confirmMock.mockReset()
|
|
20
24
|
vi.mocked(isInteractive).mockReturnValue(true)
|
|
21
25
|
})
|
|
22
26
|
|
|
23
|
-
it("returns
|
|
24
|
-
|
|
27
|
+
it("returns ink confirm result in TTY mode", async () => {
|
|
28
|
+
confirmMock.mockResolvedValue(true)
|
|
25
29
|
await expect(confirm("Proceed?")).resolves.toBe(true)
|
|
26
|
-
expect(
|
|
30
|
+
expect(confirmMock).toHaveBeenCalledWith({ message: "Proceed?", initialValue: false })
|
|
27
31
|
})
|
|
28
32
|
|
|
29
33
|
it("uses nonInteractive fallback when not a TTY", async () => {
|
|
30
34
|
vi.mocked(isInteractive).mockReturnValue(false)
|
|
31
35
|
await expect(confirm("Proceed?", { nonInteractive: false })).resolves.toBe(false)
|
|
32
|
-
expect(
|
|
36
|
+
expect(confirmMock).not.toHaveBeenCalled()
|
|
33
37
|
})
|
|
34
38
|
|
|
35
39
|
it("logSkippedConfirm mentions --yes", () => {
|