@zitadel/cli 0.1.0-alpha.1 → 0.1.0-alpha.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/README.md +44 -29
- package/SKILLS.md +30 -13
- package/dist/commands/apply.mjs +4 -4
- package/dist/commands/doctor.mjs +54 -30
- package/dist/commands/doctor.mjs.map +1 -1
- package/dist/commands/eject.mjs +4 -4
- package/dist/commands/logs.mjs +3 -3
- package/dist/commands/logs.mjs.map +1 -1
- package/dist/commands/plan.mjs +4 -4
- package/dist/commands/reset.mjs +5 -6
- package/dist/commands/reset.mjs.map +1 -1
- package/dist/commands/setup.mjs +187 -23
- package/dist/commands/setup.mjs.map +1 -1
- package/dist/commands/start.mjs +13 -17
- package/dist/commands/start.mjs.map +1 -1
- package/dist/commands/status.mjs +15 -9
- package/dist/commands/status.mjs.map +1 -1
- package/dist/commands/stop.mjs +4 -5
- package/dist/commands/stop.mjs.map +1 -1
- package/dist/{docker-C0aVpJqm.mjs → docker-DrOBycgG.mjs} +6 -5
- package/dist/docker-DrOBycgG.mjs.map +1 -0
- package/dist/{oclif-DSPO9Sck.mjs → oclif-CqkWBQ7i.mjs} +89 -33
- package/dist/oclif-CqkWBQ7i.mjs.map +1 -0
- package/dist/{orca-DOxshV9n.mjs → orca-S1tVnngd.mjs} +38 -12
- package/dist/{orca-DOxshV9n.mjs.map → orca-S1tVnngd.mjs.map} +1 -1
- package/dist/{project-Dwb9WVAT.mjs → project-B6YfSaZw.mjs} +3 -3
- package/dist/{project-Dwb9WVAT.mjs.map → project-B6YfSaZw.mjs.map} +1 -1
- package/dist/{sync-DmtTYNmq.mjs → sync-DN4oNLVH.mjs} +3 -3
- package/dist/{sync-DmtTYNmq.mjs.map → sync-DN4oNLVH.mjs.map} +1 -1
- package/oclif.manifest.json +7 -1
- package/package.json +3 -3
- package/dist/docker-C0aVpJqm.mjs.map +0 -1
- package/dist/oclif-DSPO9Sck.mjs.map +0 -1
package/dist/commands/start.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as metadataFromStart, i as ensureImage, l as startContainer, n as currentUser, s as inspectContainer, u as stopAndRemoveContainer } from "../docker-
|
|
1
|
+
import { E as ZitadelError, a as DEFAULT_LOCAL_SERVER_PORT, b as writeRuntimeMetadata, c as checkLocalServerHealth, d as ensureLocalState, h as localServerUrl, l as defaultLocalServerImageForCliVersion, p as localContainerName, t as BaseCommand, u as ensureContainerIdentity, x as publicCliCommand } from "../oclif-CqkWBQ7i.mjs";
|
|
2
|
+
import { c as metadataFromStart, i as ensureImage, l as startContainer, n as currentUser, s as inspectContainer, u as stopAndRemoveContainer } from "../docker-DrOBycgG.mjs";
|
|
3
3
|
import { Flags } from "@oclif/core";
|
|
4
4
|
import { setTimeout } from "node:timers/promises";
|
|
5
5
|
//#region src/commands/start.ts
|
|
@@ -22,7 +22,7 @@ var Start = class Start extends BaseCommand {
|
|
|
22
22
|
source: serverUrl
|
|
23
23
|
});
|
|
24
24
|
validatePort(port);
|
|
25
|
-
const image = flags.image ?? this.meta.env.ZITADEL_LOCAL_IMAGE ??
|
|
25
|
+
const image = flags.image ?? this.meta.env.ZITADEL_LOCAL_IMAGE ?? defaultLocalServerImageForCliVersion(this.meta.cliVersion);
|
|
26
26
|
const containerName = localContainerName(this.meta.cwd);
|
|
27
27
|
if (this.meta.dryRun) return this.emit({
|
|
28
28
|
status: "ok",
|
|
@@ -38,12 +38,12 @@ var Start = class Start extends BaseCommand {
|
|
|
38
38
|
console: `${serverUrl}/ui/console/`,
|
|
39
39
|
login: `${serverUrl}/ui/login/`
|
|
40
40
|
},
|
|
41
|
-
next_commands: ["
|
|
41
|
+
next_commands: [publicCliCommand("start", this.meta.cliVersion)]
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
const paths = await ensureLocalState(this.meta.cwd);
|
|
45
45
|
const existing = await inspectContainer(containerName);
|
|
46
|
-
if (existing.exists && existing.running && await checkLocalServerHealth(serverUrl)) {
|
|
46
|
+
if (existing.exists && existing.running && existing.image === image && await checkLocalServerHealth(serverUrl)) {
|
|
47
47
|
const metadata = metadataFromStart({
|
|
48
48
|
cwdDataDir: paths.dataDir,
|
|
49
49
|
cliVersion: this.meta.cliVersion,
|
|
@@ -56,7 +56,7 @@ var Start = class Start extends BaseCommand {
|
|
|
56
56
|
await writeRuntimeMetadata(this.meta.cwd, metadata);
|
|
57
57
|
return this.emit({
|
|
58
58
|
status: "ok",
|
|
59
|
-
data: readyData(metadata, true)
|
|
59
|
+
data: readyData(metadata, true, this.meta.cliVersion)
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
if (existing.exists) await stopAndRemoveContainer(containerName);
|
|
@@ -68,7 +68,7 @@ var Start = class Start extends BaseCommand {
|
|
|
68
68
|
dataDir: paths.dataDir,
|
|
69
69
|
identity: await ensureContainerIdentity(this.meta.cwd, currentUser())
|
|
70
70
|
});
|
|
71
|
-
await waitForHealth(serverUrl, containerName);
|
|
71
|
+
await waitForHealth(serverUrl, containerName, this.meta.cliVersion);
|
|
72
72
|
const metadata = metadataFromStart({
|
|
73
73
|
cwdDataDir: paths.dataDir,
|
|
74
74
|
cliVersion: this.meta.cliVersion,
|
|
@@ -81,11 +81,11 @@ var Start = class Start extends BaseCommand {
|
|
|
81
81
|
await writeRuntimeMetadata(this.meta.cwd, metadata);
|
|
82
82
|
return this.emit({
|
|
83
83
|
status: "ok",
|
|
84
|
-
data: readyData(metadata, false)
|
|
84
|
+
data: readyData(metadata, false, this.meta.cliVersion)
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
|
-
function readyData(metadata, alreadyRunning) {
|
|
88
|
+
function readyData(metadata, alreadyRunning, cliVersion) {
|
|
89
89
|
return {
|
|
90
90
|
title: alreadyRunning ? "Local Zitadel server is already running." : "Local Zitadel server is ready.",
|
|
91
91
|
runtime: {
|
|
@@ -100,15 +100,11 @@ function readyData(metadata, alreadyRunning) {
|
|
|
100
100
|
console: `${metadata.server_url}/ui/console/`,
|
|
101
101
|
login: `${metadata.server_url}/ui/login/`
|
|
102
102
|
},
|
|
103
|
-
next_actions: ["
|
|
104
|
-
next_commands: [
|
|
105
|
-
"npx @zitadel/cli@alpha setup --framework next --server local",
|
|
106
|
-
"npm install",
|
|
107
|
-
"npm run dev"
|
|
108
|
-
]
|
|
103
|
+
next_actions: ["From your app directory, run setup; the CLI will detect the framework or ask when needed.", "Setup installs dependencies when needed; then start your app dev server."],
|
|
104
|
+
next_commands: [publicCliCommand("setup --server local", cliVersion)]
|
|
109
105
|
};
|
|
110
106
|
}
|
|
111
|
-
async function waitForHealth(serverUrl, containerName) {
|
|
107
|
+
async function waitForHealth(serverUrl, containerName, cliVersion) {
|
|
112
108
|
const started = Date.now();
|
|
113
109
|
while (Date.now() - started < START_TIMEOUT_MS) {
|
|
114
110
|
if (await checkLocalServerHealth(serverUrl, 1e3)) return;
|
|
@@ -116,7 +112,7 @@ async function waitForHealth(serverUrl, containerName) {
|
|
|
116
112
|
}
|
|
117
113
|
throw new ZitadelError("E_NETWORK", "Local Zitadel server did not become healthy", {
|
|
118
114
|
hint: "Inspect the container logs, then reset the local runtime if needed.",
|
|
119
|
-
nextCommands: ["
|
|
115
|
+
nextCommands: [publicCliCommand("logs", cliVersion), publicCliCommand("reset --force", cliVersion)],
|
|
120
116
|
details: {
|
|
121
117
|
container_name: containerName,
|
|
122
118
|
server_url: serverUrl
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.mjs","names":["sleep"],"sources":["../../src/commands/start.ts"],"sourcesContent":["import { setTimeout as sleep } from \"node:timers/promises\";\n\nimport { Flags } from \"@oclif/core\";\n\nimport {
|
|
1
|
+
{"version":3,"file":"start.mjs","names":["sleep"],"sources":["../../src/commands/start.ts"],"sourcesContent":["import { setTimeout as sleep } from \"node:timers/promises\";\n\nimport { Flags } from \"@oclif/core\";\n\nimport { ZitadelError } from \"../lib/errors\";\nimport {\n currentUser,\n ensureImage,\n inspectContainer,\n metadataFromStart,\n startContainer,\n stopAndRemoveContainer,\n} from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_PORT,\n checkLocalServerHealth,\n defaultLocalServerImageForCliVersion,\n ensureContainerIdentity,\n ensureLocalState,\n localContainerName,\n localServerUrl,\n writeRuntimeMetadata,\n} from \"../lib/local-server/runtime\";\nimport { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport { publicCliCommand } from \"../lib/public-cli\";\n\nconst START_TIMEOUT_MS = 90_000;\n\nexport default class Start extends BaseCommand {\n static override description = \"Start a local Zitadel server.\";\n static override flags = {\n image: Flags.string({ description: \"Container image to run.\" }),\n port: Flags.integer({ description: \"Local HTTP port.\", default: DEFAULT_LOCAL_SERVER_PORT }),\n };\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Start);\n const port = flags.port ?? DEFAULT_LOCAL_SERVER_PORT;\n const serverUrl = localServerUrl(port);\n await this.toMeta(flags, { resolveServer: false, source: serverUrl });\n\n validatePort(port);\n const image =\n flags.image ??\n this.meta.env.ZITADEL_LOCAL_IMAGE ??\n defaultLocalServerImageForCliVersion(this.meta.cliVersion);\n const containerName = localContainerName(this.meta.cwd);\n if (this.meta.dryRun) {\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server start plan.\",\n runtime: {\n container_name: containerName,\n image,\n port,\n },\n urls: {\n api: serverUrl,\n console: `${serverUrl}/ui/console/`,\n login: `${serverUrl}/ui/login/`,\n },\n next_commands: [publicCliCommand(\"start\", this.meta.cliVersion)],\n },\n });\n }\n\n const paths = await ensureLocalState(this.meta.cwd);\n\n const existing = await inspectContainer(containerName);\n if (\n existing.exists &&\n existing.running &&\n existing.image === image &&\n (await checkLocalServerHealth(serverUrl))\n ) {\n const metadata = metadataFromStart({\n cwdDataDir: paths.dataDir,\n cliVersion: this.meta.cliVersion,\n containerName,\n containerId: existing.id ?? containerName,\n image,\n port,\n serverUrl,\n });\n await writeRuntimeMetadata(this.meta.cwd, metadata);\n return this.emit({\n status: \"ok\",\n data: readyData(metadata, true, this.meta.cliVersion),\n });\n }\n\n if (existing.exists) {\n await stopAndRemoveContainer(containerName);\n }\n\n await ensureImage(image);\n const containerId = await startContainer({\n containerName,\n image,\n port,\n dataDir: paths.dataDir,\n identity: await ensureContainerIdentity(this.meta.cwd, currentUser()),\n });\n await waitForHealth(serverUrl, containerName, this.meta.cliVersion);\n\n const metadata = metadataFromStart({\n cwdDataDir: paths.dataDir,\n cliVersion: this.meta.cliVersion,\n containerName,\n containerId,\n image,\n port,\n serverUrl,\n });\n await writeRuntimeMetadata(this.meta.cwd, metadata);\n return this.emit({\n status: \"ok\",\n data: readyData(metadata, false, this.meta.cliVersion),\n });\n }\n}\n\nfunction readyData(\n metadata: ReturnType<typeof metadataFromStart>,\n alreadyRunning: boolean,\n cliVersion: string,\n) {\n return {\n title: alreadyRunning\n ? \"Local Zitadel server is already running.\"\n : \"Local Zitadel server is ready.\",\n runtime: {\n container_name: metadata.container_name,\n container_id: metadata.container_id,\n image: metadata.image,\n port: metadata.port,\n data_dir: metadata.data_dir,\n },\n urls: {\n api: metadata.server_url,\n console: `${metadata.server_url}/ui/console/`,\n login: `${metadata.server_url}/ui/login/`,\n },\n next_actions: [\n \"From your app directory, run setup; the CLI will detect the framework or ask when needed.\",\n \"Setup installs dependencies when needed; then start your app dev server.\",\n ],\n next_commands: [publicCliCommand(\"setup --server local\", cliVersion)],\n };\n}\n\nasync function waitForHealth(\n serverUrl: string,\n containerName: string,\n cliVersion: string,\n): Promise<void> {\n const started = Date.now();\n while (Date.now() - started < START_TIMEOUT_MS) {\n if (await checkLocalServerHealth(serverUrl, 1000)) {\n return;\n }\n await sleep(1000);\n }\n throw new ZitadelError(\"E_NETWORK\", \"Local Zitadel server did not become healthy\", {\n hint: \"Inspect the container logs, then reset the local runtime if needed.\",\n nextCommands: [\n publicCliCommand(\"logs\", cliVersion),\n publicCliCommand(\"reset --force\", cliVersion),\n ],\n details: { container_name: containerName, server_url: serverUrl },\n });\n}\n\nfunction validatePort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new ZitadelError(\"E_VALIDATION\", `Invalid port ${String(port)}`, {\n hint: \"Use a TCP port between 1 and 65535.\",\n });\n }\n}\n"],"mappings":"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"}
|
package/dist/commands/status.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as readZitadelConfig, n as hasZitadelSecret, o as readZitadelSecret, r as readDevelopmentIssuer, t as hasZitadelConfig } from "../project-
|
|
3
|
-
import { s as inspectContainer } from "../docker-
|
|
1
|
+
import { c as checkLocalServerHealth, g as readRuntimeMetadata, p as localContainerName, t as BaseCommand, x as publicCliCommand, y as runtimeSummary } from "../oclif-CqkWBQ7i.mjs";
|
|
2
|
+
import { a as readZitadelConfig, n as hasZitadelSecret, o as readZitadelSecret, r as readDevelopmentIssuer, t as hasZitadelConfig } from "../project-B6YfSaZw.mjs";
|
|
3
|
+
import { s as inspectContainer } from "../docker-DrOBycgG.mjs";
|
|
4
4
|
//#region src/commands/status.ts
|
|
5
5
|
/**
|
|
6
6
|
* `zitadel status` — summarize the local server and project state.
|
|
@@ -31,7 +31,8 @@ var Status = class Status extends BaseCommand {
|
|
|
31
31
|
const healthy = runtime ? await checkLocalServerHealth(runtime.server_url) : false;
|
|
32
32
|
const serverLifecycle = runtime ? docker?.running && healthy ? "running" : docker?.exists ? "unhealthy" : "stopped" : "missing";
|
|
33
33
|
const project = await projectStatus(cwd);
|
|
34
|
-
const nextCommands = nextCommandsFor(serverLifecycle, project.lifecycle);
|
|
34
|
+
const nextCommands = nextCommandsFor(serverLifecycle, project.lifecycle, this.meta.cliVersion);
|
|
35
|
+
const nextActions = nextActionsFor(project.lifecycle);
|
|
35
36
|
return this.emit({
|
|
36
37
|
status: "ok",
|
|
37
38
|
data: {
|
|
@@ -51,6 +52,7 @@ var Status = class Status extends BaseCommand {
|
|
|
51
52
|
}
|
|
52
53
|
},
|
|
53
54
|
project,
|
|
55
|
+
next_actions: nextActions,
|
|
54
56
|
next_commands: nextCommands
|
|
55
57
|
}
|
|
56
58
|
});
|
|
@@ -74,12 +76,16 @@ async function projectStatus(cwd) {
|
|
|
74
76
|
issuer: readDevelopmentIssuer(config)
|
|
75
77
|
};
|
|
76
78
|
}
|
|
77
|
-
function
|
|
79
|
+
function nextActionsFor(projectLifecycle) {
|
|
80
|
+
if (projectLifecycle === "not-configured") return ["From your app directory, run setup; the CLI will detect the framework or ask in an empty directory."];
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
function nextCommandsFor(serverLifecycle, projectLifecycle, cliVersion) {
|
|
78
84
|
const commands = [];
|
|
79
|
-
if (serverLifecycle !== "running") commands.push("
|
|
80
|
-
if (projectLifecycle === "not-configured") commands.push("
|
|
81
|
-
else if (projectLifecycle === "orphaned-config") commands.push("
|
|
82
|
-
else commands.push("
|
|
85
|
+
if (serverLifecycle !== "running") commands.push(publicCliCommand("start", cliVersion));
|
|
86
|
+
if (projectLifecycle === "not-configured") commands.push(publicCliCommand("setup --server local", cliVersion));
|
|
87
|
+
else if (projectLifecycle === "orphaned-config") commands.push(publicCliCommand("setup --force", cliVersion), publicCliCommand("doctor --fix", cliVersion));
|
|
88
|
+
else commands.push(publicCliCommand("doctor", cliVersion), publicCliCommand("apply", cliVersion));
|
|
83
89
|
return commands;
|
|
84
90
|
}
|
|
85
91
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.mjs","names":[],"sources":["../../src/commands/status.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"status.mjs","names":[],"sources":["../../src/commands/status.ts"],"sourcesContent":["import { inspectContainer } from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_URL,\n checkLocalServerHealth,\n localContainerName,\n readRuntimeMetadata,\n runtimeSummary,\n} from \"../lib/local-server/runtime\";\nimport { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport {\n hasZitadelConfig,\n hasZitadelSecret,\n readDevelopmentIssuer,\n readZitadelConfig,\n readZitadelSecret,\n} from \"../lib/project\";\nimport { publicCliCommand } from \"../lib/public-cli\";\n\n/**\n * `zitadel status` — summarize the local server and project state.\n *\n * This is intentionally informational: a missing `zitadel.json`, stopped\n * local server, or orphaned config should be visible without making `status`\n * itself fail.\n */\nexport default class Status extends BaseCommand {\n static override description = \"Summarize the local Zitadel server and project state.\";\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Status);\n const runtime = await readRuntimeMetadata(flags.cwd ? String(flags.cwd) : process.cwd());\n if (flags.server === \"local\") {\n await this.toMeta(flags, {\n resolveServer: false,\n source: runtime?.server_url ?? DEFAULT_LOCAL_SERVER_URL,\n });\n } else {\n await this.toMeta(flags);\n }\n const { cwd } = this.meta;\n\n const containerName = runtime?.container_name ?? localContainerName(cwd);\n let docker: Awaited<ReturnType<typeof inspectContainer>> | undefined;\n let dockerError: string | undefined;\n try {\n docker = await inspectContainer(containerName);\n } catch (error) {\n dockerError = error instanceof Error ? error.message : String(error);\n }\n const healthy = runtime ? await checkLocalServerHealth(runtime.server_url) : false;\n const serverLifecycle = runtime\n ? docker?.running && healthy\n ? \"running\"\n : docker?.exists\n ? \"unhealthy\"\n : \"stopped\"\n : \"missing\";\n\n const project = await projectStatus(cwd);\n const nextCommands = nextCommandsFor(serverLifecycle, project.lifecycle, this.meta.cliVersion);\n const nextActions = nextActionsFor(project.lifecycle);\n\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Zitadel status.\",\n server: {\n lifecycle: serverLifecycle,\n runtime: runtimeSummary(runtime),\n docker: {\n available: dockerError === undefined,\n error: dockerError,\n container_exists: docker?.exists ?? false,\n container_running: docker?.running ?? false,\n },\n health: {\n healthy,\n url: runtime?.server_url,\n },\n },\n project,\n next_actions: nextActions,\n next_commands: nextCommands,\n },\n });\n }\n}\n\ntype ProjectStatus =\n | {\n lifecycle: \"not-configured\";\n message: string;\n }\n | {\n lifecycle: \"orphaned-config\";\n project_id?: string;\n message: string;\n }\n | {\n lifecycle: \"configured\";\n project_id: string;\n issuer?: string;\n };\n\nasync function projectStatus(cwd: string): Promise<ProjectStatus> {\n if (!(await hasZitadelConfig(cwd))) {\n return {\n lifecycle: \"not-configured\",\n message: \"zitadel.json has not been created yet.\",\n };\n }\n\n const config = await readZitadelConfig(cwd);\n if (!(await hasZitadelSecret(cwd))) {\n return {\n lifecycle: \"orphaned-config\",\n project_id: typeof config.project === \"string\" ? config.project : undefined,\n message: \"zitadel.json exists but .zitadel/secret is missing.\",\n };\n }\n\n const secret = await readZitadelSecret(cwd);\n return {\n lifecycle: \"configured\",\n project_id: String(config.project ?? secret.project_id ?? \"\"),\n issuer: readDevelopmentIssuer(config),\n };\n}\n\nfunction nextActionsFor(projectLifecycle: ProjectStatus[\"lifecycle\"]): string[] {\n if (projectLifecycle === \"not-configured\") {\n return [\n \"From your app directory, run setup; the CLI will detect the framework or ask in an empty directory.\",\n ];\n }\n return [];\n}\n\nfunction nextCommandsFor(\n serverLifecycle: string,\n projectLifecycle: ProjectStatus[\"lifecycle\"],\n cliVersion: string,\n): string[] {\n const commands: string[] = [];\n if (serverLifecycle !== \"running\") {\n commands.push(publicCliCommand(\"start\", cliVersion));\n }\n if (projectLifecycle === \"not-configured\") {\n commands.push(publicCliCommand(\"setup --server local\", cliVersion));\n } else if (projectLifecycle === \"orphaned-config\") {\n commands.push(\n publicCliCommand(\"setup --force\", cliVersion),\n publicCliCommand(\"doctor --fix\", cliVersion),\n );\n } else {\n commands.push(publicCliCommand(\"doctor\", cliVersion), publicCliCommand(\"apply\", cliVersion));\n }\n return commands;\n}\n"],"mappings":";;;;;;;;;;;AAyBA,IAAqB,SAArB,MAAqB,eAAe,YAAY;CAC9C,OAAgB,cAAc;CAE9B,MAAM,MAA6B;EACjC,MAAM,EAAE,UAAU,MAAM,KAAK,MAAM,OAAO;EAC1C,MAAM,UAAU,MAAM,oBAAoB,MAAM,MAAM,OAAO,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC;AACxF,MAAI,MAAM,WAAW,QACnB,OAAM,KAAK,OAAO,OAAO;GACvB,eAAe;GACf,QAAQ,SAAS,cAAA;GAClB,CAAC;MAEF,OAAM,KAAK,OAAO,MAAM;EAE1B,MAAM,EAAE,QAAQ,KAAK;EAErB,MAAM,gBAAgB,SAAS,kBAAkB,mBAAmB,IAAI;EACxE,IAAI;EACJ,IAAI;AACJ,MAAI;AACF,YAAS,MAAM,iBAAiB,cAAc;WACvC,OAAO;AACd,iBAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;EAEtE,MAAM,UAAU,UAAU,MAAM,uBAAuB,QAAQ,WAAW,GAAG;EAC7E,MAAM,kBAAkB,UACpB,QAAQ,WAAW,UACjB,YACA,QAAQ,SACN,cACA,YACJ;EAEJ,MAAM,UAAU,MAAM,cAAc,IAAI;EACxC,MAAM,eAAe,gBAAgB,iBAAiB,QAAQ,WAAW,KAAK,KAAK,WAAW;EAC9F,MAAM,cAAc,eAAe,QAAQ,UAAU;AAErD,SAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,QAAQ;KACN,WAAW;KACX,SAAS,eAAe,QAAQ;KAChC,QAAQ;MACN,WAAW,gBAAgB,KAAA;MAC3B,OAAO;MACP,kBAAkB,QAAQ,UAAU;MACpC,mBAAmB,QAAQ,WAAW;MACvC;KACD,QAAQ;MACN;MACA,KAAK,SAAS;MACf;KACF;IACD;IACA,cAAc;IACd,eAAe;IAChB;GACF,CAAC;;;AAoBN,eAAe,cAAc,KAAqC;AAChE,KAAI,CAAE,MAAM,iBAAiB,IAAI,CAC/B,QAAO;EACL,WAAW;EACX,SAAS;EACV;CAGH,MAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,KAAI,CAAE,MAAM,iBAAiB,IAAI,CAC/B,QAAO;EACL,WAAW;EACX,YAAY,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAA;EAClE,SAAS;EACV;CAGH,MAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAO;EACL,WAAW;EACX,YAAY,OAAO,OAAO,WAAW,OAAO,cAAc,GAAG;EAC7D,QAAQ,sBAAsB,OAAO;EACtC;;AAGH,SAAS,eAAe,kBAAwD;AAC9E,KAAI,qBAAqB,iBACvB,QAAO,CACL,sGACD;AAEH,QAAO,EAAE;;AAGX,SAAS,gBACP,iBACA,kBACA,YACU;CACV,MAAM,WAAqB,EAAE;AAC7B,KAAI,oBAAoB,UACtB,UAAS,KAAK,iBAAiB,SAAS,WAAW,CAAC;AAEtD,KAAI,qBAAqB,iBACvB,UAAS,KAAK,iBAAiB,wBAAwB,WAAW,CAAC;UAC1D,qBAAqB,kBAC9B,UAAS,KACP,iBAAiB,iBAAiB,WAAW,EAC7C,iBAAiB,gBAAgB,WAAW,CAC7C;KAED,UAAS,KAAK,iBAAiB,UAAU,WAAW,EAAE,iBAAiB,SAAS,WAAW,CAAC;AAE9F,QAAO"}
|
package/dist/commands/stop.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { u as stopAndRemoveContainer } from "../docker-
|
|
1
|
+
import { g as readRuntimeMetadata, p as localContainerName, t as BaseCommand, x as publicCliCommand } from "../oclif-CqkWBQ7i.mjs";
|
|
2
|
+
import { u as stopAndRemoveContainer } from "../docker-DrOBycgG.mjs";
|
|
3
3
|
//#region src/commands/stop.ts
|
|
4
4
|
var Stop = class Stop extends BaseCommand {
|
|
5
5
|
static description = "Stop the local Zitadel server.";
|
|
@@ -20,7 +20,7 @@ var Stop = class Stop extends BaseCommand {
|
|
|
20
20
|
data_preserved: true,
|
|
21
21
|
data_dir: runtime?.data_dir
|
|
22
22
|
},
|
|
23
|
-
next_commands: ["
|
|
23
|
+
next_commands: [publicCliCommand("stop", this.meta.cliVersion)]
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
26
|
await stopAndRemoveContainer(containerName);
|
|
@@ -32,8 +32,7 @@ var Stop = class Stop extends BaseCommand {
|
|
|
32
32
|
container_name: containerName,
|
|
33
33
|
data_preserved: true,
|
|
34
34
|
data_dir: runtime?.data_dir
|
|
35
|
-
}
|
|
36
|
-
next_commands: ["zitadel start", "zitadel reset --force"]
|
|
35
|
+
}
|
|
37
36
|
}
|
|
38
37
|
});
|
|
39
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.mjs","names":[],"sources":["../../src/commands/stop.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"stop.mjs","names":[],"sources":["../../src/commands/stop.ts"],"sourcesContent":["import { stopAndRemoveContainer } from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_URL,\n localContainerName,\n readRuntimeMetadata,\n} from \"../lib/local-server/runtime\";\nimport { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport { publicCliCommand } from \"../lib/public-cli\";\n\nexport default class Stop extends BaseCommand {\n static override description = \"Stop the local Zitadel server.\";\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Stop);\n const runtime = await readRuntimeMetadata(flags.cwd ? String(flags.cwd) : process.cwd());\n await this.toMeta(flags, {\n resolveServer: false,\n source: runtime?.server_url ?? DEFAULT_LOCAL_SERVER_URL,\n });\n\n const containerName = runtime?.container_name ?? localContainerName(this.meta.cwd);\n if (this.meta.dryRun) {\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server stop plan.\",\n runtime: {\n container_name: containerName,\n data_preserved: true,\n data_dir: runtime?.data_dir,\n },\n next_commands: [publicCliCommand(\"stop\", this.meta.cliVersion)],\n },\n });\n }\n\n await stopAndRemoveContainer(containerName);\n\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server stopped.\",\n runtime: {\n container_name: containerName,\n data_preserved: true,\n data_dir: runtime?.data_dir,\n },\n },\n });\n }\n}\n"],"mappings":";;;AASA,IAAqB,OAArB,MAAqB,aAAa,YAAY;CAC5C,OAAgB,cAAc;CAE9B,MAAM,MAA6B;EACjC,MAAM,EAAE,UAAU,MAAM,KAAK,MAAM,KAAK;EACxC,MAAM,UAAU,MAAM,oBAAoB,MAAM,MAAM,OAAO,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC;AACxF,QAAM,KAAK,OAAO,OAAO;GACvB,eAAe;GACf,QAAQ,SAAS,cAAA;GAClB,CAAC;EAEF,MAAM,gBAAgB,SAAS,kBAAkB,mBAAmB,KAAK,KAAK,IAAI;AAClF,MAAI,KAAK,KAAK,OACZ,QAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,SAAS;KACP,gBAAgB;KAChB,gBAAgB;KAChB,UAAU,SAAS;KACpB;IACD,eAAe,CAAC,iBAAiB,QAAQ,KAAK,KAAK,WAAW,CAAC;IAChE;GACF,CAAC;AAGJ,QAAM,uBAAuB,cAAc;AAE3C,SAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,SAAS;KACP,gBAAgB;KAChB,gBAAgB;KAChB,UAAU,SAAS;KACpB;IACF;GACF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { E as ZitadelError, i as CONTAINER_HTTP_PORT, r as CONTAINER_DATA_DIR } from "./oclif-CqkWBQ7i.mjs";
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
3
|
//#region src/lib/local-server/docker.ts
|
|
4
4
|
function dockerRunArgs(spec) {
|
|
@@ -116,18 +116,19 @@ async function inspectContainer(containerName) {
|
|
|
116
116
|
const result = await runDocker([
|
|
117
117
|
"inspect",
|
|
118
118
|
"--format",
|
|
119
|
-
"{{.Id}} {{.State.Running}}",
|
|
119
|
+
"{{.Id}} {{.State.Running}} {{.Config.Image}}",
|
|
120
120
|
containerName
|
|
121
121
|
]);
|
|
122
122
|
if (result.status !== 0) return {
|
|
123
123
|
exists: false,
|
|
124
124
|
running: false
|
|
125
125
|
};
|
|
126
|
-
const [id, running] = result.stdout.trim().split(/\s+/);
|
|
126
|
+
const [id, running, ...imageParts] = result.stdout.trim().split(/\s+/);
|
|
127
127
|
return {
|
|
128
128
|
exists: true,
|
|
129
129
|
running: running === "true",
|
|
130
|
-
id
|
|
130
|
+
id,
|
|
131
|
+
image: imageParts.join(" ")
|
|
131
132
|
};
|
|
132
133
|
}
|
|
133
134
|
async function startContainer(spec) {
|
|
@@ -206,4 +207,4 @@ function dockerError(action, args, cause) {
|
|
|
206
207
|
//#endregion
|
|
207
208
|
export { followContainerLogs as a, metadataFromStart as c, ensureImage as i, startContainer as l, currentUser as n, imageAvailable as o, dockerAvailable as r, inspectContainer as s, containerLogs as t, stopAndRemoveContainer as u };
|
|
208
209
|
|
|
209
|
-
//# sourceMappingURL=docker-
|
|
210
|
+
//# sourceMappingURL=docker-DrOBycgG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-DrOBycgG.mjs","names":[],"sources":["../src/lib/local-server/docker.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\n\nimport { ZitadelError } from \"../errors\";\nimport {\n CONTAINER_DATA_DIR,\n CONTAINER_HTTP_PORT,\n type ContainerIdentity,\n type RuntimeMetadata,\n} from \"./runtime\";\n\nexport type DockerResult = {\n status: number;\n stdout: string;\n stderr: string;\n};\n\nexport type DockerRunSpec = {\n containerName: string;\n image: string;\n port: number;\n dataDir: string;\n identity?: ContainerIdentity;\n};\n\nexport function dockerRunArgs(spec: DockerRunSpec): string[] {\n const args = [\n \"run\",\n \"--detach\",\n \"--name\",\n spec.containerName,\n \"--publish\",\n `127.0.0.1:${spec.port}:${CONTAINER_HTTP_PORT}`,\n \"--volume\",\n `${spec.dataDir}:${CONTAINER_DATA_DIR}`,\n \"--env\",\n `NEXTGEN_SERVER_ADDRESS=:${CONTAINER_HTTP_PORT}`,\n \"--env\",\n `NEXTGEN_SERVER_DATA_DIR=${CONTAINER_DATA_DIR}`,\n ];\n\n if (spec.identity) {\n args.push(\n \"--volume\",\n `${spec.identity.passwdFile}:/etc/passwd:ro`,\n \"--volume\",\n `${spec.identity.groupFile}:/etc/group:ro`,\n \"--user\",\n `${spec.identity.uid}:${spec.identity.gid}`,\n );\n }\n\n args.push(spec.image);\n return args;\n}\n\nexport async function runDocker(args: string[]): Promise<DockerResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"docker\", args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({ status: code ?? 1, stdout, stderr });\n });\n });\n}\n\nexport async function streamDocker(args: string[]): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"docker\", args, {\n stdio: \"inherit\",\n env: process.env,\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`docker ${args.join(\" \")} exited with status ${code ?? 1}`));\n }\n });\n });\n}\n\nexport async function dockerAvailable(): Promise<DockerResult> {\n return runDocker([\"version\", \"--format\", \"{{.Server.Version}}\"]);\n}\n\nexport async function pullImage(image: string): Promise<void> {\n await requireDocker([\"pull\", \"--quiet\", image], `Pull Docker image ${image}`);\n}\n\nexport async function imageExists(image: string): Promise<boolean> {\n let result: DockerResult;\n const args = [\"image\", \"inspect\", image];\n try {\n result = await runDocker(args);\n } catch (error) {\n throw dockerError(`Inspect Docker image ${image}`, args, error);\n }\n return result.status === 0;\n}\n\nexport async function imageAvailable(image: string): Promise<\"local\" | \"remote\"> {\n if (await imageExists(image)) {\n return \"local\";\n }\n\n const args = [\"manifest\", \"inspect\", image];\n let result: DockerResult;\n try {\n result = await runDocker(args);\n } catch (error) {\n throw dockerError(`Inspect Docker image ${image}`, args, error);\n }\n if (result.status === 0) {\n return \"remote\";\n }\n throw dockerError(`Inspect Docker image ${image}`, args, result);\n}\n\nexport async function ensureImage(image: string): Promise<\"local\" | \"pulled\"> {\n if (await imageExists(image)) {\n return \"local\";\n }\n await pullImage(image);\n return \"pulled\";\n}\n\nexport async function inspectContainer(containerName: string): Promise<{\n exists: boolean;\n running: boolean;\n id?: string;\n image?: string;\n}> {\n const result = await runDocker([\n \"inspect\",\n \"--format\",\n \"{{.Id}} {{.State.Running}} {{.Config.Image}}\",\n containerName,\n ]);\n if (result.status !== 0) {\n return { exists: false, running: false };\n }\n const [id, running, ...imageParts] = result.stdout.trim().split(/\\s+/);\n return { exists: true, running: running === \"true\", id, image: imageParts.join(\" \") };\n}\n\nexport async function startContainer(spec: DockerRunSpec): Promise<string> {\n const args = dockerRunArgs(spec);\n const result = await requireDocker(args, \"Start local Zitadel container\");\n return result.stdout.trim();\n}\n\nexport async function stopAndRemoveContainer(containerName: string): Promise<void> {\n const inspect = await inspectContainer(containerName);\n if (!inspect.exists) {\n return;\n }\n if (inspect.running) {\n await requireDocker([\"stop\", containerName], `Stop ${containerName}`);\n }\n await requireDocker([\"rm\", containerName], `Remove ${containerName}`);\n}\n\nexport async function containerLogs(containerName: string, tail: number): Promise<string> {\n const result = await requireDocker([\"logs\", \"--tail\", String(tail), containerName], \"Read logs\");\n return result.stdout;\n}\n\nexport async function followContainerLogs(containerName: string, tail: number): Promise<void> {\n await streamDocker([\"logs\", \"--tail\", String(tail), \"--follow\", containerName]);\n}\n\nexport function currentUser(): { uid?: number; gid?: number } {\n const getuid = process.getuid;\n const getgid = process.getgid;\n if (typeof getuid !== \"function\") {\n return {};\n }\n const uid = getuid();\n const gid = typeof getgid === \"function\" ? getgid() : uid;\n return { uid, gid };\n}\n\nexport function metadataFromStart(input: {\n cwdDataDir: string;\n cliVersion: string;\n containerName: string;\n containerId: string;\n image: string;\n port: number;\n serverUrl: string;\n}): RuntimeMetadata {\n return {\n schema_version: 1,\n container_name: input.containerName,\n container_id: input.containerId,\n image: input.image,\n port: input.port,\n server_url: input.serverUrl,\n data_dir: input.cwdDataDir,\n created_at: new Date().toISOString(),\n cli_version: input.cliVersion,\n };\n}\n\nexport async function requireDocker(args: string[], action: string): Promise<DockerResult> {\n let result: DockerResult;\n try {\n result = await runDocker(args);\n } catch (error) {\n throw dockerError(action, args, error);\n }\n if (result.status !== 0) {\n throw dockerError(action, args, result);\n }\n return result;\n}\n\nfunction dockerError(action: string, args: string[], cause: unknown): ZitadelError {\n const details =\n cause && typeof cause === \"object\" && \"stderr\" in cause\n ? { command: [\"docker\", ...args], stderr: String((cause as { stderr?: unknown }).stderr) }\n : { command: [\"docker\", ...args], cause };\n return new ZitadelError(\"E_VALIDATION\", `${action} failed`, {\n hint: \"Check that Docker is installed, running, and reachable from this shell.\",\n nextCommands: [\"zitadel doctor\"],\n details,\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Command, Flags } from "@oclif/core";
|
|
2
2
|
import consola from "consola";
|
|
3
|
-
import { access, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
4
|
-
import { join, resolve } from "node:path";
|
|
5
3
|
import { ApiError } from "@zitadel/api/runtime/fetch";
|
|
4
|
+
import { stringify } from "safe-stable-stringify";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
import { access, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
6
7
|
import { createHash } from "node:crypto";
|
|
7
8
|
import { constants } from "node:fs";
|
|
8
9
|
import { createServer } from "node:net";
|
|
9
|
-
import { stringify } from "safe-stable-stringify";
|
|
10
10
|
//#region src/lib/errors.ts
|
|
11
11
|
/**
|
|
12
12
|
* Maps each {@link ZitadelErrorCode} to the process exit code the CLI
|
|
@@ -148,8 +148,50 @@ function isObject(value) {
|
|
|
148
148
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
149
149
|
}
|
|
150
150
|
//#endregion
|
|
151
|
+
//#region src/lib/paths.ts
|
|
152
|
+
/**
|
|
153
|
+
* Resolve the working directory the CLI should operate against, defaulting to
|
|
154
|
+
* the process CWD when no `--cwd` override is given. Always returns an
|
|
155
|
+
* absolute path so downstream `join`/`readFile` calls are unaffected by later
|
|
156
|
+
* `process.chdir` or relative-path ambiguity.
|
|
157
|
+
*/
|
|
158
|
+
function resolveCwd(cwd) {
|
|
159
|
+
return resolve(cwd ?? process.cwd());
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Sentinel comment stamped at the top of every file the CLI generates and
|
|
163
|
+
* owns. Commands like `doctor` and `eject` look for this marker to decide
|
|
164
|
+
* whether a file is safe to touch; the trailing `v1` lets the format evolve
|
|
165
|
+
* without mistaking newer managed files for hand-edited ones.
|
|
166
|
+
*/
|
|
167
|
+
const MANAGED_MARKER = "// zitadel-cli: managed-file v1";
|
|
168
|
+
//#endregion
|
|
169
|
+
//#region src/lib/public-cli.ts
|
|
170
|
+
const CLI_PACKAGE_NAME = "@zitadel/cli";
|
|
171
|
+
function npmDistTagForCliVersion(cliVersion) {
|
|
172
|
+
return cliVersion.trim().replace(/^v/, "").match(/^\d+\.\d+\.\d+-([0-9A-Za-z][0-9A-Za-z-]*)/)?.[1] ?? "latest";
|
|
173
|
+
}
|
|
174
|
+
function npmSelectorForCliVersion(cliVersion) {
|
|
175
|
+
const normalized = cliVersion.trim().replace(/^v/, "");
|
|
176
|
+
if (/^\d+\.\d+\.\d+-alpha\.\d+$/.test(normalized)) return normalized;
|
|
177
|
+
return npmDistTagForCliVersion(normalized);
|
|
178
|
+
}
|
|
179
|
+
function publicCliCommand(args, cliVersion) {
|
|
180
|
+
const prefix = `npx ${CLI_PACKAGE_NAME}@${npmSelectorForCliVersion(cliVersion)}`;
|
|
181
|
+
return args.length > 0 ? `${prefix} ${args}` : prefix;
|
|
182
|
+
}
|
|
183
|
+
function normalizePublicCliCommand(command, cliVersion) {
|
|
184
|
+
if (command === "zitadel") return publicCliCommand("", cliVersion);
|
|
185
|
+
if (command.startsWith("zitadel ")) return publicCliCommand(command.slice(8), cliVersion);
|
|
186
|
+
return command;
|
|
187
|
+
}
|
|
188
|
+
function normalizePublicCliCommands(commands, cliVersion) {
|
|
189
|
+
return commands?.map((command) => normalizePublicCliCommand(command, cliVersion));
|
|
190
|
+
}
|
|
191
|
+
//#endregion
|
|
151
192
|
//#region src/lib/local-server/runtime.ts
|
|
152
|
-
const
|
|
193
|
+
const LOCAL_SERVER_IMAGE_NAME = "ghcr.io/zitadel/nextgen";
|
|
194
|
+
const DEFAULT_LOCAL_SERVER_IMAGE = `${LOCAL_SERVER_IMAGE_NAME}:latest`;
|
|
153
195
|
const DEFAULT_LOCAL_SERVER_PORT = 8080;
|
|
154
196
|
const DEFAULT_LOCAL_SERVER_URL = "http://localhost:8080";
|
|
155
197
|
const LOCAL_RUNTIME_DIR = ".zitadel/local";
|
|
@@ -174,6 +216,11 @@ function localContainerName(cwd) {
|
|
|
174
216
|
function localServerUrl(port) {
|
|
175
217
|
return `http://localhost:${port}`;
|
|
176
218
|
}
|
|
219
|
+
function defaultLocalServerImageForCliVersion(cliVersion) {
|
|
220
|
+
const normalized = cliVersion.trim().replace(/^v/, "");
|
|
221
|
+
if (/^\d+\.\d+\.\d+-alpha\.\d+$/.test(normalized)) return `${LOCAL_SERVER_IMAGE_NAME}:${normalized}`;
|
|
222
|
+
return DEFAULT_LOCAL_SERVER_IMAGE;
|
|
223
|
+
}
|
|
177
224
|
async function ensureLocalState(cwd) {
|
|
178
225
|
const paths = localRuntimePaths(cwd);
|
|
179
226
|
await mkdir(paths.dataDir, {
|
|
@@ -422,24 +469,6 @@ function readEnvServer(config, environment) {
|
|
|
422
469
|
return typeof branch.server === "string" ? branch.server : void 0;
|
|
423
470
|
}
|
|
424
471
|
//#endregion
|
|
425
|
-
//#region src/lib/paths.ts
|
|
426
|
-
/**
|
|
427
|
-
* Resolve the working directory the CLI should operate against, defaulting to
|
|
428
|
-
* the process CWD when no `--cwd` override is given. Always returns an
|
|
429
|
-
* absolute path so downstream `join`/`readFile` calls are unaffected by later
|
|
430
|
-
* `process.chdir` or relative-path ambiguity.
|
|
431
|
-
*/
|
|
432
|
-
function resolveCwd(cwd) {
|
|
433
|
-
return resolve(cwd ?? process.cwd());
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* Sentinel comment stamped at the top of every file the CLI generates and
|
|
437
|
-
* owns. Commands like `doctor` and `eject` look for this marker to decide
|
|
438
|
-
* whether a file is safe to touch; the trailing `v1` lets the format evolve
|
|
439
|
-
* without mistaking newer managed files for hand-edited ones.
|
|
440
|
-
*/
|
|
441
|
-
const MANAGED_MARKER = "// zitadel-cli: managed-file v1";
|
|
442
|
-
//#endregion
|
|
443
472
|
//#region src/lib/oclif/base.ts
|
|
444
473
|
/**
|
|
445
474
|
* Base class for every oclif command. Owns the global flags, builds the
|
|
@@ -530,8 +559,9 @@ var BaseCommand = class extends Command {
|
|
|
530
559
|
* envelope so oclif's `--json` path serialises it.
|
|
531
560
|
*/
|
|
532
561
|
emit(result) {
|
|
533
|
-
|
|
534
|
-
|
|
562
|
+
const normalized = normalizeCommandResult(result, this.meta);
|
|
563
|
+
this.log(renderPretty(normalized, this.meta));
|
|
564
|
+
return toEnvelope(normalized, this.meta);
|
|
535
565
|
}
|
|
536
566
|
/**
|
|
537
567
|
* Renders any thrown error as the failure envelope and exits with its code.
|
|
@@ -546,7 +576,7 @@ var BaseCommand = class extends Command {
|
|
|
546
576
|
};
|
|
547
577
|
const zitadelError = toZitadelError(error);
|
|
548
578
|
if (this.jsonEnabled()) this.logJson(toErrorEnvelope(zitadelError, meta));
|
|
549
|
-
else this.logToStderr(renderError(zitadelError));
|
|
579
|
+
else this.logToStderr(renderError(zitadelError, meta));
|
|
550
580
|
return this.exit(zitadelError.exitCode);
|
|
551
581
|
}
|
|
552
582
|
/**
|
|
@@ -570,6 +600,24 @@ var BaseCommand = class extends Command {
|
|
|
570
600
|
};
|
|
571
601
|
}
|
|
572
602
|
};
|
|
603
|
+
function normalizeCommandResult(result, meta) {
|
|
604
|
+
if (result.status === "ok") return {
|
|
605
|
+
...result,
|
|
606
|
+
data: normalizeDataNextCommands(result.data, meta)
|
|
607
|
+
};
|
|
608
|
+
return {
|
|
609
|
+
...result,
|
|
610
|
+
data: normalizeDataNextCommands(result.data, meta),
|
|
611
|
+
nextCommands: normalizePublicCliCommands(result.nextCommands, meta.cliVersion)
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
function normalizeDataNextCommands(data, meta) {
|
|
615
|
+
if (!isObject(data) || !Array.isArray(data.next_commands)) return data;
|
|
616
|
+
return {
|
|
617
|
+
...data,
|
|
618
|
+
next_commands: data.next_commands.map((command) => typeof command === "string" ? normalizePublicCliCommand(command, meta.cliVersion) : command)
|
|
619
|
+
};
|
|
620
|
+
}
|
|
573
621
|
/** Wraps a {@link CommandResult} with the invocation metadata into the final envelope. */
|
|
574
622
|
function toEnvelope(result, meta) {
|
|
575
623
|
const base = {
|
|
@@ -601,7 +649,7 @@ function toErrorEnvelope(error, meta) {
|
|
|
601
649
|
code: error.code,
|
|
602
650
|
message: error.message,
|
|
603
651
|
hint: error.hint,
|
|
604
|
-
next_commands: error.nextCommands,
|
|
652
|
+
next_commands: normalizePublicCliCommands(error.nextCommands, meta.cliVersion),
|
|
605
653
|
details: error.details
|
|
606
654
|
};
|
|
607
655
|
}
|
|
@@ -625,12 +673,13 @@ function renderPretty(result, meta) {
|
|
|
625
673
|
* Renders a {@link ZitadelError} as a human-readable block for stderr: the
|
|
626
674
|
* coded message, an optional hint, and any suggested next commands.
|
|
627
675
|
*/
|
|
628
|
-
function renderError(error) {
|
|
676
|
+
function renderError(error, meta) {
|
|
629
677
|
const lines = [`Error ${error.code}: ${error.message}`];
|
|
630
678
|
if (error.hint) lines.push(error.hint);
|
|
631
|
-
|
|
679
|
+
const nextCommands = normalizePublicCliCommands(error.nextCommands, meta.cliVersion);
|
|
680
|
+
if (nextCommands && nextCommands.length > 0) {
|
|
632
681
|
lines.push("Next:");
|
|
633
|
-
for (const cmd of
|
|
682
|
+
for (const cmd of nextCommands) lines.push(` $ ${cmd}`);
|
|
634
683
|
}
|
|
635
684
|
return lines.join("\n");
|
|
636
685
|
}
|
|
@@ -659,9 +708,16 @@ function formatData(data, warnings, opts) {
|
|
|
659
708
|
for (const cmd of data.next_commands) lines.push(` $ ${String(cmd)}`);
|
|
660
709
|
}
|
|
661
710
|
}
|
|
662
|
-
for (const warning of warnings) lines.push(`Warning: ${warning}`);
|
|
711
|
+
for (const warning of warnings.filter((warning) => !warningRenderedInChecks(data, warning))) lines.push(`Warning: ${warning}`);
|
|
663
712
|
return lines.join("\n");
|
|
664
713
|
}
|
|
714
|
+
function warningRenderedInChecks(data, warning) {
|
|
715
|
+
if (!isObject(data) || !Array.isArray(data.checks)) return false;
|
|
716
|
+
return data.checks.some((check) => {
|
|
717
|
+
if (!isObject(check) || check.status !== "warn") return false;
|
|
718
|
+
return warning === `${String(check.name ?? "check")}: ${String(check.message ?? "")}`;
|
|
719
|
+
});
|
|
720
|
+
}
|
|
665
721
|
function renderKnownSections(lines, data) {
|
|
666
722
|
if (isObject(data.project)) {
|
|
667
723
|
const project = data.project;
|
|
@@ -689,7 +745,7 @@ function renderKnownSections(lines, data) {
|
|
|
689
745
|
lines.push("Checks:");
|
|
690
746
|
for (const check of data.checks) {
|
|
691
747
|
if (!isObject(check)) continue;
|
|
692
|
-
const status = check.status === "pass" ? "ok" : "fail";
|
|
748
|
+
const status = check.status === "pass" ? "ok" : check.status === "warn" ? "warn" : "fail";
|
|
693
749
|
lines.push(` [${status}] ${String(check.name ?? "check")}: ${String(check.message ?? "")}`);
|
|
694
750
|
}
|
|
695
751
|
}
|
|
@@ -708,6 +764,6 @@ function suffixBlock(opts) {
|
|
|
708
764
|
return suffix ? ` ${suffix}` : "";
|
|
709
765
|
}
|
|
710
766
|
//#endregion
|
|
711
|
-
export {
|
|
767
|
+
export { isObject as C, ZitadelError as E, MANAGED_MARKER as S, stableStringify as T, removeLocalData as _, DEFAULT_LOCAL_SERVER_PORT as a, writeRuntimeMetadata as b, checkLocalServerHealth as c, ensureLocalState as d, isPortAvailable as f, readRuntimeMetadata as g, localServerUrl as h, CONTAINER_HTTP_PORT as i, defaultLocalServerImageForCliVersion as l, localRuntimePaths as m, DEFAULT_SERVER as n, DEFAULT_LOCAL_SERVER_URL as o, localContainerName as p, CONTAINER_DATA_DIR as r, assertWritableDirectory as s, BaseCommand as t, ensureContainerIdentity as u, removeRuntimeMetadata as v, parseJsonObject as w, publicCliCommand as x, runtimeSummary as y };
|
|
712
768
|
|
|
713
|
-
//# sourceMappingURL=oclif-
|
|
769
|
+
//# sourceMappingURL=oclif-CqkWBQ7i.mjs.map
|