@dockstat/docker 0.1.1 → 0.1.3
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/dist/index.js +0 -2
- package/dist/types.d.ts +1857 -2441
- package/package.json +8 -4
- package/tsconfig.json +2 -6
- package/dist/index.js.map +0 -25
package/package.json
CHANGED
|
@@ -7,13 +7,17 @@
|
|
|
7
7
|
"url": "https://itsnik.de"
|
|
8
8
|
},
|
|
9
9
|
"exports": {
|
|
10
|
-
".":
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./src/index.ts",
|
|
12
|
+
"require": "./src/index.ts",
|
|
13
|
+
"types": "./dist/types.d.ts"
|
|
14
|
+
}
|
|
11
15
|
},
|
|
12
16
|
"keywords": [
|
|
13
17
|
"docker",
|
|
14
18
|
"bun"
|
|
15
19
|
],
|
|
16
|
-
"version": "0.1.
|
|
20
|
+
"version": "0.1.3",
|
|
17
21
|
"license": "MPL-2.0",
|
|
18
22
|
"repository": {
|
|
19
23
|
"directory": "packages/bun-docker",
|
|
@@ -35,8 +39,8 @@
|
|
|
35
39
|
"tsconfig.json"
|
|
36
40
|
],
|
|
37
41
|
"scripts": {
|
|
38
|
-
"build": "bun build --target=bun --production --
|
|
39
|
-
"typegen": "bunx
|
|
42
|
+
"build": "bun build --target=bun --production --outdir=dist src/index.ts",
|
|
43
|
+
"typegen": "bunx dts-bundle-generator --sort --export-referenced-types false -o dist/types.d.ts src/index.ts",
|
|
40
44
|
"publish": "bun run build && bun run typegen && bun pm pack --destination ./dist && npm publish --access public ./dist/*.tgz ; rm -r ./dist"
|
|
41
45
|
}
|
|
42
46
|
}
|
package/tsconfig.json
CHANGED
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
"jsx": "react-jsx",
|
|
9
9
|
"allowJs": true,
|
|
10
10
|
|
|
11
|
-
// Bundler mode
|
|
12
11
|
"moduleResolution": "bundler",
|
|
13
12
|
"allowImportingTsExtensions": true,
|
|
14
13
|
"verbatimModuleSyntax": true,
|
|
14
|
+
|
|
15
15
|
"noEmit": true,
|
|
16
16
|
|
|
17
17
|
// Best practices
|
|
@@ -21,11 +21,7 @@
|
|
|
21
21
|
"noUncheckedIndexedAccess": true,
|
|
22
22
|
"noImplicitOverride": true,
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
"outDir": "dist",
|
|
26
|
-
"declaration": true,
|
|
27
|
-
|
|
28
|
-
// Some stricter flags (disabled by default)
|
|
24
|
+
// Some stricter flags
|
|
29
25
|
"noUnusedLocals": true,
|
|
30
26
|
"noUnusedParameters": true,
|
|
31
27
|
"noPropertyAccessFromIndexSignature": true,
|
package/dist/index.js.map
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/request-options.ts", "../src/utils/error.ts", "../src/utils/response.ts", "../src/utils/url.ts", "../src/modules/_socket/index.ts", "../src/modules/base/index.ts", "../src/modules/container/index.ts", "../src/modules/distribution/index.ts", "../src/modules/exec/index.ts", "../src/modules/images/index.ts", "../src/modules/networks/index.ts", "../src/modules/nodes/index.ts", "../src/modules/volumes/index.ts", "../src/docker.ts", "../src/utils/env.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import type { BodyInit, HeadersInit } from \"bun\"\nimport type { ConnectionConfig, HttpMethod } from \"../modules/base/types\"\n\nexport function prepareRequestOptions(\n config: ConnectionConfig,\n method: HttpMethod,\n body?: BodyInit | object,\n headers?: HeadersInit,\n url?: string\n): BunFetchRequestInit {\n const isJsonBody = typeof body === \"object\" && !(body instanceof FormData) && body !== undefined\n\n const baseHeaders: Record<string, string> = {\n Host: \"localhost\",\n }\n\n if (isJsonBody) {\n baseHeaders[\"Content-Type\"] = \"application/json\"\n }\n\n // Merge additional headers\n if (headers) {\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n baseHeaders[key] = value\n })\n } else if (Array.isArray(headers)) {\n headers.forEach(([key, value]) => {\n if (key !== undefined && value !== undefined) {\n baseHeaders[key] = value\n }\n })\n } else {\n Object.assign(baseHeaders, headers)\n }\n }\n\n const requestBody = isJsonBody\n ? JSON.stringify(body)\n : (body as unknown as any)\n\n const options: BunFetchRequestInit = {\n method,\n headers: baseHeaders,\n body: requestBody,\n }\n\n if (config.mode !== \"unix\" && url) {\n try {\n const urlObj = new URL(url)\n baseHeaders[\"Host\"] = urlObj.host\n } catch (_) {\n // Ignore URL parsing errors, keep default Host\n }\n }\n\n // Configure Unix socket\n if (config.mode === \"unix\" && config.socketPath) {\n options.unix = config.socketPath\n }\n\n // Configure TLS\n if (config.tls) {\n options.tls = config.tls\n }\n\n return options\n}\n",
|
|
6
|
-
"export class DockerError extends Error {\n status: number\n path: string\n version: string\n params: object | string\n\n constructor(\n message: string,\n status: number,\n path: string,\n version: string,\n params: object | string\n ) {\n super(message)\n this.name = \"DockerError\"\n this.status = status\n this.path = path\n this.version = version\n this.params = params\n\n Object.setPrototypeOf(this, DockerError.prototype)\n }\n}\n",
|
|
7
|
-
"import { DockerError } from \"./error\"\n\nexport async function handleDockerResponse(\n response: Response,\n path: string,\n apiVersion: string,\n params:object | undefined\n): Promise<Response> {\n if (!response.ok) {\n let text = await response.text()\n\n try {\n const parsed = JSON.parse(text)\n if (parsed.message) {\n text = parsed.message\n }\n } catch (_) {\n // If JSON parsing fails, we stick with the raw text response\n }\n\n throw new DockerError(\n `Docker API Error (${response.status}): ${text}`,\n response.status,\n path,\n apiVersion,\n params || \"No params defined\"\n )\n }\n\n return response\n}\n",
|
|
8
|
-
"import type { ConnectionConfig } from \"../modules/base/types\"\n\n/**\n * Converts an object of parameters into a URL query string.\n * Handles strings, numbers, booleans, and JSON serializable objects.\n */\nexport function buildQueryString(params?: object): string | undefined {\n if (!params) return undefined\n\n const urlParams = new URLSearchParams()\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue\n\n if (typeof value === \"string\") {\n urlParams.append(key, value)\n } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n urlParams.append(key, value.toString())\n } else {\n urlParams.append(key, JSON.stringify(value))\n }\n }\n\n return urlParams.toString()\n}\n\n/**\n * Constructs the full request URL based on the connection mode (Unix/Http) and API version.\n */\nexport function buildDockerUrl(\n config: ConnectionConfig,\n path: string,\n query: string | undefined,\n apiVersion: string\n): string {\n const queryString = query ? `?${query}` : \"\"\n\n if (config.mode === \"unix\") {\n // In Unix mode, the hostname doesn't matter\n return `http://localhost/${apiVersion}${path}${queryString}`\n }\n\n // HTTP/HTTPS mode\n const baseUrl = config.baseUrl || \"\"\n const separator = baseUrl.endsWith(\"/\") ? \"\" : \"/\"\n\n return `${baseUrl}${separator}${apiVersion}${path}${queryString}`\n}\n",
|
|
9
|
-
"import type { ReadableStreamDefaultReader } from \"node:stream/web\"\n\n/**\n * WebSocket-like interface for Docker container attach\n * Uses the attach endpoint with stream wrapping for compatibility with Unix sockets\n *\n * @note Currently supports read-only operations (receiving stdout/stderr). Full WebSocket\n * protocol support with bidirectional communication is planned for future versions.\n */\nexport class DockerWebSocket {\n private static readonly CONNECTING = 0\n private static readonly OPEN = 1\n private static readonly CLOSING = 2\n private static readonly CLOSED = 3\n\n private readyStateValue: number = DockerWebSocket.CONNECTING\n private listeners: Map<string, Array<(event: unknown) => void>> = new Map()\n private reader: ReadableStreamDefaultReader | null = null\n\n addEventListener(type: string, listener: (event: unknown) => void) {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, [])\n }\n this.listeners.get(type)?.push(listener)\n }\n\n removeEventListener(type: string, listener: (event: unknown) => void) {\n const typeListeners = this.listeners.get(type)\n if (typeListeners) {\n const index = typeListeners.indexOf(listener)\n if (index > -1) {\n typeListeners.splice(index, 1)\n }\n }\n }\n\n async attach(response: Response) {\n if (!response.body) {\n this.emit(\"error\", new Error(\"Response has no body\"))\n this.readyStateValue = DockerWebSocket.CLOSED\n this.emit(\"close\", {})\n return\n }\n\n this.reader = response.body.getReader()\n this.readyStateValue = DockerWebSocket.OPEN\n this.emit(\"open\", {})\n\n try {\n while (this.readyStateValue === DockerWebSocket.OPEN) {\n const { done, value } = await this.reader.read()\n if (done) break\n\n // Decode the chunk to string\n const text = new TextDecoder().decode(value)\n this.emit(\"message\", { data: text })\n }\n } catch (error) {\n if (this.readyStateValue !== DockerWebSocket.CLOSING) {\n this.emit(\"error\", error)\n }\n } finally {\n this.readyStateValue = DockerWebSocket.CLOSED\n this.emit(\"close\", {})\n }\n }\n\n close() {\n if (this.readyStateValue === DockerWebSocket.CLOSED) return\n\n this.readyStateValue = DockerWebSocket.CLOSING\n\n if (this.reader) {\n this.reader.cancel().catch(() => {})\n }\n\n this.readyStateValue = DockerWebSocket.CLOSED\n this.emit(\"close\", {})\n }\n\n get CONNECTING() {\n return DockerWebSocket.CONNECTING\n }\n get OPEN() {\n return DockerWebSocket.OPEN\n }\n get CLOSING() {\n return DockerWebSocket.CLOSING\n }\n get CLOSED() {\n return DockerWebSocket.CLOSED\n }\n\n get readyState() {\n return this.readyStateValue\n }\n\n private emit(type: string, event: unknown) {\n const listeners = this.listeners.get(type)\n if (listeners) {\n for (const listener of listeners) {\n listener(event)\n }\n }\n }\n}\n",
|
|
10
|
-
"import type { BodyInit, HeadersInit } from \"bun\"\nimport { prepareRequestOptions } from \"../../utils/request-options\"\nimport { handleDockerResponse } from \"../../utils/response\"\nimport { buildDockerUrl, buildQueryString } from \"../../utils/url\"\nimport { DockerWebSocket } from \"../_socket\"\nimport type { ConnectionConfig, HttpMethod } from \"./types\"\n\nexport class BaseModule {\n constructor(private config: ConnectionConfig) {}\n\n protected ws = new DockerWebSocket()\n\n async request(\n path: string,\n method: HttpMethod = \"GET\",\n body?: BodyInit | object,\n headers?: HeadersInit,\n params?: object\n ) {\n const dockerApiVersion = this.config.dockerAPIVersion || \"1.54\"\n const query = buildQueryString(params)\n const url = buildDockerUrl(this.config, path, query, dockerApiVersion)\n\n const options = prepareRequestOptions(this.config, method, body, headers, url)\n\n const response = await fetch(url, options)\n\n return handleDockerResponse(response, path, dockerApiVersion, params)\n }\n}\n",
|
|
11
|
-
"import type { BodyInit } from \"bun\"\nimport { BaseModule } from \"../base\"\nimport type { DockerWebSocket } from \"../_socket\"\nimport type {\n ArchiveInfo,\n AttachOptions,\n ContainerConfig,\n ContainerCreateResponse,\n ContainerInspectResponse,\n ContainerPruneResponse,\n ContainerStatsResponse,\n ContainerSummary,\n ContainerTopResponse,\n ContainerUpdateResponse,\n ContainerWaitResponse,\n CreateContainerOptions,\n ExecCreateOptions,\n ExecCreateResponse,\n ExecInspectResponse,\n ExecStartOptions,\n FilesystemChange,\n ListContainersOptions,\n LogsOptions,\n PruneContainersOptions,\n StatsOptions,\n UpdateContainerOptions,\n WaitCondition,\n} from \"./types\"\n\n/**\n * Container Module - handles all Docker container operations\n */\nexport class ContainerModule extends BaseModule {\n /**\n * List containers\n * @param options - List options\n * @returns Array of container summaries\n */\n async list(options?: ListContainersOptions): Promise<ContainerSummary[]> {\n const path = `/containers/json`\n const res = await this.request(path, \"GET\", undefined, undefined, options)\n return (await res.json()) as ContainerSummary[]\n }\n\n /**\n * Create a container\n * @param config - Container configuration\n * @param options - Create options\n * @returns Container create response with ID\n */\n async create(config: ContainerConfig, options?: CreateContainerOptions): Promise<ContainerCreateResponse> {\n const path = `/containers/create`\n const res = await this.request(path, \"POST\", config, undefined, options)\n return (await res.json()) as ContainerCreateResponse\n }\n\n /**\n * Inspect a container\n * @param id - Container ID or name\n * @param size - Return container size information\n * @returns Detailed container information\n */\n async inspect(id: string, size: boolean = false): Promise<ContainerInspectResponse> {\n const res = await this.request(`/containers/${id}/json`, \"GET\", undefined, undefined, {\n size: size,\n })\n return (await res.json()) as ContainerInspectResponse\n }\n\n /**\n * Start a container\n * @param id - Container ID or name\n * @param detachKeys - Override the key sequence for detaching\n */\n async start(id: string, detachKeys?: string): Promise<void> {\n await this.request(`/containers/${id}/start`, \"POST\", undefined, undefined, {\n detachKeys: detachKeys,\n })\n }\n\n /**\n * Stop a container\n * @param id - Container ID or name\n * @param t - Number of seconds to wait before killing the container\n */\n async stop(id: string, t?: number): Promise<void> {\n await this.request(`/containers/${id}/stop`, \"POST\", undefined, undefined, { t: t })\n }\n\n /**\n * Restart a container\n * @param id - Container ID or name\n * @param t - Number of seconds to wait before killing the container\n */\n async restart(id: string, t?: number): Promise<void> {\n await this.request(`/containers/${id}/restart`, \"POST\", undefined, undefined, { t: t })\n }\n\n /**\n * Kill a container\n * @param id - Container ID or name\n * @param signal - Signal to send to the container\n */\n async kill(id: string, signal?: string): Promise<void> {\n await this.request(`/containers/${id}/kill`, \"POST\", undefined, undefined, { signal: signal })\n }\n\n /**\n * Remove a container\n * @param id - Container ID or name\n * @param v - Remove anonymous volumes associated with the container\n * @param force - Force removal of running containers\n * @param link - Remove the specified link associated with the container\n */\n async remove(\n id: string,\n v: boolean = false,\n force: boolean = false,\n link: boolean = false\n ): Promise<void> {\n await this.request(`/containers/${id}`, \"DELETE\", undefined, undefined, {\n v: v,\n force: force,\n link: link,\n })\n }\n\n /**\n * Rename a container\n * @param id - Container ID or name\n * @param name - New name for the container\n */\n async rename(id: string, name: string): Promise<void> {\n await this.request(`/containers/${id}/rename`, \"POST\", undefined, undefined, { name: name })\n }\n\n /**\n * Pause a container\n * @param id - Container ID or\n name\n */\n async pause(id: string): Promise<void> {\n await this.request(`/containers/${id}/pause`, \"POST\")\n }\n\n /**\n * Unpause a container\n * @param id - Container ID or name\n */\n async unpause(id: string): Promise<void> {\n await this.request(`/containers/${id}/unpause`, \"POST\")\n }\n\n /**\n * Wait for a container\n * @param id - Container ID or name\n * @param condition - Wait until condition is met\n * @returns Container wait response with exit status\n */\n async wait(id: string, condition?: WaitCondition): Promise<ContainerWaitResponse> {\n const res = await this.request(`/containers/${id}/wait`, \"POST\", undefined, undefined, {\n condition: condition,\n })\n return (await res.json()) as ContainerWaitResponse\n }\n\n /**\n * List processes running inside a container\n * @param id - Container ID or name\n * @param ps_args - Arguments for ps command\n * @returns Top processes response\n */\n async top(id: string, ps_args?: string): Promise<ContainerTopResponse> {\n const res = await this.request(`/containers/${id}/top`, \"GET\", undefined, undefined, {\n ps_args: encodeURIComponent(ps_args || \"\"),\n })\n return (await res.json()) as ContainerTopResponse\n }\n\n /**\n * Get container logs\n * @param id - Container ID or name\n * @param options - Log options\n * @returns Log stream\n */\n async logs(id: string, options?: LogsOptions): Promise<Response> {\n return await this.request(`/containers/${id}/logs`, \"GET\", undefined, undefined, options)\n }\n\n /**\n * Get container resource usage statistics\n * @param id - Container ID or name\n * @param options - Stats options\n * @returns Container stats response\n */\n async stats(id: string, options?: StatsOptions): Promise<ContainerStatsResponse | Response> {\n const res = await this.request(`/containers/${id}/stats`, \"GET\", undefined, undefined, options)\n\n if (options?.stream) {\n return res\n }\n\n return (await res.json()) as ContainerStatsResponse\n }\n\n /**\n * Get changes on container filesystem\n * @param id - Container ID or name\n * @returns Array of filesystem changes\n */\n async changes(id: string): Promise<FilesystemChange[]> {\n const res = await this.request(`/containers/${id}/changes`, \"GET\")\n return (await res.json()) as FilesystemChange[]\n }\n\n /**\n * Export a container\n * @param id - Container ID or name\n * @returns Exported container archive\n */\n async export(id: string): Promise<Response> {\n return await this.request(`/containers/${id}/export`, \"GET\")\n }\n\n /**\n * Update container configuration\n * @param id - Container ID or name\n * @param options - Update options\n * @returns Update response with warnings\n */\n async update(id: string, options: UpdateContainerOptions): Promise<ContainerUpdateResponse> {\n const res = await this.request(`/containers/${id}/update`, \"POST\", options)\n return res.json() as ContainerUpdateResponse\n }\n\n /**\n * Resize container TTY\n * @param id - Container ID or name\n * @param h - Height of the TTY session\n * @param w - Width of the TTY session\n */\n async resize(id: string, h: number, w: number): Promise<void> {\n await this.request(`/containers/${id}/resize`, \"POST\", undefined, undefined, { h: h, w: w })\n }\n\n /**\n * Attach to a container\n * @param id - Container ID or name\n * @param options - Attach options\n * @returns Attach connection\n */\n async attach(id: string, options?: AttachOptions): Promise<Response> {\n return await this.request(`/containers/${id}/attach`, \"POST\", undefined, undefined, options)\n }\n\n /**\n * Attach to a container via WebSocket\n * @param id - Container ID or name\n * @param options - Attach options\n * @returns WebSocket-like connection\n * @note Uses the attach endpoint with stream wrapping for compatibility with Unix sockets\n */\n async attachWebSocket(id: string, options?: AttachOptions): Promise<DockerWebSocket> {\n const response = await this.request(\n `/containers/${id}/attach`,\n \"POST\",\n undefined,\n undefined,\n options\n )\n\n this.ws.attach(response)\n\n return this.ws\n }\n\n /**\n * Get an archive of a filesystem resource in a container\n * @param id - Container ID or name\n * @param path - Resource path in the container\n * @returns Archive stream\n */\n\n async getArchive(id: string, path: string): Promise<Response> {\n return await this.request(`/containers/${id}/archive`, \"GET\", undefined, undefined, {\n path: path,\n })\n }\n\n /**\n * Check if a file exists in a container\n * @param id - Container ID or name\n * @param path - Resource path in the container\n * @returns Archive info or null\n */\n async archiveInfo(id: string, path: string): Promise<ArchiveInfo | null> {\n const res = await this.request(`/containers/${id}/archive`, \"HEAD\", undefined, undefined, {\n path: path,\n })\n\n const dockerContentType = res.headers.get(\"X-Docker-Container-Path-Stat\")\n if (!dockerContentType) return null\n\n try {\n return JSON.parse(dockerContentType)\n } catch {\n return null\n }\n }\n\n /**\n * Extract an archive of files or folders to a directory in the container\n * @param id - Container ID or name\n * @param path - Path to extract to\n * @param archive - Archive to extract\n * @param noOverwriteDirNonDir - If true, will not overwrite a dir with a non-dir\n * @param copyUIDGID - If set to true, copy ownership from archive to target\n */\n async putArchive(\n id: string,\n path: string,\n archive: BodyInit,\n noOverwriteDirNonDir: boolean = false,\n copyUIDGID: boolean = false\n ): Promise<void> {\n await this.request(`/containers/${id}/archive`, \"PUT\", archive, undefined, {\n path: path,\n noOverwriteDirNonDir: noOverwriteDirNonDir,\n copyUIDGID: copyUIDGID,\n })\n }\n\n /**\n * Create an exec instance\n * @param id - Container ID or name\n * @param options - Exec create options\n * @returns Exec create response with exec ID\n */\n async execCreate(id: string, options: ExecCreateOptions): Promise<ExecCreateResponse> {\n const res = await this.request(`/containers/${id}/exec`, \"POST\", options)\n return (await res.json()) as ExecCreateResponse\n }\n\n /**\n * Start an exec instance\n * @param id - Exec ID\n * @param options - Exec start options\n * @returns Exec stream\n */\n async execStart(id: string, options?: ExecStartOptions): Promise<Response> {\n const res = await this.request(`/exec/${id}/start`, \"POST\", undefined, undefined,options)\n return res\n }\n\n /**\n * Inspect an exec instance\n * @param id - Exec ID\n * @returns Exec inspect response\n */\n async execInspect(id: string): Promise<ExecInspectResponse> {\n const res = await this.request(`/exec/${id}/json`, \"GET\")\n return (await res.json()) as ExecInspectResponse\n }\n\n /**\n * Resize an exec TTY\n * @param id - Exec ID\n * @param h - Height of the TTY session\n * @param w - Width of the TTY session\n */\n async execResize(id: string, h: number, w: number): Promise<void> {\n await this.request(`/exec/${id}/resize`, \"POST\", undefined, undefined, { h: h, w: w })\n }\n\n /**\n * Delete stopped containers\n * @param options - Prune options\n * @returns Prune response with deleted containers and reclaimed space\n */\n async prune(options?: PruneContainersOptions): Promise<ContainerPruneResponse> {\n const res = await this.request(`/containers/prune`, \"POST\", undefined, undefined, options)\n return (await res.json()) as ContainerPruneResponse\n }\n}\n",
|
|
12
|
-
"import { BaseModule } from \"../base\"\nimport type { ImageInformationResponse } from \"./types\"\n\nexport class DistributionModule extends BaseModule {\n /**\n * Return image digest and platform information by contacting the registry.\n * @param image Image name or id\n */\n async getImageInfo(image: string) {\n const path = `/distribution/${image}/json`\n const res = await this.request(path, \"GET\")\n return (await res.json()) as ImageInformationResponse\n }\n}\n",
|
|
13
|
-
"import { BaseModule } from \"../base\"\nimport type {\n ExecCreateOptions,\n ExecCreateResponse,\n ExecInspectResponse,\n ExecStartOptions,\n} from \"./types\"\n\n/**\n * Exec Module - handles all Docker exec operations\n */\nexport class ExecModule extends BaseModule {\n /**\n * Create an exec instance\n * @param containerId - Container ID or name\n * @param options - Exec configuration\n * @returns Exec create response with ID\n */\n async create(containerId: string, options: ExecCreateOptions): Promise<ExecCreateResponse> {\n const path = `/containers/${containerId}/exec`\n const res = await this.request(path, \"POST\", options)\n return (await res.json()) as ExecCreateResponse\n }\n\n /**\n * Start an exec instance\n * @param execId - Exec instance ID\n * @param options - Start configuration\n * @returns Response object (for streaming)\n */\n async start(execId: string, options?: ExecStartOptions): Promise<Response> {\n const path = `/exec/${execId}/start`\n const res = await this.request(path, \"POST\", options)\n return res\n }\n\n /**\n * Inspect an exec instance\n * @param execId - Exec instance ID\n * @returns Detailed exec instance information\n */\n async inspect(execId: string): Promise<ExecInspectResponse> {\n const path = `/exec/${execId}/json`\n const res = await this.request(path, \"GET\")\n return (await res.json()) as ExecInspectResponse\n }\n\n /**\n * Resize an exec instance TTY session\n * @param execId - Exec instance ID\n * @param height - Height of TTY session in characters\n * @param width - Width of TTY session in characters\n */\n async resize(execId: string, height: number, width: number): Promise<void> {\n await this.request(`/exec/${execId}/resize`, \"POST\", undefined, undefined, {\n h: height,\n w: width,\n })\n }\n}\n",
|
|
14
|
-
"import type { HeadersInit } from \"bun\"\nimport { BaseModule } from \"../base\"\nimport type {\n BuildCacheDiskUsage,\n BuildImageOptions,\n CommitBody,\n CommitParams,\n CreateImageInfo,\n ExportAllImagesOptions,\n ExportImageOptions,\n HistoryImageOptions,\n ImageDeleteResponseItem,\n ImageHistoryResponseItem,\n ImageID,\n ImageInspect,\n ImagePruneResponse,\n ImageSearchResponseItem,\n ImageSummary,\n InspectImageOptions,\n ListImagesOptions,\n LoadImageOptions,\n PruneBuildCacheOptions,\n PruneImagesOptions,\n PullImageOptions,\n PushImageInfo,\n PushImageOptions,\n RemoveImageOptions,\n SearchImagesOptions,\n TagImageOptions,\n} from \"./types\"\n\n/**\n * Images Module - handles all Docker image operations\n */\nexport class ImagesModule extends BaseModule {\n /**\n * List images\n * @param options - List options\n * @returns Array of image summaries\n */\n async list(options?: ListImagesOptions): Promise<ImageSummary[]> {\n const res = await this.request(`/images/json`, \"GET\", undefined, undefined, options)\n return (await res.json()) as ImageSummary[]\n }\n\n /**\n * Create (pull) an image\n * @param options - Pull options\n * @returns Image creation info\n */\n async pull(options: PullImageOptions): Promise<CreateImageInfo[]> {\n const headers: HeadersInit = {}\n if (options.authHeader) {\n headers[\"X-Registry-Auth\"] = options.authHeader\n }\n\n const res = await this.request(`/images/create`, \"POST\", options.inputImage, headers, options)\n return (await res.json()) as CreateImageInfo[]\n }\n\n /**\n * Inspect an image\n * @param name - Image name or ID\n * @param options - Inspect options\n * @returns Detailed image information\n */\n async inspect(name: string, options?: InspectImageOptions): Promise<ImageInspect> {\n const res = await this.request(`/images/${name}/json`, \"GET\", undefined, undefined, options)\n return (await res.json()) as ImageInspect\n }\n\n /**\n * Get image history\n * @param name - Image name or ID\n * @param options - History options\n * @returns Array of image history items\n */\n async history(name: string, options?: HistoryImageOptions): Promise<ImageHistoryResponseItem[]> {\n const res = await this.request(`/images/${name}/history`, \"GET\", undefined, undefined, options)\n return (await res.json()) as ImageHistoryResponseItem[]\n }\n\n /**\n * Push an image\n * @param name - Image name to push\n * @param options - Push options\n * @returns Push info\n */\n async push(name: string, options: PushImageOptions): Promise<PushImageInfo[]> {\n const headers: HeadersInit = {\n \"X-Registry-Auth\": options.authHeader,\n }\n\n const res = await this.request(`/images/${name}/push`, \"POST\", undefined, headers, options)\n return (await res.json()) as PushImageInfo[]\n }\n\n /**\n * Tag an image\n * @param name - Image name or ID to tag\n * @param options - Tag options\n */\n async tag(name: string, options: TagImageOptions): Promise<void> {\n await this.request(`/images/${name}/tag`, \"POST\", undefined, undefined, options)\n }\n\n /**\n * Remove an image\n * @param name - Image name or ID\n * @param options - Remove options\n * @returns Array of delete response items\n */\n async remove(name: string, options?: RemoveImageOptions): Promise<ImageDeleteResponseItem[]> {\n const res = await this.request(`/images/${name}`, \"DELETE\", undefined, undefined, options)\n return (await res.json()) as ImageDeleteResponseItem[]\n }\n\n /**\n * Search images\n * @param options - Search options\n * @returns Array of search results\n */\n async search(options: SearchImagesOptions): Promise<ImageSearchResponseItem[]> {\n const res = await this.request(`/images/search`, \"GET\", undefined, undefined, options)\n return (await res.json()) as ImageSearchResponseItem[]\n }\n\n /**\n * Prune unused images\n * @param options - Prune options\n * @returns Prune response\n */\n async prune(options?: PruneImagesOptions): Promise<ImagePruneResponse> {\n const res = await this.request(`/images/prune`, \"POST\", undefined, undefined, options)\n return (await res.json()) as ImagePruneResponse\n }\n\n /**\n * Export an image\n * @param name - Image name or ID\n * @param options - Export options\n * @returns Response with tarball\n */\n async get(name: string, options?: ExportImageOptions): Promise<Response> {\n return await this.request(`/images/${name}/get`, \"GET\", undefined, undefined, options)\n }\n\n /**\n * Export multiple images\n * @param options - Export options\n * @returns Response with tarball\n */\n async getAll(options?: ExportAllImagesOptions): Promise<Response> {\n return await this.request(`/images/get`, \"GET\", undefined, undefined, options)\n }\n\n /**\n * Load images\n * @param options - Load options\n * @returns Load response\n */\n async load(options: LoadImageOptions): Promise<unknown> {\n const res = await this.request(\n `/images/load`,\n \"POST\",\n options.imagesTarball,\n undefined,\n options\n )\n return await res.json()\n }\n\n /**\n * Build an image from a tar archive with a Dockerfile in it.\n * The Dockerfile specifies how the image is built from the tar archive.\n * It is typically in the archive's root,\n * but can be at a different path or have a different name by specifying the dockerfile parameter.\n * See the Dockerfile reference for more information.\n *\n * The Docker daemon performs a preliminary validation of the Dockerfile before starting the build,\n * and returns an error if the syntax is incorrect.\n * After that, each instruction is run one-by-one until the ID of the new image is output.\n *\n * The build is canceled if the client drops the connection by quitting or being killed.\n * @param options - Build options\n * @returns Build info\n */\n async build(options: BuildImageOptions): Promise<boolean> {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/x-tar\",\n }\n if (options.authConfig) {\n headers[\"X-Registry-Config\"] = options.authConfig\n }\n\n await this.request(`/build`, \"POST\", options.inputStream, headers, options)\n return true\n }\n\n /**\n * Prune build cache\n * @param options - Prune build cache options\n * @returns Build cache disk usage\n */\n async pruneBuild(options?: PruneBuildCacheOptions): Promise<BuildCacheDiskUsage> {\n const res = await this.request(`/build/prune`, \"POST\", undefined, undefined, options)\n return (await res.json()) as BuildCacheDiskUsage\n }\n\n /**\n * Commit a container as an image\n * @param container - Container ID or name\n * @param options - Commit options\n * @returns Image ID\n */\n async commit(containerConfig: CommitBody, options: CommitParams): Promise<ImageID> {\n const res = await this.request(`/commit`, \"POST\", containerConfig, undefined, options)\n return (await res.json()) as ImageID\n }\n}\n",
|
|
15
|
-
"import { BaseModule } from \"../base\"\nimport type {\n CreateNetworkOptions,\n ListNetworksOptions,\n NetworkConnectRequest,\n NetworkCreateResponse,\n NetworkDisconnectRequest,\n NetworkInspect,\n NetworkPruneResponse,\n NetworkSummary,\n PruneNetworksOptions,\n} from \"./types\"\n\n/**\n * Networks module for managing Docker networks\n */\nexport class NetworksModule extends BaseModule {\n /**\n * List networks\n * @param options - List options including filters\n * @returns Array of network summaries\n */\n async list(options?: ListNetworksOptions): Promise<NetworkSummary[]> {\n const res = await this.request(`/networks`, \"GET\", undefined, undefined, options)\n return (await res.json()) as NetworkSummary[]\n }\n\n /**\n * Create a network\n * @param config - Network configuration\n * @returns Network create response with ID and warnings\n */\n async create(config: CreateNetworkOptions): Promise<NetworkCreateResponse> {\n const res = await this.request(\"/networks/create\", \"POST\", config)\n return (await res.json()) as NetworkCreateResponse\n }\n\n /**\n * Inspect a network\n * @param id - Network ID or name\n * @param options - Inspect options\n * @returns Detailed network information\n */\n async inspect(\n id: string,\n options?: { verbose?: boolean; scope?: string }\n ): Promise<NetworkInspect> {\n const res = await this.request(`/networks/${id}`, \"GET\", undefined, undefined, options)\n return (await res.json()) as NetworkInspect\n }\n\n /**\n * Remove a network\n * @param id - Network ID or name\n */\n async remove(id: string): Promise<void> {\n await this.request(`/networks/${id}`, \"DELETE\")\n }\n\n /**\n * Connect a container to a network\n * @param id - Network ID or name\n * @param request - Connection request with container and endpoint config\n */\n async connect(id: string, request: NetworkConnectRequest): Promise<void> {\n await this.request(`/networks/${id}/connect`, \"POST\", request)\n }\n\n /**\n * Disconnect a container from a network\n * @param id - Network ID or name\n * @param request - Disconnection request with container and force option\n */\n async disconnect(id: string, request: NetworkDisconnectRequest): Promise<void> {\n await this.request(`/networks/${id}/disconnect`, \"POST\", request)\n }\n\n /**\n * Remove unused networks\n * @param options - Prune options including filters\n * @returns Prune response with deleted networks\n */\n async prune(options?: PruneNetworksOptions): Promise<NetworkPruneResponse> {\n const res = await this.request(`/networks/prune`, \"POST\", undefined, undefined, options)\n return (await res.json()) as NetworkPruneResponse\n }\n}\n",
|
|
16
|
-
"import { BaseModule } from \"../base\"\nimport type { ListNodesOptions, NodeResponse, NodeUpdateOptions } from \"./types\"\n\nexport class NodesModule extends BaseModule {\n /**\n * List nodes\n * @param options Filters to process on the nodes list, encoded as JSON (a Record<string, string[]>).\n * @returns NodeResponse[]\n */\n async list(options?: ListNodesOptions) {\n const res = await this.request(`/nodes`, \"GET\", undefined, undefined, options)\n return (await res.json()) as NodeResponse[]\n }\n\n /**\n * Inspect a node\n * @param id The ID or name of the node\n */\n async inspect(id: string) {\n const res = await this.request(`/nodes/${id}`, \"GET\")\n return (await res.json()) as NodeResponse\n }\n\n /**\n *\n * @param id The ID or name of the node\n * @param force Force remove a node from the swarm (Default: false)\n * @returns `true` or throws an DockerError\n */\n async delete(id: string, force: boolean = false) {\n await this.request(`/nodes/${id}`, \"DELETE\", undefined, undefined, { force })\n // No thrown error = sucess\n return true\n }\n\n /**\n *\n * @param id The ID or name of the node\n * @param version The version number of the node object being updated. This is required to avoid conflicting writes.\n * @param options What to update\n * @returns\n */\n async update(id: string, version: number, options: NodeUpdateOptions) {\n await this.request(`/nodes/${id}/update`, \"POST\", options, undefined, { version })\n // No thrown error = sucess\n return true\n }\n}\n",
|
|
17
|
-
"import { BaseModule } from \"../base\"\nimport type {\n ListVolumesOptions,\n PruneVolumesOptions,\n Volume,\n VolumeCreateRequest,\n VolumeListResponse,\n VolumePruneResponse,\n VolumeUpdateRequest,\n} from \"./types\"\n\n/**\n * Volume module for Docker API\n */\nexport class VolumeModule extends BaseModule {\n /**\n * List volumes\n */\n async list(options?: ListVolumesOptions): Promise<VolumeListResponse> {\n const res = await this.request(`/volumes`, \"GET\", undefined, undefined, options)\n return (await res.json()) as VolumeListResponse\n }\n\n /**\n * Create a volume\n */\n async create(config: VolumeCreateRequest): Promise<Volume> {\n const res = await this.request(\"/volumes/create\", \"POST\", config)\n return (await res.json()) as Volume\n }\n\n /**\n * Inspect a volume\n */\n async inspect(name: string): Promise<Volume> {\n const res = await this.request(`/volumes/${encodeURIComponent(name)}`)\n return (await res.json()) as Volume\n }\n\n /**\n * Update a volume (for cluster volumes only)\n */\n async update(name: string, body: VolumeUpdateRequest, version: number): Promise<void> {\n await this.request(`/volumes/${encodeURIComponent(name)}`, \"PUT\", body, undefined, {\n version,\n })\n }\n\n /**\n * Remove a volume\n */\n async remove(name: string, force: boolean = false): Promise<void> {\n await this.request(`/volumes/${encodeURIComponent(name)}`, \"DELETE\", undefined, undefined, {\n force,\n })\n }\n\n /**\n * Prune unused volumes\n */\n async prune(options?: PruneVolumesOptions): Promise<VolumePruneResponse> {\n const res = await this.request(`/volumes/prune`, \"POST\", undefined, undefined, options)\n return (await res.json()) as VolumePruneResponse\n }\n}\n",
|
|
18
|
-
"import { BaseModule } from \"./modules/base\"\nimport type { ConnectionConfig } from \"./modules/base/types\"\nimport { ContainerModule } from \"./modules/container\"\nimport { DistributionModule } from \"./modules/distribution\"\nimport { ExecModule } from \"./modules/exec\"\nimport { ImagesModule } from \"./modules/images\"\nimport { NetworksModule } from \"./modules/networks\"\nimport { NodesModule } from \"./modules/nodes\"\nimport { VolumeModule } from \"./modules/volumes\"\n\nexport class Docker {\n public readonly containers: ContainerModule\n public readonly images: ImagesModule\n public readonly networks: NetworksModule\n public readonly volumes: VolumeModule\n public readonly exec: ExecModule\n public readonly distribution: DistributionModule\n public readonly nodes: NodesModule\n\n constructor(private config: ConnectionConfig) {\n this.containers = new ContainerModule(config)\n this.images = new ImagesModule(config)\n this.networks = new NetworksModule(config)\n this.volumes = new VolumeModule(config)\n this.exec = new ExecModule(config)\n this.distribution = new DistributionModule(config)\n this.nodes = new NodesModule(config)\n }\n\n async ping(): Promise<boolean> {\n const requester = new BaseModule(this.config)\n const res = await requester.request(\"/_ping\", \"GET\")\n return res.ok\n }\n}\n",
|
|
19
|
-
"import { env } from \"node:process\"\nimport type { ConnectionConfig } from \"../modules/base/types\"\n\nconst loadTls = () => {\n const hasCerts = env.CERT_FILE && env.KEY_FILE\n if (!hasCerts) return undefined\n\n return {\n ca: env.CA_FILE ? Bun.file(env.CA_FILE) : undefined,\n cert: env.CERT_FILE ? Bun.file(env.CERT_FILE) : undefined,\n key: env.KEY_FILE ? Bun.file(env.KEY_FILE) : undefined,\n }\n}\n\nexport const getConnectionConfig = (): ConnectionConfig => {\n const rawHost = env.DOCKER_SOCKET || \"/var/run/docker.sock\"\n const tls = loadTls()\n\n if (rawHost.startsWith(\"unix://\")) {\n return {\n mode: \"unix\",\n socketPath: rawHost.replace(\"unix://\", \"\"),\n tls,\n }\n }\n\n if (rawHost.startsWith(\"tcp://\") || rawHost.startsWith(\"http://\")) {\n let protocol = \"http://\"\n\n if (tls) {\n protocol = \"https://\"\n }\n\n const cleanHost = rawHost.replace(/^tcp:\\/\\/|^http:\\/\\//, \"\")\n\n return {\n mode: \"tcp\",\n baseUrl: `${protocol}${cleanHost}`,\n tls,\n }\n }\n\n return {\n mode: \"unix\",\n socketPath: rawHost,\n tls,\n }\n}\n",
|
|
20
|
-
"import { Docker } from \"./docker\"\nimport { getConnectionConfig } from \"./utils/env\"\n\nexport const createDockerFromEnv = () => {\n const config = getConnectionConfig()\n return new Docker(config)\n}\n\nexport { Docker }\n"
|
|
21
|
-
],
|
|
22
|
-
"mappings": "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",
|
|
23
|
-
"debugId": "40EE64B63FEAD90664756E2164756E21",
|
|
24
|
-
"names": []
|
|
25
|
-
}
|