doru 1.0.0 → 1.1.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/README.md +9 -7
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/ui/app.js +198 -162
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/styles.css +354 -156
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,8 @@ Small Node.js network interception **library + CLI** with a web UI.
|
|
|
8
8
|
|
|
9
9
|
> Requires Node **22+**
|
|
10
10
|
|
|
11
|
+
https://github.com/user-attachments/assets/2f7e7f51-f8d2-4056-aa27-d2712d98b32b
|
|
12
|
+
|
|
11
13
|
## Install
|
|
12
14
|
|
|
13
15
|
```bash
|
|
@@ -54,17 +56,17 @@ bun install
|
|
|
54
56
|
|
|
55
57
|
### UI Development
|
|
56
58
|
|
|
57
|
-
The web UI uses React + Vite.
|
|
59
|
+
The web UI uses React + Vite. Run the dev server standalone — no doru CLI
|
|
60
|
+
process is needed:
|
|
58
61
|
|
|
59
62
|
```bash
|
|
60
|
-
#
|
|
61
|
-
src/cli.ts --ui capture.jsonl
|
|
62
|
-
|
|
63
|
-
# 2. start Vite dev server and open open http://localhost:5173
|
|
64
|
-
bun run dev:ui
|
|
63
|
+
bun run dev:ui # http://localhost:5173, with hot module reloading
|
|
65
64
|
```
|
|
66
65
|
|
|
67
|
-
Vite
|
|
66
|
+
A Vite dev middleware serves a built-in fixture of sample example.com captures
|
|
67
|
+
(`src/ui/fixtures/example-capture.jsonl`) from `/api/capture` and
|
|
68
|
+
`/api/capture/stream`, mirroring the contract of the production CLI server
|
|
69
|
+
(`src/cli/server.ts`). Edit the fixture to exercise different UI states.
|
|
68
70
|
|
|
69
71
|
### CLI Development
|
|
70
72
|
|
package/dist/cli.js
CHANGED
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/cli/argument-parser.ts","../src/core/config.ts","../src/cli/config-loader.ts","../src/core/module-detection.ts","../src/cli/utils.ts","../src/cli/script-executor.ts","../src/cli/server.ts","../src/cli.ts"],"names":["z","fs","path","fs2","path2","fileURLToPath","path3","spawn","resolve","net","dirname","fs3","path4","os","fs4","fs5","path5","http","__dirname_shim","path6","fs6"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"doru\",\n \"version\": \"1.0.0\",\n \"type\": \"commonjs\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"doru\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"dev:ui\": \"vite\",\n \"type-check\": \"tsc --noEmit\",\n \"storybook\": \"storybook dev -p 6006\",\n \"build-storybook\": \"storybook build\"\n },\n \"devDependencies\": {\n \"@vitejs/plugin-react\": \"^5.1.2\",\n \"@storybook/react-vite\": \"^10.1.4\",\n \"vite\": \"^7.3.0\",\n \"@types/node\": \"^25.0.3\",\n \"@types/react\": \"^19.2.7\",\n \"@types/react-dom\": \"^19.2.3\",\n \"react\": \"^19.2.3\",\n \"react-dom\": \"^19.2.3\",\n \"storybook\": \"^10.1.4\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\"\n },\n \"dependencies\": {\n \"@mswjs/interceptors\": \"^0.40.0\",\n \"@tanstack/react-virtual\": \"^3.13.13\",\n \"@microlink/react-json-view\": \"^1.26.1\",\n \"react-resizable-panels\": \"^4.0.13\",\n \"zod\": \"^4.2.1\"\n },\n \"engines\": {\n \"node\": \">=22\"\n }\n}\n","import pkg from \"../../package.json\";\n\nexport interface CLIOptions {\n // core\n script?: string;\n scriptArgs?: string[];\n output?: string;\n format?: \"json\" | \"jsonl\";\n config?: string;\n debug?: boolean;\n help?: boolean;\n version?: boolean;\n // UI\n ui?: string;\n uiMode?: \"explorer\" | \"live\";\n // limits & filters\n maxFileSize?: string;\n includeHosts?: string[];\n excludeHosts?: string[];\n includePaths?: string[];\n excludePaths?: string[];\n methods?: string[];\n minStatusCode?: number;\n maxStatusCode?: number;\n}\n\nexport const printHelp = (): void => {\n console.log(`\ndoru v${pkg.version}\nMinimal network traffic interceptor for Node.js\n\nUSAGE:\n doru run [options] <script> [-- <script-args>]\n doru --ui <capture.json|jsonl> # Explore\n doru --ui <script> [-- <script-args>] # Live UI (run script + UI)\n\nOPTIONS:\n -o, --output <file> Output file (default: ./network-capture.jsonl)\n -f, --format <fmt> json | jsonl (default: jsonl)\n -c, --config <file> Config file path (JSON or JS)\n --ui <path> Explorer (capture file) or Live (script path)\n --debug Enable debug logs\n --max-file-size <size> e.g. 10MB, 500KB\n --include-hosts <list> Comma-separated host filters (string or /regex/)\n --exclude-hosts <list> Comma-separated host filters\n --include-paths <list> Comma-separated regex patterns\n --exclude-paths <list> Comma-separated regex patterns\n --methods <list> Comma-separated HTTP methods (e.g. GET,POST)\n --min-status <code> Minimum status code\n --max-status <code> Maximum status code\n -h, --help Show help\n -v, --version Show version\n\nEXAMPLES:\n doru run server.js\n doru run app.mjs -- --port 3000\n doru --ui capture.jsonl\n doru --ui app.mjs -- --port 8080 # Live UI\n`);\n};\n\nexport const parseArguments = (args: string[]): CLIOptions => {\n const opts: CLIOptions = {};\n const sep = args.indexOf(\"--\");\n let doruArgs: string[] = args;\n if (sep !== -1) {\n doruArgs = args.slice(0, sep);\n opts.scriptArgs = args.slice(sep + 1);\n }\n\n // handle optional \"run\" subcommand\n if (doruArgs[0] === \"run\") doruArgs = doruArgs.slice(1);\n\n const takeNext = (i: number): string => {\n const n = doruArgs[i + 1];\n if (!n || n.startsWith(\"-\")) throw new Error(`Missing value for ${doruArgs[i]}`);\n return n;\n };\n\n const setNumber = (s: string, flag: string): number => {\n const v = Number.parseInt(s);\n if (Number.isNaN(v)) throw new Error(`${flag} must be a number`);\n return v;\n };\n\n for (let i = 0; i < doruArgs.length; i++) {\n const a = doruArgs[i];\n switch (a) {\n case \"-h\":\n case \"--help\": {\n opts.help = true;\n break;\n }\n case \"-v\":\n case \"--version\": {\n opts.version = true;\n break;\n }\n case \"-o\":\n case \"--output\": {\n opts.output = takeNext(i);\n i++;\n break;\n }\n case \"-f\":\n case \"--format\": {\n const n = takeNext(i);\n if (n !== \"json\" && n !== \"jsonl\") throw new Error(\"--format must be json or jsonl\");\n opts.format = n;\n i++;\n break;\n }\n case \"-c\":\n case \"--config\": {\n opts.config = takeNext(i);\n i++;\n break;\n }\n case \"--ui\": {\n const n = takeNext(i);\n opts.ui = n;\n if (/\\.(json|jsonl)$/i.test(n)) opts.uiMode = \"explorer\";\n else {\n opts.uiMode = \"live\";\n if (!opts.script) opts.script = n;\n }\n i++;\n break;\n }\n case \"--debug\": {\n opts.debug = true;\n break;\n }\n case \"--max-file-size\": {\n opts.maxFileSize = takeNext(i);\n i++;\n break;\n }\n case \"--include-hosts\": {\n opts.includeHosts = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--exclude-hosts\": {\n opts.excludeHosts = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--include-paths\": {\n opts.includePaths = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--exclude-paths\": {\n opts.excludePaths = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--methods\": {\n opts.methods = takeNext(i)\n .split(\",\")\n .map((s) => s.trim().toUpperCase());\n i++;\n break;\n }\n case \"--min-status\": {\n const v = setNumber(takeNext(i), \"--min-status\");\n if (v < 100 || v > 599) throw new Error(\"--min-status must be 100..599\");\n opts.minStatusCode = v;\n i++;\n break;\n }\n case \"--max-status\": {\n const v = setNumber(takeNext(i), \"--max-status\");\n if (v < 100 || v > 599) throw new Error(\"--max-status must be 100..599\");\n opts.maxStatusCode = v;\n i++;\n break;\n }\n default: {\n if (a.startsWith(\"-\")) throw new Error(`Unknown option: ${a}`);\n if (opts.script) throw new Error(`Unexpected argument: ${a}`);\n opts.script = a;\n }\n }\n }\n\n return opts;\n};\n\nexport const parseFileSize = (size: string): number => {\n // eslint-disable-next-line security/detect-unsafe-regex\n const m = /^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb)?$/i.exec(size.trim());\n if (!m) throw new Error(`Invalid size: ${size}. Use 10MB, 500KB, etc.`);\n const value = Number.parseFloat(m[1]);\n const unit = (m[2] || \"b\").toLowerCase();\n const mul = { b: 1, kb: 1024, mb: 1024 * 1024, gb: 1024 * 1024 * 1024 } as const;\n return Math.floor(value * mul[unit as keyof typeof mul]);\n};\n","import { z } from \"zod\";\n\nconst statusCodesSchema = z\n .object({\n min: z.number().int().min(100).max(599).nullable().default(null),\n max: z.number().int().min(100).max(599).nullable().default(null),\n })\n .refine((s) => s.min === null || s.max === null || s.min <= s.max, {\n message: \"filters.statusCodes.min must be <= filters.statusCodes.max\",\n });\n\nconst filtersSchema = z.object({\n includeHosts: z.array(z.string()).default([]),\n excludeHosts: z.array(z.string()).default([]),\n includePaths: z.array(z.string()).default([]),\n excludePaths: z.array(z.string()).default([]),\n methods: z.array(z.string()).default([]),\n statusCodes: statusCodesSchema.default({ min: null, max: null }),\n minSize: z.number().int().nullable().default(null),\n maxSize: z.number().int().nullable().default(null),\n});\n\nconst performanceSchema = z.object({\n bufferSize: z.number().int().positive().default(1024),\n flushInterval: z.number().int().positive().default(1000),\n compression: z.boolean().default(false), // minimal core: compression disabled by default\n});\n\nexport const doruConfigSchema = z.object({\n enabled: z.boolean().default(true),\n outputFile: z.string().default(\"./network-capture.jsonl\"),\n format: z.enum([\"json\", \"jsonl\"]).default(\"jsonl\"),\n maxFileSize: z\n .number()\n .int()\n .positive()\n .default(10 * 1024 * 1024), // 10MB\n filters: filtersSchema.default({\n includeHosts: [],\n excludeHosts: [],\n includePaths: [],\n excludePaths: [],\n methods: [],\n statusCodes: { min: null, max: null },\n minSize: null,\n maxSize: null,\n }),\n performance: performanceSchema.default({\n bufferSize: 1024,\n flushInterval: 1000,\n compression: false,\n }),\n debug: z.boolean().default(false),\n});\nexport type InterceptorConfig = z.infer<typeof doruConfigSchema>;\n\nconst deepMerge = <T extends Record<string, unknown>>(a: T, b: Partial<T>): T => {\n const out: T = { ...a };\n for (const [k, v] of Object.entries(b || ({} as Partial<T>))) {\n if (v === undefined) continue;\n const key = k as keyof T;\n const av = a[key];\n if (Array.isArray(v)) {\n (out as unknown as Record<string, unknown>)[key as string] = (v as unknown[]).slice();\n } else if (v && typeof v === \"object\" && av && typeof av === \"object\" && !Array.isArray(av)) {\n (out as unknown as Record<string, unknown>)[key as string] = deepMerge(\n av as Record<string, unknown>,\n v as Record<string, unknown>,\n ) as unknown as T[keyof T];\n } else (out as unknown as Record<string, unknown>)[key as string] = v as T[keyof T];\n }\n return out;\n};\n\nconst envDebugDefault = (): boolean => {\n const v = process.env.DORU_DEBUG;\n if (v === \"true\") return true;\n if (v === \"false\") return false;\n const legacy = process.env.NETPEEK_DEBUG;\n if (legacy === \"true\") return true;\n if (legacy === \"false\") return false;\n return false;\n};\n\nconst normalizeConfig = (c: InterceptorConfig): InterceptorConfig => {\n return {\n ...c,\n filters: {\n ...c.filters,\n methods: c.filters.methods.map((m) => m.toUpperCase()),\n },\n };\n};\n\nexport const createDefaultConfig = (user: Partial<InterceptorConfig> = {}): InterceptorConfig => {\n const defaults = doruConfigSchema.parse({});\n const merged = deepMerge(defaults, { ...user, debug: user.debug ?? envDebugDefault() });\n const parsed = doruConfigSchema.parse(merged);\n return normalizeConfig(parsed);\n};\n\nexport const validateConfig = (config: InterceptorConfig): { valid: boolean; errors: string[] } => {\n const res = doruConfigSchema.safeParse(config);\n if (res.success) return { valid: true, errors: [] };\n return {\n valid: false,\n errors: res.error.issues.map((i) => {\n const where = i.path.length > 0 ? ` at ${i.path.join(\".\")}` : \"\";\n return i.message + where;\n }),\n };\n};\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { InterceptorConfig } from \"../core/config\";\nimport type { CLIOptions } from \"./argument-parser\";\nimport { createDefaultConfig } from \"../core/config\";\nimport { parseFileSize } from \"./argument-parser\";\n\nexport const loadConfig = async (configPath?: string): Promise<Partial<InterceptorConfig>> => {\n const candidates =\n configPath ?\n [configPath]\n : [\"doru.config.json\", \"doru.config.js\", \".dorurc.json\", \".dorurc.js\", \"package.json\"];\n\n for (const file of candidates) {\n try {\n if (!fs.existsSync(file)) continue;\n\n if (file.endsWith(\".json\")) {\n const txt = fs.readFileSync(file, \"utf8\");\n const parsed = JSON.parse(txt);\n if (path.basename(file) === \"package.json\") return parsed.doru || {};\n return parsed;\n }\n if (file.endsWith(\".js\")) {\n const full = path.resolve(file);\n const mod: unknown = await import(full);\n const obj = mod as Record<string, unknown> | null;\n const hasDefault = obj && typeof obj === \"object\" && \"default\" in obj;\n return (hasDefault ? (obj as { default: unknown }).default : obj) as Record<string, unknown>;\n }\n } catch (error: unknown) {\n if (configPath) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config file ${file}: ${msg}`);\n }\n }\n }\n\n return {};\n};\n\nexport const buildConfig = (opts: CLIOptions, fileCfg: Partial<InterceptorConfig>): InterceptorConfig => {\n const base: Partial<InterceptorConfig> = {\n outputFile: opts.output ?? fileCfg.outputFile ?? \"./network-capture.jsonl\",\n format: opts.format ?? fileCfg.format ?? \"jsonl\",\n maxFileSize: fileCfg.maxFileSize ?? 10 * 1024 * 1024,\n filters: {\n includeHosts: opts.includeHosts ?? fileCfg.filters?.includeHosts ?? [],\n excludeHosts: opts.excludeHosts ?? fileCfg.filters?.excludeHosts ?? [],\n includePaths: opts.includePaths ?? fileCfg.filters?.includePaths ?? [],\n excludePaths: opts.excludePaths ?? fileCfg.filters?.excludePaths ?? [],\n methods: opts.methods ?? fileCfg.filters?.methods ?? [],\n statusCodes: {\n min: opts.minStatusCode ?? fileCfg.filters?.statusCodes?.min ?? null,\n max: opts.maxStatusCode ?? fileCfg.filters?.statusCodes?.max ?? null,\n },\n minSize: fileCfg.filters?.minSize ?? null,\n maxSize: fileCfg.filters?.maxSize ?? null,\n },\n performance: fileCfg.performance ?? {\n bufferSize: 1024,\n flushInterval: 1000,\n compression: false,\n },\n debug: opts.debug ?? fileCfg.debug ?? false,\n enabled: true,\n };\n\n if (opts.maxFileSize) base.maxFileSize = parseFileSize(opts.maxFileSize);\n return createDefaultConfig(base);\n};\n","import * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport type ModuleType = \"cjs\" | \"esm\";\nexport interface ModuleDetectionResult {\n type: ModuleType;\n confidence: \"high\" | \"low\" | \"medium\";\n reason: string;\n}\n\nconst tryRead = (filePath: string): string | null => {\n try {\n if (!fs.existsSync(filePath)) return null;\n return fs.readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n};\n\nconst getPackageJsonType = (filePath: string): \"commonjs\" | \"module\" | null => {\n let dir = path.dirname(path.resolve(filePath));\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const parent = path.dirname(dir);\n const pj = path.join(dir, \"package.json\");\n try {\n if (fs.existsSync(pj)) {\n const json = JSON.parse(fs.readFileSync(pj, \"utf8\"));\n if (json.type === \"module\") return \"module\";\n if (json.type === \"commonjs\") return \"commonjs\";\n return \"commonjs\";\n }\n } catch {}\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n};\n\nexport const detectModuleType = (filePath: string): ModuleDetectionResult => {\n const ext = path.extname(filePath);\n if (ext === \".mjs\") return { type: \"esm\", confidence: \"high\", reason: \"File extension .mjs\" };\n if (ext === \".cjs\") return { type: \"cjs\", confidence: \"high\", reason: \"File extension .cjs\" };\n\n if (ext === \".js\") {\n const t = getPackageJsonType(filePath);\n if (t === \"module\") {\n return { type: \"esm\", confidence: \"high\", reason: 'package.json has \"type\":\"module\"' };\n }\n if (t === \"commonjs\") {\n return { type: \"cjs\", confidence: \"high\", reason: 'package.json has \"type\":\"commonjs\"' };\n }\n\n const content = tryRead(filePath);\n if (content !== null) {\n const hasESM = /(^|\\s)import\\s+|(^|\\s)export\\s+/m.test(content);\n const hasCJS = /\\brequire\\s*\\(|\\bmodule\\.exports\\b|\\bexports\\./m.test(content);\n if (hasESM && !hasCJS) return { type: \"esm\", confidence: \"medium\", reason: \"ESM syntax only\" };\n if (hasCJS && !hasESM) return { type: \"cjs\", confidence: \"medium\", reason: \"CommonJS syntax only\" };\n if (hasESM && hasCJS) {\n return { type: \"cjs\", confidence: \"low\", reason: \"Mixed syntax; defaulting to CJS\" };\n }\n }\n }\n\n return { type: \"cjs\", confidence: \"medium\", reason: \"Default (no explicit type)\" };\n};\n","import { spawn } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as net from \"net\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const getFilename = (): string => {\n return typeof __filename === \"undefined\" ? fileURLToPath(import.meta.url) : __filename;\n};\n\nexport const getDirname = (): string => {\n return typeof __dirname === \"undefined\" ? path.dirname(getFilename()) : __dirname;\n};\n\nexport const openBrowser = (url: string): void => {\n try {\n if (process.platform === \"darwin\") {\n spawn(\"open\", [url], { stdio: \"ignore\", detached: true }).unref();\n } else if (process.platform === \"win32\") {\n spawn(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\", detached: true }).unref();\n } else {\n spawn(\"xdg-open\", [url], { stdio: \"ignore\", detached: true }).unref();\n }\n } catch {}\n};\n\nexport const findPort = (start = 8333, attempts = 10): Promise<number> =>\n new Promise((resolve, reject) => {\n let port = start;\n let tried = 0;\n\n const tryNext = (): void => {\n const srv = net.createServer();\n srv.unref();\n srv.once(\"error\", (e: NodeJS.ErrnoException) => {\n if (e.code === \"EADDRINUSE\" && ++tried < attempts) {\n port++;\n tryNext();\n } else {\n reject(e);\n }\n });\n srv.listen(port, \"127.0.0.1\", () => {\n srv.close(() => resolve(port));\n });\n };\n\n tryNext();\n });\n\nexport const isDevMode = (dirname: string): boolean => {\n return dirname.includes(\"src/cli\") || dirname.includes(\"src\\\\cli\");\n};\n\nexport const findUIAsset = (dirname: string): string | null => {\n // production: cli.js is in dist/, ui/app.js is in dist/ui/\n const prodPath = path.join(dirname, \"ui\", \"app.js\");\n if (fs.existsSync(prodPath)) return prodPath;\n\n // dev mode: running from src/cli/, look for dist/ui/app.js at project root\n const devPath = path.resolve(dirname, \"../../dist/ui/app.js\");\n if (fs.existsSync(devPath)) return devPath;\n\n return null;\n};\n","import { type ChildProcess, spawn } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport type { InterceptorConfig } from \"../core/config\";\nimport { detectModuleType } from \"../core/module-detection\";\nimport { getDirname } from \"./utils\";\n\nconst __dirname_shim = getDirname();\n\ninterface PreloadPaths {\n cjs: string;\n esm: string;\n tempFiles: string[];\n entryCjs: string;\n}\n\nconst writeTemp = (name: string, content: string): string => {\n const p = path.join(os.tmpdir(), `doru-${process.pid}-${name}`);\n fs.writeFileSync(p, content, \"utf8\");\n return p;\n};\n\nconst genCjsPreload = (): string => `try {\n const b64 = process.env.DORU_CONFIG_BASE64 || '';\n const entry = process.env.DORU_ENTRY_CJS;\n if (!entry) throw new Error('DORU_ENTRY_CJS not set');\n const cfg = b64 ? JSON.parse(Buffer.from(b64, 'base64').toString('utf8')) : {};\n const doru = require(entry);\n const api = doru.createInterceptor(cfg);\n globalThis.__doru__ = api;\n api.start();\n process.on('exit', () => { try { api.stop(); } catch {} });\n} catch (e) {\n console.error('doru preload failed:', e && e.message ? e.message : e);\n}`;\n\nconst genEsmPreload = (): string => `import { createRequire } from 'module';\ntry {\n const b64 = process.env.DORU_CONFIG_BASE64 || '';\n const entry = process.env.DORU_ENTRY_CJS;\n if (!entry) throw new Error('DORU_ENTRY_CJS not set');\n const cfg = b64 ? JSON.parse(Buffer.from(b64, 'base64').toString('utf8')) : {};\n const require = createRequire(import.meta.url);\n const doru = require(entry);\n const api = doru.createInterceptor(cfg);\n globalThis.__doru__ = api;\n api.start();\n process.on('exit', () => { try { api.stop(); } catch {} });\n} catch (e) {\n console.error('doru preload failed:', e && e.message ? e.message : e);\n}`;\n\nconst findLibraryEntry = (): string => {\n const prodEntry = path.resolve(__dirname_shim, \"index.js\");\n if (fs.existsSync(prodEntry)) return prodEntry;\n const devEntry = path.resolve(__dirname_shim, \"../../dist/index.js\");\n if (fs.existsSync(devEntry)) return devEntry;\n throw new Error(\n `doru library not found. Checked:\\n - ${prodEntry}\\n - ${devEntry}\\nRun \"bun run build\" first.`,\n );\n};\n\nlet cleanupRegistered = false;\nlet pendingCleanupFiles: string[] = [];\n\nconst registerProcessCleanup = (files: string[]): void => {\n pendingCleanupFiles = files;\n\n if (cleanupRegistered) return;\n cleanupRegistered = true;\n\n const doCleanup = () => {\n for (const f of pendingCleanupFiles) {\n try {\n fs.unlinkSync(f);\n } catch {}\n }\n pendingCleanupFiles = [];\n };\n\n // register cleanup\n process.on(\"exit\", doCleanup);\n process.on(\"SIGTERM\", () => {\n doCleanup();\n process.exit(143);\n });\n process.on(\"uncaughtException\", (err) => {\n doCleanup();\n console.error(\"Uncaught exception:\", err);\n process.exit(1);\n });\n};\n\nconst preparePreloadArtifacts = (): PreloadPaths => {\n const entryCjs = findLibraryEntry();\n const cjs = writeTemp(\"preload.cjs\", genCjsPreload());\n const esm = writeTemp(\"preload.mjs\", genEsmPreload());\n const tempFiles = [cjs, esm];\n registerProcessCleanup(tempFiles);\n return { cjs, esm, tempFiles, entryCjs };\n};\n\nconst handle = (child: ChildProcess, temps: string[]): Promise<void> =>\n new Promise((resolve, reject) => {\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n for (const f of temps) {\n try {\n fs.unlinkSync(f);\n } catch {}\n }\n pendingCleanupFiles = pendingCleanupFiles.filter((f) => !temps.includes(f));\n };\n\n child.on(\"close\", (code) => {\n cleanup();\n if (code === 0) resolve();\n else reject(new Error(`Script exited with code ${code}`));\n });\n child.on(\"error\", (err) => {\n cleanup();\n reject(err);\n });\n\n process.on(\"SIGINT\", () => {\n if (cleaned) return;\n\n console.log(\"\\nReceived SIGINT, terminating...\");\n cleanup();\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, 1000);\n });\n });\n\nconst runCJS = async (script: string, env: NodeJS.ProcessEnv, pl: PreloadPaths, scriptArgs?: string[]) => {\n const args = [\"--require\", pl.cjs, script];\n if (scriptArgs?.length) args.push(...scriptArgs);\n const child = spawn(\"node\", args, { stdio: \"inherit\", env });\n await handle(child, pl.tempFiles);\n};\n\nconst runESM = async (script: string, env: NodeJS.ProcessEnv, pl: PreloadPaths, scriptArgs?: string[]) => {\n const args = [\"--import\", pl.esm, script];\n if (scriptArgs?.length) args.push(...scriptArgs);\n const child = spawn(\"node\", args, { stdio: \"inherit\", env });\n await handle(child, pl.tempFiles);\n};\n\nexport const runScript = async (\n script: string,\n config: InterceptorConfig,\n scriptArgs?: string[],\n): Promise<void> => {\n const detection = detectModuleType(script);\n const artifacts = preparePreloadArtifacts();\n\n const env = {\n ...process.env,\n DORU_CONFIG_BASE64: Buffer.from(JSON.stringify(config), \"utf8\").toString(\"base64\"),\n DORU_ENTRY_CJS: artifacts.entryCjs,\n };\n\n if (detection.type === \"esm\") {\n await runESM(script, env, artifacts, scriptArgs);\n } else {\n await runCJS(script, env, artifacts, scriptArgs);\n }\n};\n","import * as fs from \"fs\";\nimport * as http from \"http\";\nimport * as path from \"path\";\nimport { findUIAsset, isDevMode } from \"./utils\";\n\nexport interface ServerConfig {\n captureFile: string;\n dirname: string;\n}\n\nconst VITE_DEV_PORT = 5173;\n\nconst serveFile = (res: http.ServerResponse, filePath: string, contentType: string): boolean => {\n try {\n if (!fs.existsSync(filePath)) return false;\n const content = fs.readFileSync(filePath, \"utf8\");\n res.writeHead(200, { \"Content-Type\": contentType, \"Cache-Control\": \"no-cache\" });\n res.end(content);\n return true;\n } catch {\n return false;\n }\n};\n\nconst findUIFile = (dirname: string, filename: string): string | null => {\n // production: files in dist/ui/\n const prodPath = path.join(dirname, \"ui\", filename);\n if (fs.existsSync(prodPath)) return prodPath;\n // dev: files in src/ui/\n const devPath = path.resolve(dirname, \"../../src/ui\", filename);\n if (fs.existsSync(devPath)) return devPath;\n return null;\n};\n\nexport const createUIServer = (config: ServerConfig): http.Server => {\n const { captureFile, dirname } = config;\n const devMode = isDevMode(dirname);\n\n return http.createServer((req, res) => {\n if (!req.url) return;\n\n // in dev mode, redirect requests to Vite\n if (devMode && (req.url === \"/\" || req.url.startsWith(\"/ui/\") || req.url.startsWith(\"/src/\"))) {\n res.writeHead(302, { Location: `http://localhost:${VITE_DEV_PORT}${req.url}` });\n res.end();\n return;\n }\n\n if (req.url === \"/\") {\n const htmlPath = findUIFile(dirname, \"index.html\");\n if (!htmlPath || !serveFile(res, htmlPath, \"text/html; charset=utf-8\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"UI not found. Run 'bun run build' first.\");\n }\n return;\n }\n\n if (req.url === \"/styles.css\") {\n const cssPath = findUIFile(dirname, \"styles.css\");\n if (!cssPath || !serveFile(res, cssPath, \"text/css; charset=utf-8\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"CSS not found\");\n }\n return;\n }\n\n if (req.url === \"/favicon.svg\" || req.url === \"/favicon-paused.svg\") {\n const filename = req.url.slice(1); // remove leading /\n const faviconPath = findUIFile(dirname, filename);\n if (!faviconPath || !serveFile(res, faviconPath, \"image/svg+xml\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Favicon not found\");\n }\n return;\n }\n\n if (req.url === \"/app.js\") {\n const jsPath = findUIAsset(dirname);\n if (!jsPath || !serveFile(res, jsPath, \"text/javascript; charset=utf-8\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"UI bundle not found. Run 'bun run build' first.\");\n }\n return;\n }\n\n if (req.url === \"/api/capture\") {\n try {\n if (!fs.existsSync(captureFile)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(\"[]\");\n return;\n }\n const data = fs.readFileSync(captureFile, \"utf8\");\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(data);\n } catch {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Failed to read capture file\" }));\n }\n return;\n }\n\n if (req.url?.startsWith(\"/api/capture/stream\")) {\n try {\n const url = new URL(req.url, `http://${req.headers.host}`);\n let offset = Number.parseInt(url.searchParams.get(\"offset\") || \"0\");\n\n if (!fs.existsSync(captureFile)) {\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(JSON.stringify({ offset: 0, size: 0, generation: 0, data: \"\" }));\n return;\n }\n\n const stats = fs.statSync(captureFile);\n const fileSize = stats.size;\n const generation = stats.ino;\n\n // rotated\n if (offset > fileSize) {\n offset = 0;\n }\n\n // no new data\n if (offset >= fileSize) {\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(JSON.stringify({ offset: fileSize, size: fileSize, generation, data: \"\" }));\n return;\n }\n\n // read from offset\n const fd = fs.openSync(captureFile, \"r\");\n let data: string;\n try {\n const buffer = Buffer.alloc(fileSize - offset);\n fs.readSync(fd, buffer, 0, buffer.length, offset);\n data = buffer.toString(\"utf8\");\n } finally {\n fs.closeSync(fd);\n }\n\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(JSON.stringify({ offset: fileSize, size: fileSize, generation, data }));\n } catch {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Failed to read capture file\" }));\n }\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n });\n};\n\nexport const startServer = async (server: http.Server, port: number): Promise<string> => {\n await new Promise<void>((resolve) => {\n server.listen(port, resolve);\n });\n return `http://localhost:${port}`;\n};\n\nexport const createShutdownHandler = (server: http.Server): (() => void) => {\n let shutting = false;\n\n return (): void => {\n if (shutting) return;\n shutting = true;\n console.log(\"\\n\\u{1f44b} Shutting down UI...\");\n server.close(() => {\n process.exit(0);\n });\n setTimeout(() => {\n process.exit(0);\n }, 2000);\n };\n};\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { InterceptorConfig } from \"./core/config\";\nimport pkg from \"../package.json\";\nimport { type CLIOptions, parseArguments, printHelp } from \"./cli/argument-parser\";\nimport { buildConfig, loadConfig } from \"./cli/config-loader\";\nimport { runScript } from \"./cli/script-executor\";\nimport { createShutdownHandler, createUIServer, startServer } from \"./cli/server\";\nimport { findPort, getDirname, isDevMode, openBrowser } from \"./cli/utils\";\n\nconst __dirname_shim = getDirname();\n\nconst runScriptWithLiveUI = async (\n script: string,\n cfg: InterceptorConfig,\n args?: string[],\n): Promise<void> => {\n const port = await findPort(8333, 10);\n const server = createUIServer({ captureFile: cfg.outputFile, dirname: __dirname_shim });\n const devMode = isDevMode(__dirname_shim);\n\n const url = await startServer(server, port);\n if (devMode) {\n console.log(`\\u{1f310} doru API at ${url}`);\n console.log(`\\u{1f525} Dev mode: run 'bun run dev:ui' and open http://localhost:5173`);\n } else {\n console.log(`\\u{1f310} doru Live UI at ${url}`);\n openBrowser(url);\n }\n console.log(`\\u{1f3af} Script: ${script}`);\n console.log(`\\u{1f4c1} Capture: ${cfg.outputFile}`);\n console.log(\"Press Ctrl+C to stop\");\n\n const stop = createShutdownHandler(server);\n process.on(\"SIGINT\", stop);\n process.on(\"SIGTERM\", stop);\n\n try {\n await runScript(script, cfg, args);\n console.log(\"\\n\\u{2705} Script finished. UI still running \\u{2014} Ctrl+C to exit.\");\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n console.log(\"\\n\\u{274c} Script exited with error:\", msg);\n console.log(\"UI still running \\u{2014} Ctrl+C to exit.\");\n }\n\n await new Promise(() => {});\n};\n\nconst startExplorer = async (captureFile: string): Promise<void> => {\n const port = await findPort(8333, 10);\n const server = createUIServer({ captureFile, dirname: __dirname_shim });\n const devMode = isDevMode(__dirname_shim);\n\n const url = await startServer(server, port);\n if (devMode) {\n console.log(`\\u{1f310} doru API at ${url}`);\n console.log(`\\u{1f525} Dev mode: run 'bun run dev:ui' and open http://localhost:5173`);\n } else {\n console.log(`\\u{1f310} doru UI at ${url}`);\n openBrowser(url);\n }\n console.log(`\\u{1f4c1} Exploring: ${path.resolve(captureFile)}`);\n console.log(\"Press Ctrl+C to stop\");\n\n process.on(\"SIGINT\", createShutdownHandler(server));\n};\n\nconst main = async (): Promise<void> => {\n try {\n const argv = process.argv.slice(2);\n const opts: CLIOptions = parseArguments(argv);\n\n if (opts.help) {\n printHelp();\n return;\n }\n if (opts.version) {\n console.log(pkg.version);\n return;\n }\n\n // explorer mode\n if (opts.ui && opts.uiMode === \"explorer\") {\n await startExplorer(opts.ui);\n return;\n }\n\n // validate script\n if (!opts.script) {\n console.error(\"Error: No script specified. Use --help.\");\n process.exitCode = 1;\n return;\n }\n if (!fs.existsSync(opts.script)) {\n console.error(`Error: Script not found: ${opts.script}`);\n process.exitCode = 1;\n return;\n }\n\n const fileConfig = await loadConfig(opts.config);\n const cfg = buildConfig(opts, fileConfig);\n\n if (opts.uiMode === \"live\") {\n await runScriptWithLiveUI(opts.script, cfg, opts.scriptArgs);\n } else {\n await runScript(opts.script, cfg, opts.scriptArgs);\n }\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(\"Error:\", msg);\n process.exitCode = 1;\n }\n};\n\nmain().catch((error: unknown) => {\n console.error(\"Fatal:\", error);\n process.exitCode = 1;\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/cli/argument-parser.ts","../src/core/config.ts","../src/cli/config-loader.ts","../src/core/module-detection.ts","../src/cli/utils.ts","../src/cli/script-executor.ts","../src/cli/server.ts","../src/cli.ts"],"names":["z","fs","path","fs2","path2","fileURLToPath","path3","spawn","resolve","net","dirname","fs3","path4","os","fs4","fs5","path5","http","__dirname_shim","path6","fs6"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"doru\",\n \"version\": \"1.1.0\",\n \"type\": \"commonjs\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"doru\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"dev:ui\": \"vite\",\n \"type-check\": \"tsc --noEmit\",\n \"storybook\": \"storybook dev -p 6006\",\n \"build-storybook\": \"storybook build\"\n },\n \"devDependencies\": {\n \"@vitejs/plugin-react\": \"^5.1.2\",\n \"@storybook/react-vite\": \"^10.1.4\",\n \"vite\": \"^7.3.0\",\n \"@types/node\": \"^25.0.3\",\n \"@types/react\": \"^19.2.7\",\n \"@types/react-dom\": \"^19.2.3\",\n \"react\": \"^19.2.3\",\n \"react-dom\": \"^19.2.3\",\n \"storybook\": \"^10.1.4\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\"\n },\n \"dependencies\": {\n \"@mswjs/interceptors\": \"^0.40.0\",\n \"@tanstack/react-virtual\": \"^3.13.13\",\n \"@microlink/react-json-view\": \"^1.26.1\",\n \"react-resizable-panels\": \"^4.0.13\",\n \"zod\": \"^4.2.1\"\n },\n \"engines\": {\n \"node\": \">=22\"\n }\n}\n","import pkg from \"../../package.json\";\n\nexport interface CLIOptions {\n // core\n script?: string;\n scriptArgs?: string[];\n output?: string;\n format?: \"json\" | \"jsonl\";\n config?: string;\n debug?: boolean;\n help?: boolean;\n version?: boolean;\n // UI\n ui?: string;\n uiMode?: \"explorer\" | \"live\";\n // limits & filters\n maxFileSize?: string;\n includeHosts?: string[];\n excludeHosts?: string[];\n includePaths?: string[];\n excludePaths?: string[];\n methods?: string[];\n minStatusCode?: number;\n maxStatusCode?: number;\n}\n\nexport const printHelp = (): void => {\n console.log(`\ndoru v${pkg.version}\nMinimal network traffic interceptor for Node.js\n\nUSAGE:\n doru run [options] <script> [-- <script-args>]\n doru --ui <capture.json|jsonl> # Explore\n doru --ui <script> [-- <script-args>] # Live UI (run script + UI)\n\nOPTIONS:\n -o, --output <file> Output file (default: ./network-capture.jsonl)\n -f, --format <fmt> json | jsonl (default: jsonl)\n -c, --config <file> Config file path (JSON or JS)\n --ui <path> Explorer (capture file) or Live (script path)\n --debug Enable debug logs\n --max-file-size <size> e.g. 10MB, 500KB\n --include-hosts <list> Comma-separated host filters (string or /regex/)\n --exclude-hosts <list> Comma-separated host filters\n --include-paths <list> Comma-separated regex patterns\n --exclude-paths <list> Comma-separated regex patterns\n --methods <list> Comma-separated HTTP methods (e.g. GET,POST)\n --min-status <code> Minimum status code\n --max-status <code> Maximum status code\n -h, --help Show help\n -v, --version Show version\n\nEXAMPLES:\n doru run server.js\n doru run app.mjs -- --port 3000\n doru --ui capture.jsonl\n doru --ui app.mjs -- --port 8080 # Live UI\n`);\n};\n\nexport const parseArguments = (args: string[]): CLIOptions => {\n const opts: CLIOptions = {};\n const sep = args.indexOf(\"--\");\n let doruArgs: string[] = args;\n if (sep !== -1) {\n doruArgs = args.slice(0, sep);\n opts.scriptArgs = args.slice(sep + 1);\n }\n\n // handle optional \"run\" subcommand\n if (doruArgs[0] === \"run\") doruArgs = doruArgs.slice(1);\n\n const takeNext = (i: number): string => {\n const n = doruArgs[i + 1];\n if (!n || n.startsWith(\"-\")) throw new Error(`Missing value for ${doruArgs[i]}`);\n return n;\n };\n\n const setNumber = (s: string, flag: string): number => {\n const v = Number.parseInt(s);\n if (Number.isNaN(v)) throw new Error(`${flag} must be a number`);\n return v;\n };\n\n for (let i = 0; i < doruArgs.length; i++) {\n const a = doruArgs[i];\n switch (a) {\n case \"-h\":\n case \"--help\": {\n opts.help = true;\n break;\n }\n case \"-v\":\n case \"--version\": {\n opts.version = true;\n break;\n }\n case \"-o\":\n case \"--output\": {\n opts.output = takeNext(i);\n i++;\n break;\n }\n case \"-f\":\n case \"--format\": {\n const n = takeNext(i);\n if (n !== \"json\" && n !== \"jsonl\") throw new Error(\"--format must be json or jsonl\");\n opts.format = n;\n i++;\n break;\n }\n case \"-c\":\n case \"--config\": {\n opts.config = takeNext(i);\n i++;\n break;\n }\n case \"--ui\": {\n const n = takeNext(i);\n opts.ui = n;\n if (/\\.(json|jsonl)$/i.test(n)) opts.uiMode = \"explorer\";\n else {\n opts.uiMode = \"live\";\n if (!opts.script) opts.script = n;\n }\n i++;\n break;\n }\n case \"--debug\": {\n opts.debug = true;\n break;\n }\n case \"--max-file-size\": {\n opts.maxFileSize = takeNext(i);\n i++;\n break;\n }\n case \"--include-hosts\": {\n opts.includeHosts = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--exclude-hosts\": {\n opts.excludeHosts = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--include-paths\": {\n opts.includePaths = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--exclude-paths\": {\n opts.excludePaths = takeNext(i)\n .split(\",\")\n .map((s) => s.trim());\n i++;\n break;\n }\n case \"--methods\": {\n opts.methods = takeNext(i)\n .split(\",\")\n .map((s) => s.trim().toUpperCase());\n i++;\n break;\n }\n case \"--min-status\": {\n const v = setNumber(takeNext(i), \"--min-status\");\n if (v < 100 || v > 599) throw new Error(\"--min-status must be 100..599\");\n opts.minStatusCode = v;\n i++;\n break;\n }\n case \"--max-status\": {\n const v = setNumber(takeNext(i), \"--max-status\");\n if (v < 100 || v > 599) throw new Error(\"--max-status must be 100..599\");\n opts.maxStatusCode = v;\n i++;\n break;\n }\n default: {\n if (a.startsWith(\"-\")) throw new Error(`Unknown option: ${a}`);\n if (opts.script) throw new Error(`Unexpected argument: ${a}`);\n opts.script = a;\n }\n }\n }\n\n return opts;\n};\n\nexport const parseFileSize = (size: string): number => {\n // eslint-disable-next-line security/detect-unsafe-regex\n const m = /^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb)?$/i.exec(size.trim());\n if (!m) throw new Error(`Invalid size: ${size}. Use 10MB, 500KB, etc.`);\n const value = Number.parseFloat(m[1]);\n const unit = (m[2] || \"b\").toLowerCase();\n const mul = { b: 1, kb: 1024, mb: 1024 * 1024, gb: 1024 * 1024 * 1024 } as const;\n return Math.floor(value * mul[unit as keyof typeof mul]);\n};\n","import { z } from \"zod\";\n\nconst statusCodesSchema = z\n .object({\n min: z.number().int().min(100).max(599).nullable().default(null),\n max: z.number().int().min(100).max(599).nullable().default(null),\n })\n .refine((s) => s.min === null || s.max === null || s.min <= s.max, {\n message: \"filters.statusCodes.min must be <= filters.statusCodes.max\",\n });\n\nconst filtersSchema = z.object({\n includeHosts: z.array(z.string()).default([]),\n excludeHosts: z.array(z.string()).default([]),\n includePaths: z.array(z.string()).default([]),\n excludePaths: z.array(z.string()).default([]),\n methods: z.array(z.string()).default([]),\n statusCodes: statusCodesSchema.default({ min: null, max: null }),\n minSize: z.number().int().nullable().default(null),\n maxSize: z.number().int().nullable().default(null),\n});\n\nconst performanceSchema = z.object({\n bufferSize: z.number().int().positive().default(1024),\n flushInterval: z.number().int().positive().default(1000),\n compression: z.boolean().default(false), // minimal core: compression disabled by default\n});\n\nexport const doruConfigSchema = z.object({\n enabled: z.boolean().default(true),\n outputFile: z.string().default(\"./network-capture.jsonl\"),\n format: z.enum([\"json\", \"jsonl\"]).default(\"jsonl\"),\n maxFileSize: z\n .number()\n .int()\n .positive()\n .default(10 * 1024 * 1024), // 10MB\n filters: filtersSchema.default({\n includeHosts: [],\n excludeHosts: [],\n includePaths: [],\n excludePaths: [],\n methods: [],\n statusCodes: { min: null, max: null },\n minSize: null,\n maxSize: null,\n }),\n performance: performanceSchema.default({\n bufferSize: 1024,\n flushInterval: 1000,\n compression: false,\n }),\n debug: z.boolean().default(false),\n});\nexport type InterceptorConfig = z.infer<typeof doruConfigSchema>;\n\nconst deepMerge = <T extends Record<string, unknown>>(a: T, b: Partial<T>): T => {\n const out: T = { ...a };\n for (const [k, v] of Object.entries(b || ({} as Partial<T>))) {\n if (v === undefined) continue;\n const key = k as keyof T;\n const av = a[key];\n if (Array.isArray(v)) {\n (out as unknown as Record<string, unknown>)[key as string] = (v as unknown[]).slice();\n } else if (v && typeof v === \"object\" && av && typeof av === \"object\" && !Array.isArray(av)) {\n (out as unknown as Record<string, unknown>)[key as string] = deepMerge(\n av as Record<string, unknown>,\n v as Record<string, unknown>,\n ) as unknown as T[keyof T];\n } else (out as unknown as Record<string, unknown>)[key as string] = v as T[keyof T];\n }\n return out;\n};\n\nconst envDebugDefault = (): boolean => {\n const v = process.env.DORU_DEBUG;\n if (v === \"true\") return true;\n if (v === \"false\") return false;\n const legacy = process.env.NETPEEK_DEBUG;\n if (legacy === \"true\") return true;\n if (legacy === \"false\") return false;\n return false;\n};\n\nconst normalizeConfig = (c: InterceptorConfig): InterceptorConfig => {\n return {\n ...c,\n filters: {\n ...c.filters,\n methods: c.filters.methods.map((m) => m.toUpperCase()),\n },\n };\n};\n\nexport const createDefaultConfig = (user: Partial<InterceptorConfig> = {}): InterceptorConfig => {\n const defaults = doruConfigSchema.parse({});\n const merged = deepMerge(defaults, { ...user, debug: user.debug ?? envDebugDefault() });\n const parsed = doruConfigSchema.parse(merged);\n return normalizeConfig(parsed);\n};\n\nexport const validateConfig = (config: InterceptorConfig): { valid: boolean; errors: string[] } => {\n const res = doruConfigSchema.safeParse(config);\n if (res.success) return { valid: true, errors: [] };\n return {\n valid: false,\n errors: res.error.issues.map((i) => {\n const where = i.path.length > 0 ? ` at ${i.path.join(\".\")}` : \"\";\n return i.message + where;\n }),\n };\n};\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { InterceptorConfig } from \"../core/config\";\nimport type { CLIOptions } from \"./argument-parser\";\nimport { createDefaultConfig } from \"../core/config\";\nimport { parseFileSize } from \"./argument-parser\";\n\nexport const loadConfig = async (configPath?: string): Promise<Partial<InterceptorConfig>> => {\n const candidates =\n configPath ?\n [configPath]\n : [\"doru.config.json\", \"doru.config.js\", \".dorurc.json\", \".dorurc.js\", \"package.json\"];\n\n for (const file of candidates) {\n try {\n if (!fs.existsSync(file)) continue;\n\n if (file.endsWith(\".json\")) {\n const txt = fs.readFileSync(file, \"utf8\");\n const parsed = JSON.parse(txt);\n if (path.basename(file) === \"package.json\") return parsed.doru || {};\n return parsed;\n }\n if (file.endsWith(\".js\")) {\n const full = path.resolve(file);\n const mod: unknown = await import(full);\n const obj = mod as Record<string, unknown> | null;\n const hasDefault = obj && typeof obj === \"object\" && \"default\" in obj;\n return (hasDefault ? (obj as { default: unknown }).default : obj) as Record<string, unknown>;\n }\n } catch (error: unknown) {\n if (configPath) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config file ${file}: ${msg}`);\n }\n }\n }\n\n return {};\n};\n\nexport const buildConfig = (opts: CLIOptions, fileCfg: Partial<InterceptorConfig>): InterceptorConfig => {\n const base: Partial<InterceptorConfig> = {\n outputFile: opts.output ?? fileCfg.outputFile ?? \"./network-capture.jsonl\",\n format: opts.format ?? fileCfg.format ?? \"jsonl\",\n maxFileSize: fileCfg.maxFileSize ?? 10 * 1024 * 1024,\n filters: {\n includeHosts: opts.includeHosts ?? fileCfg.filters?.includeHosts ?? [],\n excludeHosts: opts.excludeHosts ?? fileCfg.filters?.excludeHosts ?? [],\n includePaths: opts.includePaths ?? fileCfg.filters?.includePaths ?? [],\n excludePaths: opts.excludePaths ?? fileCfg.filters?.excludePaths ?? [],\n methods: opts.methods ?? fileCfg.filters?.methods ?? [],\n statusCodes: {\n min: opts.minStatusCode ?? fileCfg.filters?.statusCodes?.min ?? null,\n max: opts.maxStatusCode ?? fileCfg.filters?.statusCodes?.max ?? null,\n },\n minSize: fileCfg.filters?.minSize ?? null,\n maxSize: fileCfg.filters?.maxSize ?? null,\n },\n performance: fileCfg.performance ?? {\n bufferSize: 1024,\n flushInterval: 1000,\n compression: false,\n },\n debug: opts.debug ?? fileCfg.debug ?? false,\n enabled: true,\n };\n\n if (opts.maxFileSize) base.maxFileSize = parseFileSize(opts.maxFileSize);\n return createDefaultConfig(base);\n};\n","import * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport type ModuleType = \"cjs\" | \"esm\";\nexport interface ModuleDetectionResult {\n type: ModuleType;\n confidence: \"high\" | \"low\" | \"medium\";\n reason: string;\n}\n\nconst tryRead = (filePath: string): string | null => {\n try {\n if (!fs.existsSync(filePath)) return null;\n return fs.readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n};\n\nconst getPackageJsonType = (filePath: string): \"commonjs\" | \"module\" | null => {\n let dir = path.dirname(path.resolve(filePath));\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const parent = path.dirname(dir);\n const pj = path.join(dir, \"package.json\");\n try {\n if (fs.existsSync(pj)) {\n const json = JSON.parse(fs.readFileSync(pj, \"utf8\"));\n if (json.type === \"module\") return \"module\";\n if (json.type === \"commonjs\") return \"commonjs\";\n return \"commonjs\";\n }\n } catch {}\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n};\n\nexport const detectModuleType = (filePath: string): ModuleDetectionResult => {\n const ext = path.extname(filePath);\n if (ext === \".mjs\") return { type: \"esm\", confidence: \"high\", reason: \"File extension .mjs\" };\n if (ext === \".cjs\") return { type: \"cjs\", confidence: \"high\", reason: \"File extension .cjs\" };\n\n if (ext === \".js\") {\n const t = getPackageJsonType(filePath);\n if (t === \"module\") {\n return { type: \"esm\", confidence: \"high\", reason: 'package.json has \"type\":\"module\"' };\n }\n if (t === \"commonjs\") {\n return { type: \"cjs\", confidence: \"high\", reason: 'package.json has \"type\":\"commonjs\"' };\n }\n\n const content = tryRead(filePath);\n if (content !== null) {\n const hasESM = /(^|\\s)import\\s+|(^|\\s)export\\s+/m.test(content);\n const hasCJS = /\\brequire\\s*\\(|\\bmodule\\.exports\\b|\\bexports\\./m.test(content);\n if (hasESM && !hasCJS) return { type: \"esm\", confidence: \"medium\", reason: \"ESM syntax only\" };\n if (hasCJS && !hasESM) return { type: \"cjs\", confidence: \"medium\", reason: \"CommonJS syntax only\" };\n if (hasESM && hasCJS) {\n return { type: \"cjs\", confidence: \"low\", reason: \"Mixed syntax; defaulting to CJS\" };\n }\n }\n }\n\n return { type: \"cjs\", confidence: \"medium\", reason: \"Default (no explicit type)\" };\n};\n","import { spawn } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as net from \"net\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const getFilename = (): string => {\n return typeof __filename === \"undefined\" ? fileURLToPath(import.meta.url) : __filename;\n};\n\nexport const getDirname = (): string => {\n return typeof __dirname === \"undefined\" ? path.dirname(getFilename()) : __dirname;\n};\n\nexport const openBrowser = (url: string): void => {\n try {\n if (process.platform === \"darwin\") {\n spawn(\"open\", [url], { stdio: \"ignore\", detached: true }).unref();\n } else if (process.platform === \"win32\") {\n spawn(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\", detached: true }).unref();\n } else {\n spawn(\"xdg-open\", [url], { stdio: \"ignore\", detached: true }).unref();\n }\n } catch {}\n};\n\nexport const findPort = (start = 8333, attempts = 10): Promise<number> =>\n new Promise((resolve, reject) => {\n let port = start;\n let tried = 0;\n\n const tryNext = (): void => {\n const srv = net.createServer();\n srv.unref();\n srv.once(\"error\", (e: NodeJS.ErrnoException) => {\n if (e.code === \"EADDRINUSE\" && ++tried < attempts) {\n port++;\n tryNext();\n } else {\n reject(e);\n }\n });\n srv.listen(port, \"127.0.0.1\", () => {\n srv.close(() => resolve(port));\n });\n };\n\n tryNext();\n });\n\nexport const isDevMode = (dirname: string): boolean => {\n return dirname.includes(\"src/cli\") || dirname.includes(\"src\\\\cli\");\n};\n\nexport const findUIAsset = (dirname: string): string | null => {\n // production: cli.js is in dist/, ui/app.js is in dist/ui/\n const prodPath = path.join(dirname, \"ui\", \"app.js\");\n if (fs.existsSync(prodPath)) return prodPath;\n\n // dev mode: running from src/cli/, look for dist/ui/app.js at project root\n const devPath = path.resolve(dirname, \"../../dist/ui/app.js\");\n if (fs.existsSync(devPath)) return devPath;\n\n return null;\n};\n","import { type ChildProcess, spawn } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport type { InterceptorConfig } from \"../core/config\";\nimport { detectModuleType } from \"../core/module-detection\";\nimport { getDirname } from \"./utils\";\n\nconst __dirname_shim = getDirname();\n\ninterface PreloadPaths {\n cjs: string;\n esm: string;\n tempFiles: string[];\n entryCjs: string;\n}\n\nconst writeTemp = (name: string, content: string): string => {\n const p = path.join(os.tmpdir(), `doru-${process.pid}-${name}`);\n fs.writeFileSync(p, content, \"utf8\");\n return p;\n};\n\nconst genCjsPreload = (): string => `try {\n const b64 = process.env.DORU_CONFIG_BASE64 || '';\n const entry = process.env.DORU_ENTRY_CJS;\n if (!entry) throw new Error('DORU_ENTRY_CJS not set');\n const cfg = b64 ? JSON.parse(Buffer.from(b64, 'base64').toString('utf8')) : {};\n const doru = require(entry);\n const api = doru.createInterceptor(cfg);\n globalThis.__doru__ = api;\n api.start();\n process.on('exit', () => { try { api.stop(); } catch {} });\n} catch (e) {\n console.error('doru preload failed:', e && e.message ? e.message : e);\n}`;\n\nconst genEsmPreload = (): string => `import { createRequire } from 'module';\ntry {\n const b64 = process.env.DORU_CONFIG_BASE64 || '';\n const entry = process.env.DORU_ENTRY_CJS;\n if (!entry) throw new Error('DORU_ENTRY_CJS not set');\n const cfg = b64 ? JSON.parse(Buffer.from(b64, 'base64').toString('utf8')) : {};\n const require = createRequire(import.meta.url);\n const doru = require(entry);\n const api = doru.createInterceptor(cfg);\n globalThis.__doru__ = api;\n api.start();\n process.on('exit', () => { try { api.stop(); } catch {} });\n} catch (e) {\n console.error('doru preload failed:', e && e.message ? e.message : e);\n}`;\n\nconst findLibraryEntry = (): string => {\n const prodEntry = path.resolve(__dirname_shim, \"index.js\");\n if (fs.existsSync(prodEntry)) return prodEntry;\n const devEntry = path.resolve(__dirname_shim, \"../../dist/index.js\");\n if (fs.existsSync(devEntry)) return devEntry;\n throw new Error(\n `doru library not found. Checked:\\n - ${prodEntry}\\n - ${devEntry}\\nRun \"bun run build\" first.`,\n );\n};\n\nlet cleanupRegistered = false;\nlet pendingCleanupFiles: string[] = [];\n\nconst registerProcessCleanup = (files: string[]): void => {\n pendingCleanupFiles = files;\n\n if (cleanupRegistered) return;\n cleanupRegistered = true;\n\n const doCleanup = () => {\n for (const f of pendingCleanupFiles) {\n try {\n fs.unlinkSync(f);\n } catch {}\n }\n pendingCleanupFiles = [];\n };\n\n // register cleanup\n process.on(\"exit\", doCleanup);\n process.on(\"SIGTERM\", () => {\n doCleanup();\n process.exit(143);\n });\n process.on(\"uncaughtException\", (err) => {\n doCleanup();\n console.error(\"Uncaught exception:\", err);\n process.exit(1);\n });\n};\n\nconst preparePreloadArtifacts = (): PreloadPaths => {\n const entryCjs = findLibraryEntry();\n const cjs = writeTemp(\"preload.cjs\", genCjsPreload());\n const esm = writeTemp(\"preload.mjs\", genEsmPreload());\n const tempFiles = [cjs, esm];\n registerProcessCleanup(tempFiles);\n return { cjs, esm, tempFiles, entryCjs };\n};\n\nconst handle = (child: ChildProcess, temps: string[]): Promise<void> =>\n new Promise((resolve, reject) => {\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n for (const f of temps) {\n try {\n fs.unlinkSync(f);\n } catch {}\n }\n pendingCleanupFiles = pendingCleanupFiles.filter((f) => !temps.includes(f));\n };\n\n child.on(\"close\", (code) => {\n cleanup();\n if (code === 0) resolve();\n else reject(new Error(`Script exited with code ${code}`));\n });\n child.on(\"error\", (err) => {\n cleanup();\n reject(err);\n });\n\n process.on(\"SIGINT\", () => {\n if (cleaned) return;\n\n console.log(\"\\nReceived SIGINT, terminating...\");\n cleanup();\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, 1000);\n });\n });\n\nconst runCJS = async (script: string, env: NodeJS.ProcessEnv, pl: PreloadPaths, scriptArgs?: string[]) => {\n const args = [\"--require\", pl.cjs, script];\n if (scriptArgs?.length) args.push(...scriptArgs);\n const child = spawn(\"node\", args, { stdio: \"inherit\", env });\n await handle(child, pl.tempFiles);\n};\n\nconst runESM = async (script: string, env: NodeJS.ProcessEnv, pl: PreloadPaths, scriptArgs?: string[]) => {\n const args = [\"--import\", pl.esm, script];\n if (scriptArgs?.length) args.push(...scriptArgs);\n const child = spawn(\"node\", args, { stdio: \"inherit\", env });\n await handle(child, pl.tempFiles);\n};\n\nexport const runScript = async (\n script: string,\n config: InterceptorConfig,\n scriptArgs?: string[],\n): Promise<void> => {\n const detection = detectModuleType(script);\n const artifacts = preparePreloadArtifacts();\n\n const env = {\n ...process.env,\n DORU_CONFIG_BASE64: Buffer.from(JSON.stringify(config), \"utf8\").toString(\"base64\"),\n DORU_ENTRY_CJS: artifacts.entryCjs,\n };\n\n if (detection.type === \"esm\") {\n await runESM(script, env, artifacts, scriptArgs);\n } else {\n await runCJS(script, env, artifacts, scriptArgs);\n }\n};\n","import * as fs from \"fs\";\nimport * as http from \"http\";\nimport * as path from \"path\";\nimport { findUIAsset, isDevMode } from \"./utils\";\n\nexport interface ServerConfig {\n captureFile: string;\n dirname: string;\n}\n\nconst VITE_DEV_PORT = 5173;\n\nconst serveFile = (res: http.ServerResponse, filePath: string, contentType: string): boolean => {\n try {\n if (!fs.existsSync(filePath)) return false;\n const content = fs.readFileSync(filePath, \"utf8\");\n res.writeHead(200, { \"Content-Type\": contentType, \"Cache-Control\": \"no-cache\" });\n res.end(content);\n return true;\n } catch {\n return false;\n }\n};\n\nconst findUIFile = (dirname: string, filename: string): string | null => {\n // production: files in dist/ui/\n const prodPath = path.join(dirname, \"ui\", filename);\n if (fs.existsSync(prodPath)) return prodPath;\n // dev: files in src/ui/\n const devPath = path.resolve(dirname, \"../../src/ui\", filename);\n if (fs.existsSync(devPath)) return devPath;\n return null;\n};\n\nexport const createUIServer = (config: ServerConfig): http.Server => {\n const { captureFile, dirname } = config;\n const devMode = isDevMode(dirname);\n\n return http.createServer((req, res) => {\n if (!req.url) return;\n\n // in dev mode, redirect requests to Vite\n if (devMode && (req.url === \"/\" || req.url.startsWith(\"/ui/\") || req.url.startsWith(\"/src/\"))) {\n res.writeHead(302, { Location: `http://localhost:${VITE_DEV_PORT}${req.url}` });\n res.end();\n return;\n }\n\n if (req.url === \"/\") {\n const htmlPath = findUIFile(dirname, \"index.html\");\n if (!htmlPath || !serveFile(res, htmlPath, \"text/html; charset=utf-8\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"UI not found. Run 'bun run build' first.\");\n }\n return;\n }\n\n if (req.url === \"/styles.css\") {\n const cssPath = findUIFile(dirname, \"styles.css\");\n if (!cssPath || !serveFile(res, cssPath, \"text/css; charset=utf-8\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"CSS not found\");\n }\n return;\n }\n\n if (req.url === \"/favicon.svg\" || req.url === \"/favicon-paused.svg\") {\n const filename = req.url.slice(1); // remove leading /\n const faviconPath = findUIFile(dirname, filename);\n if (!faviconPath || !serveFile(res, faviconPath, \"image/svg+xml\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Favicon not found\");\n }\n return;\n }\n\n if (req.url === \"/app.js\") {\n const jsPath = findUIAsset(dirname);\n if (!jsPath || !serveFile(res, jsPath, \"text/javascript; charset=utf-8\")) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"UI bundle not found. Run 'bun run build' first.\");\n }\n return;\n }\n\n if (req.url === \"/api/capture\") {\n try {\n if (!fs.existsSync(captureFile)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(\"[]\");\n return;\n }\n const data = fs.readFileSync(captureFile, \"utf8\");\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(data);\n } catch {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Failed to read capture file\" }));\n }\n return;\n }\n\n if (req.url?.startsWith(\"/api/capture/stream\")) {\n try {\n const url = new URL(req.url, `http://${req.headers.host}`);\n let offset = Number.parseInt(url.searchParams.get(\"offset\") || \"0\");\n\n if (!fs.existsSync(captureFile)) {\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(JSON.stringify({ offset: 0, size: 0, generation: 0, data: \"\" }));\n return;\n }\n\n const stats = fs.statSync(captureFile);\n const fileSize = stats.size;\n const generation = stats.ino;\n\n // rotated\n if (offset > fileSize) {\n offset = 0;\n }\n\n // no new data\n if (offset >= fileSize) {\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(JSON.stringify({ offset: fileSize, size: fileSize, generation, data: \"\" }));\n return;\n }\n\n // read from offset\n const fd = fs.openSync(captureFile, \"r\");\n let data: string;\n try {\n const buffer = Buffer.alloc(fileSize - offset);\n fs.readSync(fd, buffer, 0, buffer.length, offset);\n data = buffer.toString(\"utf8\");\n } finally {\n fs.closeSync(fd);\n }\n\n res.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(JSON.stringify({ offset: fileSize, size: fileSize, generation, data }));\n } catch {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Failed to read capture file\" }));\n }\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n });\n};\n\nexport const startServer = async (server: http.Server, port: number): Promise<string> => {\n await new Promise<void>((resolve) => {\n server.listen(port, resolve);\n });\n return `http://localhost:${port}`;\n};\n\nexport const createShutdownHandler = (server: http.Server): (() => void) => {\n let shutting = false;\n\n return (): void => {\n if (shutting) return;\n shutting = true;\n console.log(\"\\n\\u{1f44b} Shutting down UI...\");\n server.close(() => {\n process.exit(0);\n });\n setTimeout(() => {\n process.exit(0);\n }, 2000);\n };\n};\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { InterceptorConfig } from \"./core/config\";\nimport pkg from \"../package.json\";\nimport { type CLIOptions, parseArguments, printHelp } from \"./cli/argument-parser\";\nimport { buildConfig, loadConfig } from \"./cli/config-loader\";\nimport { runScript } from \"./cli/script-executor\";\nimport { createShutdownHandler, createUIServer, startServer } from \"./cli/server\";\nimport { findPort, getDirname, isDevMode, openBrowser } from \"./cli/utils\";\n\nconst __dirname_shim = getDirname();\n\nconst runScriptWithLiveUI = async (\n script: string,\n cfg: InterceptorConfig,\n args?: string[],\n): Promise<void> => {\n const port = await findPort(8333, 10);\n const server = createUIServer({ captureFile: cfg.outputFile, dirname: __dirname_shim });\n const devMode = isDevMode(__dirname_shim);\n\n const url = await startServer(server, port);\n if (devMode) {\n console.log(`\\u{1f310} doru API at ${url}`);\n console.log(`\\u{1f525} Dev mode: run 'bun run dev:ui' and open http://localhost:5173`);\n } else {\n console.log(`\\u{1f310} doru Live UI at ${url}`);\n openBrowser(url);\n }\n console.log(`\\u{1f3af} Script: ${script}`);\n console.log(`\\u{1f4c1} Capture: ${cfg.outputFile}`);\n console.log(\"Press Ctrl+C to stop\");\n\n const stop = createShutdownHandler(server);\n process.on(\"SIGINT\", stop);\n process.on(\"SIGTERM\", stop);\n\n try {\n await runScript(script, cfg, args);\n console.log(\"\\n\\u{2705} Script finished. UI still running \\u{2014} Ctrl+C to exit.\");\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n console.log(\"\\n\\u{274c} Script exited with error:\", msg);\n console.log(\"UI still running \\u{2014} Ctrl+C to exit.\");\n }\n\n await new Promise(() => {});\n};\n\nconst startExplorer = async (captureFile: string): Promise<void> => {\n const port = await findPort(8333, 10);\n const server = createUIServer({ captureFile, dirname: __dirname_shim });\n const devMode = isDevMode(__dirname_shim);\n\n const url = await startServer(server, port);\n if (devMode) {\n console.log(`\\u{1f310} doru API at ${url}`);\n console.log(`\\u{1f525} Dev mode: run 'bun run dev:ui' and open http://localhost:5173`);\n } else {\n console.log(`\\u{1f310} doru UI at ${url}`);\n openBrowser(url);\n }\n console.log(`\\u{1f4c1} Exploring: ${path.resolve(captureFile)}`);\n console.log(\"Press Ctrl+C to stop\");\n\n process.on(\"SIGINT\", createShutdownHandler(server));\n};\n\nconst main = async (): Promise<void> => {\n try {\n const argv = process.argv.slice(2);\n const opts: CLIOptions = parseArguments(argv);\n\n if (opts.help) {\n printHelp();\n return;\n }\n if (opts.version) {\n console.log(pkg.version);\n return;\n }\n\n // explorer mode\n if (opts.ui && opts.uiMode === \"explorer\") {\n await startExplorer(opts.ui);\n return;\n }\n\n // validate script\n if (!opts.script) {\n console.error(\"Error: No script specified. Use --help.\");\n process.exitCode = 1;\n return;\n }\n if (!fs.existsSync(opts.script)) {\n console.error(`Error: Script not found: ${opts.script}`);\n process.exitCode = 1;\n return;\n }\n\n const fileConfig = await loadConfig(opts.config);\n const cfg = buildConfig(opts, fileConfig);\n\n if (opts.uiMode === \"live\") {\n await runScriptWithLiveUI(opts.script, cfg, opts.scriptArgs);\n } else {\n await runScript(opts.script, cfg, opts.scriptArgs);\n }\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(\"Error:\", msg);\n process.exitCode = 1;\n }\n};\n\nmain().catch((error: unknown) => {\n console.error(\"Fatal:\", error);\n process.exitCode = 1;\n});\n"]}
|