ensure-running 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +355 -0
- package/dist/bin/ensure-running.js +959 -0
- package/dist/bin/ensure-running.js.map +1 -0
- package/dist/index.cjs +1184 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +356 -0
- package/dist/index.d.ts +356 -0
- package/dist/index.js +1112 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/docker/utils/Exec.ts","../../src/services/docker/utils/Spawn.ts","../../src/services/docker/utils/Sleep.ts","../../src/services/docker/utils/Timeout.ts","../../src/services/docker/utils/Which.ts","../../src/services/docker/utils/Poll.ts","../../src/services/docker/utils/Retry.ts","../../src/services/docker/utils/index.ts","../../src/cli/Cli.ts","../../src/core/argv/Argv.ts","../../src/core/service/DefineEnsureService.ts","../../src/core/registry/ServiceRegistry.ts","../../src/core/runner/Runner.ts","../../src/services/docker/commands/Commands.ts","../../src/services/docker/detect/Detect.ts","../../src/services/docker/errors/Errors.ts","../../src/services/docker/logger/Logger.ts","../../src/services/docker/platforms/Platforms.ts","../../src/services/docker/process/Process.ts","../../src/services/docker/types/Types.ts","../../src/services/docker/wait/Wait.ts","../../src/services/docker/ensure/Ensure.ts","../../src/services/docker/service/DockerService.ts","../../src/services/LoadCustomServices.ts","../../src/services/AssertEnsureService.ts","../../src/services/CreateServiceRegistry.ts","../../src/bin/ensure-running.ts"],"sourcesContent":["import { execFile as nodeExecFile } from \"node:child_process\";\n\n/**\n * Result of a successful command execution.\n */\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n}\n\n/**\n * Runs a command and returns stdout/stderr on success.\n *\n * @param command Executable name or path.\n * @param args Command arguments.\n * @returns Captured stdout and stderr.\n */\nexport async function exec(command: string, args: string[] = []): Promise<ExecResult> {\n return new Promise((resolve, reject) => {\n nodeExecFile(\n command,\n args,\n {\n encoding: \"utf8\",\n windowsHide: true\n },\n (err, stdout, stderr) => {\n if (err) {\n reject(err);\n\n return;\n }\n\n resolve({\n stdout: String(stdout ?? \"\"),\n stderr: String(stderr ?? \"\")\n });\n }\n );\n });\n}\n\n/**\n * Runs a command via shell (for builtins like `command -v`).\n *\n * @param shellCommand Full shell command string.\n * @returns Captured stdout and stderr.\n */\nexport async function execShell(shellCommand: string): Promise<ExecResult> {\n const shell = process.platform === \"win32\" ? \"cmd.exe\" : \"/bin/sh\";\n const shellFlag = process.platform === \"win32\" ? \"/c\" : \"-c\";\n\n return exec(shell, [shellFlag, shellCommand]);\n}\n","import { spawn as nodeSpawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\n\n/**\n * Options for spawning a detached background process.\n */\nexport interface SpawnDetachedOptions {\n detached?: boolean;\n stdio?: SpawnOptions[\"stdio\"];\n windowsHide?: boolean;\n}\n\n/**\n * Spawns a child process.\n *\n * @param command Executable.\n * @param args Arguments.\n * @param options Spawn options.\n * @returns Child process handle.\n */\nexport function spawn(\n command: string,\n args: string[] = [],\n options: SpawnDetachedOptions = {}\n): ChildProcess {\n return nodeSpawn(command, args, {\n detached: options.detached ?? false,\n stdio: options.stdio ?? \"ignore\",\n windowsHide: options.windowsHide ?? true\n });\n}\n\n/**\n * Spawns a detached background process and unrefs it from the event loop.\n *\n * @param command Executable.\n * @param args Arguments.\n * @returns Child process handle.\n */\nexport function spawnDetached(command: string, args: string[] = []): ChildProcess {\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\"\n });\n\n child.unref();\n\n return child;\n}\n","/**\n * Resolves after the given number of milliseconds.\n *\n * @param ms Delay in milliseconds.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","/**\n * Rejects if the promise does not settle before the timeout.\n *\n * @param promise Promise to race.\n * @param timeoutMs Timeout in milliseconds.\n * @param message Optional rejection message.\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n message = \"Operation timed out\"\n): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new Error(message));\n }, timeoutMs);\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n","import { exec, execShell } from \"./Exec\";\n\n/**\n * Locates an executable on PATH for the current platform.\n *\n * @param command Command name to find.\n * @returns Absolute path if found, otherwise undefined.\n */\nexport async function which(command: string): Promise<string | undefined> {\n try {\n if (process.platform === \"win32\") {\n const result = await exec(\"where.exe\", [command]);\n const firstLine = result.stdout.split(/\\r?\\n/).find((line) => line.trim().length > 0);\n\n return firstLine?.trim();\n }\n\n try {\n const result = await exec(\"which\", [command]);\n const path = result.stdout.trim();\n\n return path.length > 0 ? path : undefined;\n } catch {\n const result = await execShell(`command -v ${command}`);\n const path = result.stdout.trim();\n\n return path.length > 0 ? path : undefined;\n }\n } catch {\n return undefined;\n }\n}\n\n/**\n * Returns whether a command exists on PATH.\n *\n * @param command Command name.\n */\nexport async function commandExists(command: string): Promise<boolean> {\n const path = await which(command);\n\n return path !== undefined;\n}\n","import { sleep } from \"./Sleep\";\n\n/**\n * Options for polling until a condition is met.\n */\nexport interface PollOptions {\n timeout: number;\n interval: number;\n}\n\n/**\n * Polls until `predicate` returns true or timeout is reached.\n *\n * @param predicate Async condition to evaluate each tick.\n * @param options Timeout and interval in ms.\n * @returns True if predicate succeeded before timeout.\n */\nexport async function poll(\n predicate: () => Promise<boolean>,\n options: PollOptions\n): Promise<boolean> {\n const deadline = Date.now() + options.timeout;\n\n while (Date.now() < deadline) {\n if (await predicate()) {\n return true;\n }\n\n const remaining = deadline - Date.now();\n\n if (remaining <= 0) {\n break;\n }\n\n await sleep(Math.min(options.interval, remaining));\n }\n\n return false;\n}\n","import { sleep } from \"./Sleep\";\n\n/**\n * Options for retrying an async operation.\n */\nexport interface RetryOptions {\n attempts: number;\n delayMs: number;\n}\n\n/**\n * Retries an async function until it succeeds or attempts are exhausted.\n *\n * @param fn Function to retry.\n * @param options Attempt count and delay between retries.\n * @returns Result of the successful invocation.\n */\nexport async function retry<T>(fn: () => Promise<T>, options: RetryOptions): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= options.attempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n\n if (attempt < options.attempts) {\n await sleep(options.delayMs);\n }\n }\n }\n\n throw lastError;\n}\n","export { exec, execShell } from \"./Exec\";\nexport type { ExecResult } from \"./Exec\";\nexport { spawn, spawnDetached } from \"./Spawn\";\nexport type { SpawnDetachedOptions } from \"./Spawn\";\nexport { sleep } from \"./Sleep\";\nexport { withTimeout } from \"./Timeout\";\nexport { which, commandExists } from \"./Which\";\nexport { poll } from \"./Poll\";\nexport type { PollOptions } from \"./Poll\";\nexport { retry } from \"./Retry\";\nexport type { RetryOptions } from \"./Retry\";\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n normalizeArgv,\n parseInvocation,\n runInvocation,\n type EnsureService,\n type ServiceRegistry\n} from \"../core\";\n\nimport { createServiceRegistry } from \"../services/CreateServiceRegistry\";\n\n/**\n * Global CLI modes.\n */\nexport enum CliMode {\n HELP = \"HELP\",\n VERSION = \"VERSION\",\n RUN = \"RUN\"\n}\n\nexport { createServiceRegistry };\n\n/**\n * Reads the package version from package.json.\n */\nexport function readPackageVersion(): string {\n const packageJsonPath = fileURLToPath(new URL(\"../../package.json\", import.meta.url));\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version: string };\n\n return packageJson.version;\n}\n\n/**\n * Prints top-level CLI usage.\n */\nexport function printCliHelp(registry: ServiceRegistry): void {\n const serviceLines = registry\n .list()\n .map((service) => ` ${service.id.padEnd(10)} ${getServiceSummary(service)}`)\n .join(\"\\n\");\n\n console.log(`Usage: ensure-running | er [service [flags...]]... [--] [command...]\n\nEnsure local services are ready, then optionally run a command.\n\nServices:\n${serviceLines}\n\nCustom services:\n Place files in .er/services/ with export default defineEnsureService({ ... })\n\nExamples:\n er docker\n er docker --check\n er docker postgres -- vite dev\n er docker --timeout 60000 -- npm test\n\nUse \"--\" to separate services from the command you want to run.\n\nGlobal options:\n -h, --help Show this help message\n -v, --version Print CLI version\n service --help Show service-specific help`);\n}\n\n/**\n * Runs the ensure-running CLI.\n */\nexport async function runCli(argv: string[], registry?: ServiceRegistry): Promise<number> {\n const resolvedRegistry = registry ?? await createServiceRegistry();\n const normalized = normalizeArgv(argv);\n\n if (normalized.length === 0 || normalized[0] === \"-h\" || normalized[0] === \"--help\") {\n printCliHelp(resolvedRegistry);\n\n return 0;\n }\n\n if (normalized[0] === \"-v\" || normalized[0] === \"--version\") {\n console.log(readPackageVersion());\n\n return 0;\n }\n\n if (normalized.length >= 2 && (normalized[1] === \"--help\" || normalized[1] === \"-h\")) {\n const service = resolvedRegistry.resolve(normalized[0] ?? \"\");\n\n if (service?.printHelp !== undefined) {\n service.printHelp();\n\n return 0;\n }\n }\n\n try {\n const invocation = parseInvocation(normalized, resolvedRegistry);\n\n if (invocation.services.length === 0 && invocation.command === undefined) {\n printCliHelp(resolvedRegistry);\n\n return 1;\n }\n\n return await runInvocation(invocation);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n\n console.error(message);\n printCliHelp(resolvedRegistry);\n\n return 1;\n }\n}\n\nfunction getServiceSummary(service: EnsureService): string {\n if (service.id === \"docker\") {\n return \"Ensure Docker CLI is installed and the daemon is ready\";\n }\n\n return \"Ensure service is ready\";\n}\n","/**\n * Strips node, runner, and script path tokens from raw {@link process.argv}.\n */\nexport function normalizeArgv(argv: string[]): string[] {\n const prefix = argv.slice(0, Math.min(argv.length, 4));\n let scriptIndex = -1;\n\n for (let index = 0; index < prefix.length; index++) {\n const arg = prefix[index] ?? \"\";\n\n if (arg.endsWith(\".ts\")) {\n scriptIndex = index;\n }\n }\n\n if (scriptIndex === -1) {\n for (let index = 0; index < prefix.length; index++) {\n const arg = prefix[index] ?? \"\";\n\n if (\n (arg.endsWith(\".mjs\") || arg.endsWith(\".cjs\") || arg.endsWith(\".js\"))\n && (arg.includes(\"/\") || arg.includes(\"\\\\\"))\n ) {\n scriptIndex = index;\n }\n }\n }\n\n if (scriptIndex >= 0) {\n return argv.slice(scriptIndex + 1);\n }\n\n if (\n argv.length >= 2\n && (argv[0].includes(\"node\") || argv[0].endsWith(\"node.exe\"))\n ) {\n return argv.slice(2);\n }\n\n return [...argv];\n}\n","import type { EnsureService } from \"./Service\";\n\n/**\n * Defines an ensure service with compile-time shape checking.\n *\n * Use in `.er/services` files:\n *\n * ```ts\n * export default defineEnsureService({\n * id: \"postgres\",\n * parseArgs(argv) { return { options: {}, remaining: argv }; },\n * async run() { return 0; }\n * });\n * ```\n */\nexport function defineEnsureService<TOptions = unknown>(\n service: EnsureService<TOptions>\n): EnsureService<TOptions> {\n return service;\n}\n","import type { EnsureService } from \"../service\";\n\n/**\n * Registry of ensure services addressable from the CLI.\n */\nexport class ServiceRegistry {\n private readonly services = new Map<string, EnsureService>();\n\n /**\n * Registers a service by id and optional aliases.\n */\n register(service: EnsureService): void {\n this.services.set(service.id, service);\n\n for (const alias of service.aliases ?? []) {\n this.services.set(alias, service);\n }\n }\n\n /**\n * Resolves a service by id or alias.\n */\n resolve(name: string): EnsureService | undefined {\n return this.services.get(name);\n }\n\n /**\n * Returns registered services without alias duplicates.\n */\n list(): EnsureService[] {\n const seen = new Set<EnsureService>();\n\n for (const service of this.services.values()) {\n seen.add(service);\n }\n\n return [...seen];\n }\n}\n","import { spawn } from \"node:child_process\";\n\nimport { normalizeArgv } from \"../argv\";\nimport type { EnsureService } from \"../service\";\nimport type { ServiceRegistry } from \"../registry\";\n\n/** Separator between service chain and trailing command. */\nexport const CommandSeparator = \"--\";\n\n/**\n * Thrown when argv tokens appear after services without {@link CommandSeparator}.\n */\nexport class CommandSeparatorError extends Error {\n constructor(token: string) {\n super(\n `Unexpected argument \"${token}\". Use \"${CommandSeparator}\" before the command (e.g. er docker postgres ${CommandSeparator} vite dev).`\n );\n this.name = \"CommandSeparatorError\";\n }\n}\n\n/**\n * Thrown when {@link CommandSeparator} is present without a trailing command.\n */\nexport class MissingCommandError extends Error {\n constructor() {\n super(`Command separator \"${CommandSeparator}\" must be followed by a command.`);\n this.name = \"MissingCommandError\";\n }\n}\n\n/**\n * One service invocation parsed from argv.\n */\nexport interface ServiceInvocation {\n service: EnsureService;\n options: unknown;\n}\n\n/**\n * Parsed ensure-running CLI invocation.\n */\nexport interface ParsedInvocation {\n services: ServiceInvocation[];\n command?: string[];\n}\n\n/**\n * Parses argv into chained service invocations and an optional trailing command.\n * A trailing command requires an explicit {@link CommandSeparator} after services.\n */\nexport function parseInvocation(argv: string[], registry: ServiceRegistry): ParsedInvocation {\n let remaining = normalizeArgv(argv);\n const services: ServiceInvocation[] = [];\n\n while (remaining.length > 0) {\n const service = registry.resolve(remaining[0] ?? \"\");\n\n if (service === undefined) {\n break;\n }\n\n remaining = remaining.slice(1);\n const parsed = service.parseArgs(remaining);\n\n services.push({\n service,\n options: parsed.options\n });\n remaining = parsed.remaining;\n }\n\n let command: string[] | undefined;\n\n if (remaining.length === 0) {\n command = undefined;\n } else\n if (remaining[0] === CommandSeparator) {\n command = remaining.slice(1);\n\n if (command.length === 0) {\n throw new MissingCommandError();\n }\n } else {\n throw new CommandSeparatorError(remaining[0] ?? \"\");\n }\n\n return {\n services,\n command\n };\n}\n\n/**\n * Ensures all services in order, then optionally runs a command.\n */\nexport async function runInvocation(invocation: ParsedInvocation): Promise<number> {\n for (const entry of invocation.services) {\n const exitCode = await entry.service.run(entry.options);\n\n if (exitCode !== 0) {\n return exitCode;\n }\n }\n\n if (invocation.command === undefined) {\n return 0;\n }\n\n return runCommand(invocation.command);\n}\n\n/**\n * Spawns a command with inherited stdio.\n */\nexport function runCommand(command: string[]): Promise<number> {\n const [executable, ...args] = command;\n\n if (executable === undefined) {\n return Promise.resolve(1);\n }\n\n return new Promise((resolve) => {\n const child = spawn(executable, args, {\n stdio: \"inherit\",\n shell: process.platform === \"win32\"\n });\n\n child.on(\"error\", () => {\n resolve(1);\n });\n\n child.on(\"close\", (code) => {\n resolve(code ?? 1);\n });\n });\n}\n","import { exec, which } from \"../utils\";\n\nconst DockerCliVersionPattern = /Docker version\\s+([^\\s,]+)/i;\n\n/**\n * Parses `docker --version` stdout into a semver-like client version string.\n *\n * @param stdout Raw stdout from `docker --version`.\n */\nexport function parseDockerCliVersion(stdout: string): string | undefined {\n const match = stdout.match(DockerCliVersionPattern);\n\n return match?.[1];\n}\n\n/**\n * Resolves the docker executable path, falling back to `docker` on PATH.\n */\nexport async function resolveDockerExecutable(): Promise<string | undefined> {\n return which(\"docker\");\n}\n\n/**\n * Runs `docker info` and returns true when the daemon is reachable.\n *\n * @param executable Docker CLI path or name.\n */\nexport async function isDockerDaemonReachable(executable = \"docker\"): Promise<boolean> {\n try {\n await exec(executable, [\"info\"]);\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Runs `docker info` and returns stdout on success.\n *\n * @param executable Docker CLI path or name.\n */\nexport async function runDockerInfo(executable = \"docker\"): Promise<string> {\n const result = await exec(executable, [\"info\"]);\n\n return result.stdout;\n}\n\n/**\n * Parsed docker version output.\n */\nexport interface DockerVersionInfo {\n clientVersion?: string;\n serverReachable: boolean;\n}\n\n/**\n * Runs `docker version` and parses client/server availability.\n *\n * @param executable Docker CLI path or name.\n */\nexport async function runDockerVersion(executable = \"docker\"): Promise<DockerVersionInfo> {\n let clientVersion: string | undefined;\n\n try {\n const result = await exec(executable, [\"--version\"]);\n clientVersion = parseDockerCliVersion(result.stdout);\n } catch {\n return { serverReachable: false };\n }\n\n if (clientVersion === undefined) {\n return { serverReachable: false };\n }\n\n let serverReachable = false;\n\n try {\n const serverResult = await exec(executable, [\n \"version\",\n \"--format\",\n \"{{.Server.Version}}\"\n ]);\n serverReachable = serverResult.stdout.trim().length > 0;\n } catch {\n serverReachable = false;\n }\n\n return { clientVersion, serverReachable };\n}\n\n/**\n * Validates that docker CLI responds to `docker version`.\n *\n * @param executable Docker CLI path or name.\n */\nexport async function validateDockerInstallation(executable: string): Promise<boolean> {\n try {\n const result = await exec(executable, [\"--version\"]);\n\n return parseDockerCliVersion(result.stdout) !== undefined;\n } catch {\n return false;\n }\n}\n\n/**\n * Attempts `docker desktop start` when the subcommand exists.\n *\n * @param executable Docker CLI path or name.\n */\nexport async function runDockerDesktopStart(executable = \"docker\"): Promise<void> {\n await exec(executable, [\"desktop\", \"start\"]);\n}\n","import type { DockerDetectionResult } from \"../types\";\nimport {\n isDockerDaemonReachable,\n resolveDockerExecutable,\n runDockerVersion,\n validateDockerInstallation\n} from \"../commands\";\n\n/**\n * Detects Docker installation and daemon status.\n */\nexport async function detectDocker(): Promise<DockerDetectionResult> {\n const executable = await resolveDockerExecutable();\n\n if (executable === undefined) {\n return {\n installed: false,\n running: false\n };\n }\n\n const installed = await validateDockerInstallation(executable);\n\n if (!installed) {\n return {\n installed: false,\n running: false,\n executable\n };\n }\n\n const running = await isDockerDaemonReachable(executable);\n let version: string | undefined;\n\n if (installed) {\n const versionInfo = await runDockerVersion(executable);\n version = versionInfo.clientVersion;\n }\n\n return {\n installed: true,\n running,\n version,\n executable\n };\n}\n","/**\n * Stable error codes for Docker-related failures.\n */\nexport enum DockerErrorCode {\n NOT_INSTALLED = \"NOT_INSTALLED\",\n NOT_RUNNING = \"NOT_RUNNING\",\n START_FAILED = \"START_FAILED\",\n TIMEOUT = \"TIMEOUT\"\n}\n\n/**\n * Base error for all Docker ensure failures.\n */\nexport class DockerError extends Error {\n readonly code: DockerErrorCode;\n\n constructor(message: string, code: DockerErrorCode, options?: ErrorOptions) {\n super(message, options);\n this.name = \"DockerError\";\n this.code = code;\n }\n}\n\n/**\n * Thrown when the Docker CLI is not installed or not on PATH.\n */\nexport class DockerNotInstalledError extends DockerError {\n constructor(message = \"Docker is not installed. Install Docker and ensure the CLI is on your PATH.\") {\n super(message, DockerErrorCode.NOT_INSTALLED);\n this.name = \"DockerNotInstalledError\";\n }\n}\n\n/**\n * Thrown when Docker is installed but the daemon is not reachable and autoStart is false.\n */\nexport class DockerNotRunningError extends DockerError {\n constructor(message = \"Docker is installed but the daemon is not running. Start Docker or pass autoStart: true.\") {\n super(message, DockerErrorCode.NOT_RUNNING);\n this.name = \"DockerNotRunningError\";\n }\n}\n\n/**\n * Thrown when auto-start was attempted but every strategy failed.\n */\nexport class DockerStartError extends DockerError {\n constructor(\n message = \"Failed to start Docker. Start Docker manually and try again.\",\n options?: ErrorOptions\n ) {\n super(message, DockerErrorCode.START_FAILED, options);\n this.name = \"DockerStartError\";\n }\n}\n\n/**\n * Thrown when the daemon did not become ready within the configured timeout.\n */\nexport class DockerTimeoutError extends DockerError {\n constructor(timeoutMs: number) {\n const seconds = Math.round(timeoutMs / 1000);\n super(\n `Timed out after ${seconds}s waiting for the Docker daemon to become ready.`,\n DockerErrorCode.TIMEOUT\n );\n this.name = \"DockerTimeoutError\";\n }\n}\n","import type { DockerLogger } from \"../types\";\n\nconst noop = (): void => undefined;\n\n/**\n * Resolved logger with no-op fallbacks for missing hooks.\n */\nexport interface ResolvedLogger {\n info: (message: string) => void;\n warn: (message: string) => void;\n debug: (message: string) => void;\n}\n\n/**\n * Builds a logger that safely no-ops when hooks are omitted.\n *\n * @param logger Optional user-provided logger.\n * @returns Logger with info, warn, and debug methods.\n */\nexport function resolveLogger(logger?: DockerLogger): ResolvedLogger {\n return {\n info: logger?.info ?? noop,\n warn: logger?.warn ?? noop,\n debug: logger?.debug ?? noop\n };\n}\n","import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { runDockerDesktopStart } from \"../commands\";\nimport { launchWindowsExecutable, openMacApplication, startDockerdDetached } from \"../process\";\nimport { commandExists, exec } from \"../utils\";\nimport type { ResolvedLogger } from \"../logger\";\n\n/**\n * Starts Docker on Linux using available service managers or dockerd.\n *\n * @param logger Resolved logger.\n * @param dockerExecutable Docker CLI path.\n */\nexport async function startDockerLinux(\n logger: ResolvedLogger,\n _dockerExecutable = \"docker\"\n): Promise<void> {\n const errors: Error[] = [];\n\n if (await commandExists(\"systemctl\")) {\n try {\n logger.debug(\"Attempting: systemctl start docker\");\n await exec(\"systemctl\", [\"start\", \"docker\"]);\n logger.info(\"Started Docker via systemctl.\");\n\n return;\n } catch (err) {\n errors.push(err instanceof Error ? err : new Error(String(err)));\n logger.warn(\"systemctl start docker failed.\");\n }\n }\n\n if (await commandExists(\"service\")) {\n try {\n logger.debug(\"Attempting: service docker start\");\n await exec(\"service\", [\"docker\", \"start\"]);\n logger.info(\"Started Docker via service.\");\n\n return;\n } catch (err) {\n errors.push(err instanceof Error ? err : new Error(String(err)));\n logger.warn(\"service docker start failed.\");\n }\n }\n\n if (await commandExists(\"dockerd\")) {\n try {\n logger.debug(\"Attempting: dockerd (detached)\");\n startDockerdDetached();\n logger.info(\"Started dockerd in the background.\");\n\n return;\n } catch (err) {\n errors.push(err instanceof Error ? err : new Error(String(err)));\n logger.warn(\"dockerd detached start failed.\");\n }\n }\n\n const aggregate = new Error(\n \"No supported Docker start method found on Linux (systemctl, service, or dockerd).\"\n );\n\n if (errors.length > 0) {\n aggregate.cause = errors[errors.length - 1];\n }\n\n throw aggregate;\n}\n\n/**\n * Candidate paths for Docker Desktop on Windows.\n */\nexport function getWindowsDockerDesktopCandidates(): string[] {\n const programFiles = process.env.ProgramFiles ?? \"C:\\\\Program Files\";\n const programFilesX86 = process.env[\"ProgramFiles(x86)\"] ?? \"C:\\\\Program Files (x86)\";\n const localAppData = process.env.LOCALAPPDATA ?? \"\";\n const programData = process.env.ProgramData ?? \"\";\n\n const candidates = [\n path.join(programFiles, \"Docker\", \"Docker\", \"Docker Desktop.exe\"),\n path.join(programFilesX86, \"Docker\", \"Docker\", \"Docker Desktop.exe\"),\n localAppData\n ? path.join(localAppData, \"Docker\", \"Docker Desktop.exe\")\n : undefined,\n programData ? path.join(programData, \"Docker\", \"Docker Desktop.exe\") : undefined\n ];\n\n return candidates.filter((candidate): candidate is string => candidate !== undefined);\n}\n\n/**\n * Finds an existing Docker Desktop executable on Windows.\n */\nexport async function findWindowsDockerDesktop(): Promise<string | undefined> {\n for (const candidate of getWindowsDockerDesktopCandidates()) {\n try {\n await access(candidate);\n return candidate;\n } catch {\n continue;\n }\n }\n\n const pathHit = await import( \"../utils\").then((utils) => utils.which(\"Docker Desktop.exe\"));\n\n return pathHit;\n}\n\n/**\n * Starts Docker on Windows.\n *\n * @param logger Resolved logger.\n * @param dockerExecutable Docker CLI path.\n */\nexport async function startDockerWindows(\n logger: ResolvedLogger,\n dockerExecutable = \"docker\"\n): Promise<void> {\n try {\n logger.debug(\"Attempting: docker desktop start\");\n await runDockerDesktopStart(dockerExecutable);\n logger.info(\"Started Docker Desktop via CLI.\");\n\n return;\n } catch (err) {\n logger.warn(\"docker desktop start failed, searching for Docker Desktop.exe.\");\n const desktopPath = await findWindowsDockerDesktop();\n\n if (desktopPath === undefined) {\n throw err instanceof Error ? err : new Error(String(err));\n }\n\n logger.debug(`Launching: ${desktopPath}`);\n launchWindowsExecutable(desktopPath);\n logger.info(\"Launched Docker Desktop executable.\");\n }\n}\n\n/**\n * Starts Docker on macOS.\n *\n * @param logger Resolved logger.\n * @param dockerExecutable Docker CLI path.\n */\nexport async function startDockerMacOS(\n logger: ResolvedLogger,\n dockerExecutable = \"docker\"\n): Promise<void> {\n try {\n logger.debug(\"Attempting: docker desktop start\");\n await runDockerDesktopStart(dockerExecutable);\n logger.info(\"Started Docker Desktop via CLI.\");\n\n return;\n } catch {\n logger.warn(\"docker desktop start failed, trying open -a Docker.\");\n await openMacApplication(\"Docker\");\n logger.info(\"Opened Docker.app.\");\n }\n}\n\n/**\n * Dispatches platform-specific Docker start logic.\n *\n * @param logger Resolved logger.\n * @param dockerExecutable Docker CLI path.\n */\nexport async function startDocker(\n logger: ResolvedLogger,\n dockerExecutable = \"docker\"\n): Promise<void> {\n if (process.platform === \"win32\") {\n await startDockerWindows(logger, dockerExecutable);\n\n return;\n }\n\n if (process.platform === \"darwin\") {\n await startDockerMacOS(logger, dockerExecutable);\n\n return;\n }\n\n await startDockerLinux(logger, dockerExecutable);\n}\n","import { spawnDetached } from \"../utils\";\n\n/**\n * Starts `dockerd` as a detached background process.\n */\nexport function startDockerdDetached(): void {\n spawnDetached(\"dockerd\", []);\n}\n\n/**\n * Opens an application via macOS `open`.\n *\n * @param appName Application name for `open -a`.\n */\nexport async function openMacApplication(appName: string): Promise<void> {\n const { exec } = await import( \"../utils\");\n await exec(\"open\", [\"-a\", appName]);\n}\n\n/**\n * Launches a Windows executable detached.\n *\n * @param executablePath Full path to the executable.\n */\nexport function launchWindowsExecutable(executablePath: string): void {\n spawnDetached(executablePath, []);\n}\n","/**\n * Shared types and default option values.\n */\n\n/**\n * Optional logger hooks for progress output.\n */\nexport interface DockerLogger {\n info?(message: string): void;\n warn?(message: string): void;\n debug?(message: string): void;\n}\n\n/**\n * Options for {@link ensureDockerRunning}.\n */\nexport interface EnsureDockerOptions {\n /** Maximum wait time in ms for the daemon to become ready. Default: 120_000. */\n timeout?: number;\n\n /** Poll interval in ms between readiness checks. Default: 1_000. */\n interval?: number;\n\n /** When true, attempt to start Docker if the daemon is not running. Default: true. */\n autoStart?: boolean;\n\n /** Optional logger for progress messages. */\n logger?: DockerLogger;\n}\n\n/**\n * Result of {@link detectDocker}.\n */\nexport interface DockerDetectionResult {\n installed: boolean;\n running: boolean;\n version?: string;\n executable?: string;\n}\n\n/**\n * Default options merged into {@link ensureDockerRunning} calls.\n */\nexport const DefaultEnsureDockerOptions: Required<Pick<EnsureDockerOptions, \"timeout\" | \"interval\" | \"autoStart\">> = {\n timeout: 120_000,\n interval: 1_000,\n autoStart: true\n};\n\n/**\n * Default poll options for internal readiness checks.\n */\nexport const DefaultPollOptions = {\n timeout: 120_000,\n interval: 1_000\n} as const;\n","import { isDockerDaemonReachable } from \"../commands\";\nimport { DockerTimeoutError } from \"../errors\";\nimport type { ResolvedLogger } from \"../logger\";\nimport { poll } from \"../utils\";\n\n/**\n * Options for waiting until Docker is ready.\n */\nexport interface WaitForDockerOptions {\n timeout: number;\n interval: number;\n executable?: string;\n logger?: ResolvedLogger;\n}\n\n/**\n * Polls until `docker info` succeeds or timeout is reached.\n *\n * @param options Wait configuration.\n * @throws {DockerTimeoutError} When the daemon does not become ready in time.\n */\nexport async function waitForDocker(options: WaitForDockerOptions): Promise<void> {\n const executable = options.executable ?? \"docker\";\n const logger = options.logger;\n\n logger?.debug(\"Waiting for Docker daemon...\");\n\n const ready = await poll(async () => isDockerDaemonReachable(executable), {\n timeout: options.timeout,\n interval: options.interval\n });\n\n if (!ready) {\n throw new DockerTimeoutError(options.timeout);\n }\n\n logger?.info(\"Docker is ready.\");\n}\n","import { detectDocker } from \"../detect\";\nimport {\n DockerNotInstalledError,\n DockerNotRunningError,\n DockerStartError\n} from \"../errors\";\nimport { resolveLogger } from \"../logger\";\nimport { startDocker } from \"../platforms\";\nimport { DefaultEnsureDockerOptions, type EnsureDockerOptions } from \"../types\";\nimport { waitForDocker } from \"../wait\";\n\n/**\n * Returns true when the Docker daemon is reachable. Never throws.\n */\nexport async function isDockerRunning(): Promise<boolean> {\n try {\n const result = await detectDocker();\n\n return result.installed && result.running;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensures Docker is installed, started, and ready for use.\n *\n * @param options Timeout, polling, auto-start, and logger options.\n */\nexport async function ensureDockerRunning(options?: EnsureDockerOptions): Promise<void> {\n const timeout = options?.timeout ?? DefaultEnsureDockerOptions.timeout;\n const interval = options?.interval ?? DefaultEnsureDockerOptions.interval;\n const autoStart = options?.autoStart ?? DefaultEnsureDockerOptions.autoStart;\n const logger = resolveLogger(options?.logger);\n\n logger.info(\"Checking Docker installation...\");\n const detection = await detectDocker();\n\n if (!detection.installed) {\n throw new DockerNotInstalledError();\n }\n\n logger.info(\"Docker found.\");\n\n if (detection.running) {\n logger.info(\"Docker daemon is already running.\");\n\n return;\n }\n\n logger.warn(\"Docker daemon not running.\");\n\n if (!autoStart) {\n throw new DockerNotRunningError();\n }\n\n logger.info(\"Attempting to start Docker...\");\n\n const executable = detection.executable ?? \"docker\";\n\n try {\n await startDocker(logger, executable);\n } catch (err) {\n throw new DockerStartError(undefined, {\n cause: err instanceof Error ? err : new Error(String(err))\n });\n }\n\n await waitForDocker({\n timeout,\n interval,\n executable,\n logger\n });\n}\n","import { CommandSeparator } from \"../../../core/runner\";\nimport { defineEnsureService, type ServiceParseResult } from \"../../../core/service\";\n\nimport { ensureDockerRunning, isDockerRunning } from \"../ensure\";\nimport { DefaultEnsureDockerOptions, type EnsureDockerOptions } from \"../types\";\n\n/**\n * Docker service CLI modes.\n */\nexport enum DockerServiceMode {\n ENSURE = \"ENSURE\",\n CHECK = \"CHECK\"\n}\n\n/**\n * Parsed docker service CLI options.\n */\nexport interface DockerServiceOptions {\n mode: DockerServiceMode;\n timeout: number;\n interval: number;\n autoStart: boolean;\n quiet: boolean;\n}\n\n/**\n * Parses docker-specific flags from argv without consuming the trailing command.\n */\nexport function parseDockerServiceArgs(argv: string[]): ServiceParseResult<DockerServiceOptions> {\n const remaining = [...argv];\n let mode = DockerServiceMode.ENSURE;\n let timeout = DefaultEnsureDockerOptions.timeout;\n let interval = DefaultEnsureDockerOptions.interval;\n let autoStart = DefaultEnsureDockerOptions.autoStart;\n let quiet = false;\n\n while (remaining.length > 0) {\n const arg = remaining[0];\n\n if (arg === \"--check\") {\n mode = DockerServiceMode.CHECK;\n remaining.shift();\n\n continue;\n }\n\n if (arg === \"-q\" || arg === \"--quiet\") {\n quiet = true;\n remaining.shift();\n\n continue;\n }\n\n if (arg === \"--no-auto-start\" || arg === \"--no-start\") {\n autoStart = false;\n remaining.shift();\n\n continue;\n }\n\n if (arg === \"--timeout\") {\n remaining.shift();\n timeout = parsePositiveInteger(remaining.shift(), \"--timeout\");\n\n continue;\n }\n\n if (arg === \"--interval\") {\n remaining.shift();\n interval = parsePositiveInteger(remaining.shift(), \"--interval\");\n\n continue;\n }\n\n if (arg === CommandSeparator) {\n break;\n }\n\n if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown docker option: ${arg}`);\n }\n\n break;\n }\n\n return {\n options: {\n mode,\n timeout,\n interval,\n autoStart,\n quiet\n },\n remaining\n };\n}\n\n/**\n * Runs the docker service and returns a process exit code.\n */\nexport async function runDockerService(options: DockerServiceOptions): Promise<number> {\n const logger = options.quiet ? undefined : createConsoleLogger();\n\n try {\n if (options.mode === DockerServiceMode.CHECK) {\n const running = await isDockerRunning();\n\n if (!running && !options.quiet) {\n console.error(\"Docker is not running.\");\n }\n\n return running ? 0 : 1;\n }\n\n await ensureDockerRunning({\n timeout: options.timeout,\n interval: options.interval,\n autoStart: options.autoStart,\n logger\n });\n\n return 0;\n } catch (err) {\n if (!options.quiet) {\n const message = err instanceof Error ? err.message : String(err);\n\n console.error(message);\n }\n\n return 1;\n }\n}\n\n/**\n * Prints docker service help.\n */\nexport function printDockerServiceHelp(): void {\n console.log(`docker [options]\n\nEnsure Docker is installed, started, and ready.\n\nOptions:\n --check Exit 0 when the daemon is reachable; do not auto-start\n --timeout <ms> Max wait for daemon readiness (default: ${DefaultEnsureDockerOptions.timeout})\n --interval <ms> Poll interval between checks (default: ${DefaultEnsureDockerOptions.interval})\n --no-auto-start Fail when the daemon is down instead of starting Docker\n -q, --quiet Suppress progress output`);\n}\n\n/**\n * Built-in Docker ensure service.\n */\nexport const dockerService = defineEnsureService({\n id: \"docker\",\n aliases: [\"d\"],\n parseArgs: parseDockerServiceArgs,\n run: runDockerService,\n printHelp: printDockerServiceHelp\n});\n\nfunction parsePositiveInteger(value: string | undefined, flag: string): number {\n if (value === undefined) {\n throw new Error(`Missing value for ${flag}`);\n }\n\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} expects a positive integer, received: ${value}`);\n }\n\n return parsed;\n}\n\nfunction createConsoleLogger(): EnsureDockerOptions[\"logger\"] {\n return {\n info: (message: string): void => {\n console.log(message);\n },\n\n warn: (message: string): void => {\n console.warn(message);\n },\n\n debug: (message: string): void => {\n console.debug(message);\n }\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { ServiceRegistry } from \"../core/registry\";\n\nimport { assertEnsureService } from \"./AssertEnsureService\";\n\nconst SERVICE_FILE_PATTERN = /\\.(?:[cm]?js|mjs|ts)$/i;\n\n/**\n * Finds the nearest `.er/services` directory walking up from startDir.\n */\nexport function findCustomServicesDir(startDir: string): string | undefined {\n let current = path.resolve(startDir);\n\n while (true) {\n const candidate = path.join(current, \".er\", \"services\");\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\n/**\n * Loads custom services from `.er/services` and registers them.\n */\nexport async function loadCustomServices(registry: ServiceRegistry, cwd = process.cwd()): Promise<void> {\n const dir = findCustomServicesDir(cwd);\n\n if (dir === undefined) {\n return;\n }\n\n const entries = await readdir(dir, { withFileTypes: true });\n const files = entries\n .filter((entry) => entry.isFile() && SERVICE_FILE_PATTERN.test(entry.name))\n .map((entry) => path.join(dir, entry.name))\n .sort();\n\n for (const filePath of files) {\n const service = await importCustomService(filePath);\n\n registry.register(service);\n }\n}\n\nasync function importCustomService(filePath: string): Promise<ReturnType<typeof assertEnsureService>> {\n const ext = path.extname(filePath).toLowerCase();\n let loaded: unknown;\n\n if (ext === \".ts\" || ext === \".mts\" || ext === \".cts\") {\n const { createJiti } = await import(\"jiti\");\n const jiti = createJiti(import.meta.url, { interopDefault: true });\n\n loaded = jiti(filePath);\n } else {\n const module = await import(pathToFileURL(filePath).href);\n\n loaded = module.default ?? module;\n }\n\n return assertEnsureService(loaded, filePath);\n}\n","import type { EnsureService } from \"../core/service\";\n\n/**\n * Validates a custom service loaded from `.er/services`.\n */\nexport function assertEnsureService(value: unknown, source: string): EnsureService {\n if (value === null || typeof value !== \"object\") {\n throw new Error(`${source}: export default must be an object`);\n }\n\n const candidate = value as Record<string, unknown>;\n\n if (typeof candidate.id !== \"string\" || candidate.id.length === 0) {\n throw new Error(`${source}: export default must define a non-empty string \"id\"`);\n }\n\n if (typeof candidate.parseArgs !== \"function\") {\n throw new Error(`${source}: export default must define \"parseArgs(argv)\"`);\n }\n\n if (typeof candidate.run !== \"function\") {\n throw new Error(`${source}: export default must define \"run(options)\"`);\n }\n\n if (candidate.printHelp !== undefined && typeof candidate.printHelp !== \"function\") {\n throw new Error(`${source}: \"printHelp\" must be a function when provided`);\n }\n\n return value as EnsureService;\n}\n","import { ServiceRegistry } from \"../core/registry\";\n\nimport { dockerService } from \"./docker/service\";\nimport { loadCustomServices } from \"./LoadCustomServices\";\n\n/**\n * Creates a registry with built-in services and project-local `.er/services`.\n */\nexport async function createServiceRegistry(cwd = process.cwd()): Promise<ServiceRegistry> {\n const registry = createBuiltInServiceRegistry();\n\n await loadCustomServices(registry, cwd);\n\n return registry;\n}\n\n/**\n * Built-in services only (sync, for tests and programmatic use without custom loading).\n */\nexport function createBuiltInServiceRegistry(): ServiceRegistry {\n const registry = new ServiceRegistry();\n\n registry.register(dockerService);\n\n return registry;\n}\n","#!/usr/bin/env node\n\nimport { runCli } from \"../cli\";\n\nrunCli(process.argv).then((exitCode) => {\n process.exit(exitCode);\n});\n"],"mappings":"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","names":["spawn","path","spawn","exec","path","path"]}
|