@boba-cli/machine 0.1.0-alpha.1
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 +335 -0
- package/dist/browser/index.cjs +696 -0
- package/dist/browser/index.cjs.map +1 -0
- package/dist/browser/index.d.cts +232 -0
- package/dist/browser/index.d.ts +232 -0
- package/dist/browser/index.js +686 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/index.cjs +435 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +329 -0
- package/dist/index.d.ts +329 -0
- package/dist/index.js +364 -0
- package/dist/index.js.map +1 -0
- package/dist/node/index.cjs +827 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +235 -0
- package/dist/node/index.d.ts +235 -0
- package/dist/node/index.js +790 -0
- package/dist/node/index.js.map +1 -0
- package/dist/types-FB6TYMn5.d.cts +443 -0
- package/dist/types-FB6TYMn5.d.ts +443 -0
- package/package.json +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/style/index.ts","../../src/node/archive.ts","../../src/node/clipboard.ts","../../src/node/environment.ts","../../src/node/filesystem.ts","../../src/node/path.ts","../../src/node/signals.ts","../../src/bytes.ts","../../src/node/terminal.ts","../../src/node/index.ts"],"names":["r","g","b","stat","resolve","require","createRequire","process"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pure JavaScript ANSI styling utility for terminal text.\n * Works identically in Node.js and browser/xterm.js contexts.\n */\n\nimport type { ColorSupport, StyleFn } from '../types.js'\n\n// ANSI escape codes\nconst ESC = '\\x1b['\nconst RESET = `${ESC}0m`\n\n// Modifier codes\nconst CODES = {\n // Modifiers (open, close)\n bold: ['1', '22'],\n dim: ['2', '22'],\n italic: ['3', '23'],\n underline: ['4', '24'],\n inverse: ['7', '27'],\n hidden: ['8', '28'],\n strikethrough: ['9', '29'],\n\n // Basic foreground colors (30-37)\n black: ['30', '39'],\n red: ['31', '39'],\n green: ['32', '39'],\n yellow: ['33', '39'],\n blue: ['34', '39'],\n magenta: ['35', '39'],\n cyan: ['36', '39'],\n white: ['37', '39'],\n\n // Bright foreground colors (90-97)\n blackBright: ['90', '39'],\n redBright: ['91', '39'],\n greenBright: ['92', '39'],\n yellowBright: ['93', '39'],\n blueBright: ['94', '39'],\n magentaBright: ['95', '39'],\n cyanBright: ['96', '39'],\n whiteBright: ['97', '39'],\n\n // Basic background colors (40-47)\n bgBlack: ['40', '49'],\n bgRed: ['41', '49'],\n bgGreen: ['42', '49'],\n bgYellow: ['43', '49'],\n bgBlue: ['44', '49'],\n bgMagenta: ['45', '49'],\n bgCyan: ['46', '49'],\n bgWhite: ['47', '49'],\n\n // Bright background colors (100-107)\n bgBlackBright: ['100', '49'],\n bgRedBright: ['101', '49'],\n bgGreenBright: ['102', '49'],\n bgYellowBright: ['103', '49'],\n bgBlueBright: ['104', '49'],\n bgMagentaBright: ['105', '49'],\n bgCyanBright: ['106', '49'],\n bgWhiteBright: ['107', '49'],\n} as const\n\ntype CodeName = keyof typeof CODES\n\n/**\n * Apply ANSI codes to text.\n * @param text - Text to style\n * @param open - Opening ANSI code\n * @param close - Closing ANSI code\n * @returns Styled text\n */\nfunction applyStyle(text: string, open: string, close: string): string {\n const openSeq = `${ESC}${open}m`\n const closeSeq = `${ESC}${close}m`\n\n // Replace any existing close codes with close+open to properly nest styles\n // This handles cases like style.bold(style.bold('text')) where the inner\n // bold close would prematurely end the outer bold\n const replaced = text.replace(\n new RegExp(closeSeq.replace(/[[\\](){}|^$+*?.\\\\]/g, '\\\\$&'), 'g'),\n closeSeq + openSeq,\n )\n\n return openSeq + replaced + closeSeq\n}\n\n/**\n * Convert hex color to RGB.\n * @param hex - Hex color string (with or without #)\n * @returns RGB array [r, g, b]\n */\nfunction hexToRgb(hex: string): [number, number, number] {\n const clean = hex.replace(/^#/, '')\n const num = parseInt(clean, 16)\n\n if (clean.length === 3) {\n // Short form: #RGB -> #RRGGBB\n const r = ((num >> 8) & 0xf) * 17\n const g = ((num >> 4) & 0xf) * 17\n const b = (num & 0xf) * 17\n return [r, g, b]\n }\n\n // Long form: #RRGGBB\n const r = (num >> 16) & 0xff\n const g = (num >> 8) & 0xff\n const b = num & 0xff\n return [r, g, b]\n}\n\n/**\n * Create a chainable style function.\n * @param colorSupport - Color support level information\n * @returns Chainable style function\n * @public\n */\nexport function createStyle(colorSupport: ColorSupport): StyleFn {\n const enabled = colorSupport.level > 0\n\n /**\n * Build a style function that can be chained.\n * @param stack - Array of [open, close] code pairs to apply\n * @returns Style function\n */\n function build(stack: Array<[string, string]>): StyleFn {\n // The function itself - applies all stacked styles\n const fn = (text: string): string => {\n if (!enabled || stack.length === 0) {\n return text\n }\n\n // Apply styles from inside out\n let result = text\n for (let i = stack.length - 1; i >= 0; i--) {\n const [open, close] = stack[i]!\n result = applyStyle(result, open, close)\n }\n return result\n }\n\n // Add all code-based style properties\n const codeNames = Object.keys(CODES) as CodeName[]\n for (const name of codeNames) {\n const [open, close] = CODES[name]\n Object.defineProperty(fn, name, {\n get() {\n return build([...stack, [open, close]])\n },\n })\n }\n\n // Add gray as alias for blackBright\n Object.defineProperty(fn, 'gray', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add grey as alias for blackBright\n Object.defineProperty(fn, 'grey', {\n get() {\n const [open, close] = CODES.blackBright\n return build([...stack, [open, close]])\n },\n })\n\n // Add extended color methods\n\n // hex(color: string): StyleFn\n Object.defineProperty(fn, 'hex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // rgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'rgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`38;2;${r};${g};${b}`, '39']])\n },\n writable: true,\n })\n\n // bgHex(color: string): StyleFn\n Object.defineProperty(fn, 'bgHex', {\n value: (color: string): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n const [r, g, b] = hexToRgb(color)\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // bgRgb(r: number, g: number, b: number): StyleFn\n Object.defineProperty(fn, 'bgRgb', {\n value: (r: number, g: number, b: number): StyleFn => {\n if (!enabled || !colorSupport.has16m) {\n return build(stack)\n }\n return build([...stack, [`48;2;${r};${g};${b}`, '49']])\n },\n writable: true,\n })\n\n // ansi256(code: number): StyleFn\n Object.defineProperty(fn, 'ansi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`38;5;${code}`, '39']])\n },\n writable: true,\n })\n\n // bgAnsi256(code: number): StyleFn\n Object.defineProperty(fn, 'bgAnsi256', {\n value: (code: number): StyleFn => {\n if (!enabled || !colorSupport.has256) {\n return build(stack)\n }\n return build([...stack, [`48;5;${code}`, '49']])\n },\n writable: true,\n })\n\n return fn as StyleFn\n }\n\n return build([])\n}\n\n/**\n * Create a style function that always applies colors (for xterm.js).\n * @returns Chainable style function with full color support\n * @public\n */\nexport function createAlwaysEnabledStyle(): StyleFn {\n return createStyle({ level: 3, hasBasic: true, has256: true, has16m: true })\n}\n","/**\n * Node.js archive adapter using archiver and unzipper.\n */\n\nimport type { ArchiveAdapter } from '../types.js'\n\n/**\n * Node.js implementation of ArchiveAdapter.\n * Uses archiver for compression and unzipper for extraction.\n * @public\n */\nexport class NodeArchiveAdapter implements ArchiveAdapter {\n private readonly hasArchiver: boolean\n private readonly hasUnzipper: boolean\n\n /**\n * Create a new Node.js archive adapter.\n * Checks for availability of archiver and unzipper packages.\n */\n constructor() {\n this.hasArchiver = this.checkPackageAvailability('archiver')\n this.hasUnzipper = this.checkPackageAvailability('unzipper')\n }\n\n /**\n * Check if a package is available.\n * @param packageName - Package to check\n * @returns True if package can be imported\n */\n private checkPackageAvailability(packageName: string): boolean {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require.resolve(packageName)\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Check if archive operations are available.\n * @returns True if both archiver and unzipper are available\n */\n isAvailable(): boolean {\n return this.hasArchiver && this.hasUnzipper\n }\n\n /**\n * Create a zip archive from a directory.\n * @param sourceDir - Source directory to archive\n * @param destPath - Destination path for the zip file\n * @throws Error if archiver is not available or archiving fails\n */\n async zip(sourceDir: string, destPath: string): Promise<void> {\n if (!this.hasArchiver) {\n throw new Error(\n 'Archive operations not available: archiver package not found. Install with: pnpm add archiver',\n )\n }\n\n // Dynamic import to avoid bundling dependencies that may not be installed\n const archiver = await import('archiver')\n const { createWriteStream } = await import('node:fs')\n const { stat } = await import('node:fs/promises')\n const path = await import('node:path')\n\n return new Promise((resolve, reject) => {\n const outputStream = createWriteStream(destPath)\n const archive = archiver.default('zip', { zlib: { level: 9 } })\n\n outputStream.on('close', () => {\n resolve()\n })\n\n archive.on('error', (err: Error) => {\n reject(err)\n })\n\n archive.pipe(outputStream)\n\n // Check if source is a directory or file\n stat(sourceDir)\n .then((stats) => {\n if (stats.isDirectory()) {\n archive.directory(sourceDir, false)\n } else {\n archive.file(sourceDir, { name: path.basename(sourceDir) })\n }\n\n void archive.finalize()\n })\n .catch((err) => {\n reject(err)\n })\n })\n }\n\n /**\n * Extract a zip archive to a directory.\n * @param archivePath - Path to the zip file\n * @param destDir - Destination directory for extraction\n * @throws Error if unzipper is not available or extraction fails\n */\n async unzip(archivePath: string, destDir: string): Promise<void> {\n if (!this.hasUnzipper) {\n throw new Error(\n 'Archive operations not available: unzipper package not found. Install with: pnpm add unzipper',\n )\n }\n\n // Dynamic import to avoid bundling dependencies that may not be installed\n const unzipper = await import('unzipper')\n const { createReadStream } = await import('node:fs')\n\n return new Promise((resolve, reject) => {\n createReadStream(archivePath)\n .pipe(unzipper.Extract({ path: destDir }))\n .on('close', () => {\n resolve()\n })\n .on('error', (err: Error) => {\n reject(err)\n })\n })\n }\n}\n","import { createRequire } from 'node:module'\nimport type { ClipboardAdapter } from '../types.js'\n\nconst require = createRequire(import.meta.url)\n\n/**\n * Clipboard interface matching the clipboardy module.\n */\ninterface ClipboardModule {\n read(): Promise<string>\n write(text: string): Promise<void>\n}\n\n/**\n * Node.js clipboard adapter using the clipboardy package.\n * clipboardy is an optional peer dependency.\n * @public\n */\nexport class NodeClipboardAdapter implements ClipboardAdapter {\n private clipboard: ClipboardModule | null = null\n private available: boolean | null = null\n\n /**\n * Create a new Node.js clipboard adapter.\n * Optionally pass a pre-loaded clipboardy module for dependency injection.\n * @param clipboardModule - Optional pre-loaded clipboard module\n */\n constructor(clipboardModule?: ClipboardModule) {\n if (clipboardModule) {\n this.clipboard = clipboardModule\n this.available = true\n }\n }\n\n private async loadClipboard(): Promise<ClipboardModule | null> {\n // Don't try to load if we've already determined it's unavailable\n if (this.available === false) {\n return null\n }\n\n if (this.clipboard !== null) {\n return this.clipboard\n }\n\n try {\n // Dynamic import of optional peer dependency\n const module = (await import('clipboardy')) as {\n default: ClipboardModule\n }\n this.clipboard = module.default\n // Note: We set available=true here, but it may be set to false later if runtime fails\n // (e.g., clipboardy installed but xsel binary missing)\n this.available = true\n return this.clipboard\n } catch {\n this.available = false\n return null\n }\n }\n\n async read(): Promise<string> {\n const clipboard = await this.loadClipboard()\n if (!clipboard) {\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n try {\n return await clipboard.read()\n } catch {\n // Mark as unavailable when clipboardy fails at runtime (e.g., missing xsel binary)\n // This ensures isAvailable() returns false on subsequent checks\n this.available = false\n this.clipboard = null\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n }\n\n async write(text: string): Promise<void> {\n const clipboard = await this.loadClipboard()\n if (!clipboard) {\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n try {\n await clipboard.write(text)\n } catch {\n // Mark as unavailable when clipboardy fails at runtime (e.g., missing xsel binary)\n // This ensures isAvailable() returns false on subsequent checks\n this.available = false\n this.clipboard = null\n throw new Error(\n 'Clipboard not available. Install clipboardy: npm install clipboardy',\n )\n }\n }\n\n isAvailable(): boolean {\n // If we already checked, return cached result\n if (this.available !== null) {\n return this.available\n }\n\n // Try synchronous check first\n try {\n require.resolve('clipboardy')\n return true\n } catch {\n return false\n }\n }\n}\n","import process from 'node:process'\nimport { createRequire } from 'node:module'\nimport type {\n ColorSupport,\n EnvironmentAdapter,\n TerminalBackground,\n} from '../types.js'\n\nconst require = createRequire(import.meta.url)\n\n/**\n * Supports-color module interface.\n */\ninterface SupportsColorModule {\n stdout?: { level?: number } | false\n}\n\n/**\n * Node.js environment adapter.\n * Uses process.env and supports-color for environment detection.\n * @public\n */\nexport class NodeEnvironmentAdapter implements EnvironmentAdapter {\n private supportsColorModule: SupportsColorModule | null = null\n private colorSupportCached: ColorSupport | null = null\n private backgroundCached: TerminalBackground | null = null\n\n /**\n * Create a new Node.js environment adapter.\n * Optionally pass a pre-loaded supports-color module for dependency injection.\n * @param supportsColor - Optional pre-loaded supports-color module\n */\n constructor(supportsColor?: SupportsColorModule) {\n if (supportsColor) {\n this.supportsColorModule = supportsColor\n }\n }\n\n get(name: string): string | undefined {\n return process.env[name]\n }\n\n getColorSupport(): ColorSupport {\n if (this.colorSupportCached) {\n return this.colorSupportCached\n }\n\n const support = this.detectColorSupport()\n this.colorSupportCached = support\n return support\n }\n\n private detectColorSupport(): ColorSupport {\n // Try to use supports-color if available\n const module = this.loadSupportsColor()\n if (module) {\n const stdout = module.stdout\n if (stdout && typeof stdout.level === 'number') {\n const level = stdout.level\n return {\n level,\n hasBasic: level >= 1,\n has256: level >= 2,\n has16m: level >= 3,\n }\n }\n }\n\n // Fallback to environment variable detection\n return this.detectColorSupportFromEnv()\n }\n\n private loadSupportsColor(): SupportsColorModule | null {\n if (this.supportsColorModule !== null) {\n return this.supportsColorModule\n }\n\n try {\n // Dynamic require of optional peer dependency\n const module = require('supports-color') as SupportsColorModule\n this.supportsColorModule = module\n return module\n } catch {\n return null\n }\n }\n\n private detectColorSupportFromEnv(): ColorSupport {\n // Check COLORTERM for true color support\n const colorTerm = process.env.COLORTERM?.toLowerCase()\n if (colorTerm === 'truecolor' || colorTerm === '24bit') {\n return { level: 3, hasBasic: true, has256: true, has16m: true }\n }\n\n // Check TERM for 256 color support\n const term = process.env.TERM?.toLowerCase() ?? ''\n if (term.includes('256color') || term.includes('256-color')) {\n return { level: 2, hasBasic: true, has256: true, has16m: false }\n }\n\n // Check for basic color terminals\n if (\n term.includes('color') ||\n term.includes('ansi') ||\n term.includes('xterm') ||\n term.includes('vt100') ||\n term.includes('screen') ||\n term.includes('linux')\n ) {\n return { level: 1, hasBasic: true, has256: false, has16m: false }\n }\n\n // Check CI environments\n if (process.env.CI) {\n return { level: 1, hasBasic: true, has256: false, has16m: false }\n }\n\n // Check if we have a TTY\n if (process.stdout?.isTTY) {\n return { level: 1, hasBasic: true, has256: false, has16m: false }\n }\n\n // No color support detected\n return { level: 0, hasBasic: false, has256: false, has16m: false }\n }\n\n getTerminalBackground(): TerminalBackground {\n if (this.backgroundCached) {\n return this.backgroundCached\n }\n\n const background = this.detectTerminalBackground()\n this.backgroundCached = background\n return background\n }\n\n private detectTerminalBackground(): TerminalBackground {\n // COLORFGBG is the most reliable indicator when present\n // Format: \"fg;bg\" where bg < 7 typically means dark, bg >= 7 means light\n const colorFgBg = process.env.COLORFGBG\n if (colorFgBg) {\n const parts = colorFgBg.split(';')\n const bg = parseInt(parts[parts.length - 1] ?? '', 10)\n if (!isNaN(bg)) {\n // Standard ANSI colors: 0-6 are dark, 7+ (white) is light\n // 256-color: 0-7 dark, 8-15 bright versions\n return bg < 7 || (bg >= 8 && bg < 16 && bg !== 15) ? 'dark' : 'light'\n }\n }\n\n // Some terminals set TERM_BACKGROUND directly\n const termBackground = process.env.TERM_BACKGROUND?.toLowerCase()\n if (termBackground === 'dark' || termBackground === 'light') {\n return termBackground\n }\n\n // macOS Terminal.app and iTerm2 default to dark themes commonly\n const termProgram = process.env.TERM_PROGRAM ?? ''\n if (/iTerm/i.test(termProgram)) {\n // iTerm2's default is dark, but users can change it\n return 'dark'\n }\n\n // VS Code integrated terminal\n if (process.env.TERM_PROGRAM === 'vscode') {\n // VS Code defaults to matching the editor theme\n // Most devs use dark themes\n return 'dark'\n }\n\n return 'unknown'\n }\n}\n","import { copyFile, mkdir, readdir, readFile, rename, rm, rmdir, stat, unlink, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport process from 'node:process'\nimport type { DirectoryEntry, FileStat, FileSystemAdapter } from '../types.js'\n\n/**\n * Node.js directory entry implementation.\n * Wraps fs.Dirent from Node.js.\n * @internal\n */\nclass NodeDirectoryEntry implements DirectoryEntry {\n readonly name: string\n private readonly _isDirectory: boolean\n private readonly _isFile: boolean\n private readonly _isSymbolicLink: boolean\n\n constructor(name: string, isDirectory: boolean, isFile: boolean, isSymbolicLink: boolean) {\n this.name = name\n this._isDirectory = isDirectory\n this._isFile = isFile\n this._isSymbolicLink = isSymbolicLink\n }\n\n isDirectory(): boolean {\n return this._isDirectory\n }\n\n isFile(): boolean {\n return this._isFile\n }\n\n isSymbolicLink(): boolean {\n return this._isSymbolicLink\n }\n}\n\n/**\n * Node.js filesystem adapter.\n * Wraps Node.js fs/promises API for platform-agnostic file operations.\n * @public\n */\nexport class NodeFileSystemAdapter implements FileSystemAdapter {\n async readdir(path: string, options?: { withFileTypes?: boolean }): Promise<DirectoryEntry[] | string[]> {\n if (options?.withFileTypes) {\n const entries = await readdir(path, { withFileTypes: true })\n return entries.map(\n (entry) =>\n new NodeDirectoryEntry(\n entry.name,\n entry.isDirectory(),\n entry.isFile(),\n entry.isSymbolicLink(),\n ),\n )\n }\n\n return readdir(path)\n }\n\n async stat(path: string): Promise<FileStat> {\n const stats = await stat(path)\n return {\n size: stats.size,\n mode: stats.mode,\n mtime: stats.mtime,\n isDirectory: stats.isDirectory(),\n isFile: stats.isFile(),\n isSymbolicLink: stats.isSymbolicLink(),\n }\n }\n\n async readFile(path: string, encoding?: string): Promise<string> {\n return readFile(path, { encoding: (encoding ?? 'utf-8') as BufferEncoding })\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await writeFile(path, content, 'utf-8')\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n await mkdir(path, { recursive: options?.recursive })\n }\n\n async unlink(path: string): Promise<void> {\n await unlink(path)\n }\n\n async rmdir(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void> {\n if (options?.recursive || options?.force) {\n // Use rm for recursive deletion or force option\n await rm(path, { recursive: options.recursive ?? false, force: options.force ?? false })\n } else {\n // Use rmdir for non-recursive deletion (throws for non-empty directories)\n await rmdir(path)\n }\n }\n\n async rename(src: string, dst: string): Promise<void> {\n await rename(src, dst)\n }\n\n async copyFile(src: string, dst: string): Promise<void> {\n await copyFile(src, dst)\n }\n\n cwd(): string {\n return process.cwd()\n }\n\n homedir(): string {\n return homedir()\n }\n}\n","import * as nodePath from 'node:path'\nimport type { PathAdapter } from '../types.js'\n\n/**\n * Node.js path adapter.\n * Wraps Node.js path module for platform-agnostic path operations.\n * @public\n */\nexport class NodePathAdapter implements PathAdapter {\n readonly sep = nodePath.sep\n\n join(...segments: string[]): string {\n return nodePath.join(...segments)\n }\n\n dirname(path: string): string {\n return nodePath.dirname(path)\n }\n\n basename(path: string, ext?: string): string {\n return nodePath.basename(path, ext)\n }\n\n extname(path: string): string {\n return nodePath.extname(path)\n }\n\n resolve(...segments: string[]): string {\n return nodePath.resolve(...segments)\n }\n\n isAbsolute(path: string): boolean {\n return nodePath.isAbsolute(path)\n }\n\n normalize(path: string): string {\n return nodePath.normalize(path)\n }\n}\n","import process from 'node:process'\nimport type { Disposable, SignalAdapter, SignalHandler } from '../types.js'\n\n/**\n * Node.js signal adapter for handling SIGINT, SIGTERM, etc.\n * @public\n */\nexport class NodeSignalAdapter implements SignalAdapter {\n private readonly interruptHandlers: Set<SignalHandler> = new Set()\n private readonly terminateHandlers: Set<SignalHandler> = new Set()\n private disposed = false\n\n private readonly handleInterrupt = (): void => {\n for (const handler of this.interruptHandlers) {\n handler()\n }\n }\n\n private readonly handleTerminate = (): void => {\n for (const handler of this.terminateHandlers) {\n handler()\n }\n }\n\n onInterrupt(handler: SignalHandler): Disposable {\n if (this.interruptHandlers.size === 0) {\n process.on('SIGINT', this.handleInterrupt)\n }\n this.interruptHandlers.add(handler)\n\n return {\n dispose: () => {\n this.interruptHandlers.delete(handler)\n if (this.interruptHandlers.size === 0) {\n process.off('SIGINT', this.handleInterrupt)\n }\n },\n }\n }\n\n onTerminate(handler: SignalHandler): Disposable {\n if (this.terminateHandlers.size === 0) {\n process.on('SIGTERM', this.handleTerminate)\n }\n this.terminateHandlers.add(handler)\n\n return {\n dispose: () => {\n this.terminateHandlers.delete(handler)\n if (this.terminateHandlers.size === 0) {\n process.off('SIGTERM', this.handleTerminate)\n }\n },\n }\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n process.off('SIGINT', this.handleInterrupt)\n process.off('SIGTERM', this.handleTerminate)\n\n this.interruptHandlers.clear()\n this.terminateHandlers.clear()\n }\n}\n","/**\n * Platform-agnostic byte utilities using Uint8Array.\n * These replace Node.js Buffer operations for cross-platform compatibility.\n */\n\n/** Shared TextEncoder instance for string encoding. */\nconst encoder = new TextEncoder()\n\n/** Shared TextDecoder instance for string decoding. */\nconst decoder = new TextDecoder('utf-8')\n\n/**\n * Encode a string to UTF-8 bytes.\n * Equivalent to `Buffer.from(text, 'utf8')`.\n * @param text - String to encode\n * @returns UTF-8 encoded bytes\n * @public\n */\nexport function encodeString(text: string): Uint8Array {\n return encoder.encode(text)\n}\n\n/**\n * Decode UTF-8 bytes to a string.\n * Equivalent to `buffer.toString('utf8')`.\n * @param bytes - Bytes to decode\n * @returns Decoded string\n * @public\n */\nexport function decodeString(bytes: Uint8Array): string {\n return decoder.decode(bytes)\n}\n\n/**\n * Get the byte length of a string when encoded as UTF-8.\n * Equivalent to `Buffer.byteLength(text, 'utf8')`.\n * @param text - String to measure\n * @returns Byte length\n * @public\n */\nexport function byteLength(text: string): number {\n return encoder.encode(text).length\n}\n\n/**\n * Concatenate multiple Uint8Arrays into one.\n * Equivalent to `Buffer.concat(arrays)`.\n * @param arrays - Arrays to concatenate\n * @returns Combined array\n * @public\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const arr of arrays) {\n result.set(arr, offset)\n offset += arr.length\n }\n return result\n}\n\n/**\n * Create a new Uint8Array of the specified size, filled with zeros.\n * Equivalent to `Buffer.alloc(size)`.\n * @param size - Size of the array\n * @returns New zero-filled array\n * @public\n */\nexport function allocBytes(size: number): Uint8Array {\n return new Uint8Array(size)\n}\n\n/**\n * Create a Uint8Array from an array of byte values.\n * Equivalent to `Buffer.from([...])`.\n * @param values - Byte values (0-255)\n * @returns New Uint8Array\n * @public\n */\nexport function fromBytes(values: number[]): Uint8Array {\n return new Uint8Array(values)\n}\n\n/**\n * Compare two Uint8Arrays for equality.\n * Equivalent to `buffer1.equals(buffer2)`.\n * @param a - First array\n * @param b - Second array\n * @returns True if arrays are equal\n * @public\n */\nexport function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific prefix.\n * @param bytes - Array to check\n * @param prefix - Prefix to look for\n * @returns True if bytes starts with prefix\n * @public\n */\nexport function startsWith(bytes: Uint8Array, prefix: Uint8Array): boolean {\n if (bytes.length < prefix.length) {\n return false\n }\n for (let i = 0; i < prefix.length; i++) {\n if (bytes[i] !== prefix[i]) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if a byte array starts with a specific string (UTF-8 encoded).\n * @param bytes - Array to check\n * @param prefix - String prefix to look for\n * @returns True if bytes starts with the encoded prefix\n * @public\n */\nexport function startsWithString(bytes: Uint8Array, prefix: string): boolean {\n return startsWith(bytes, encodeString(prefix))\n}\n\n/**\n * Find the index of a substring within a byte array.\n * Returns -1 if not found.\n * @param bytes - Array to search\n * @param needle - String to find\n * @param fromIndex - Start index (default 0)\n * @returns Index of first occurrence or -1\n * @public\n */\nexport function indexOfString(\n bytes: Uint8Array,\n needle: string,\n fromIndex: number = 0,\n): number {\n const needleBytes = encodeString(needle)\n const endIndex = bytes.length - needleBytes.length\n\n outer: for (let i = fromIndex; i <= endIndex; i++) {\n for (let j = 0; j < needleBytes.length; j++) {\n if (bytes[i + j] !== needleBytes[j]) {\n continue outer\n }\n }\n return i\n }\n return -1\n}\n\n/**\n * Decode the first complete UTF-8 character from a byte array.\n * Returns the character and its byte length, or null if incomplete.\n * @param bytes - Byte array to decode\n * @param offset - Start offset (default 0)\n * @returns Tuple of [character, byteLength] or [null, 0] if incomplete\n * @public\n */\nexport function decodeFirstRune(\n bytes: Uint8Array,\n offset: number = 0,\n): [string | null, number] {\n if (offset >= bytes.length) {\n return [null, 0]\n }\n\n const firstByte = bytes[offset]\n if (firstByte === undefined) {\n return [null, 0]\n }\n\n // Determine the byte length of this UTF-8 character\n let byteLen: number\n if ((firstByte & 0x80) === 0) {\n // Single byte character (ASCII)\n byteLen = 1\n } else if ((firstByte & 0xe0) === 0xc0) {\n // Two byte character\n byteLen = 2\n } else if ((firstByte & 0xf0) === 0xe0) {\n // Three byte character\n byteLen = 3\n } else if ((firstByte & 0xf8) === 0xf0) {\n // Four byte character\n byteLen = 4\n } else {\n // Invalid UTF-8 start byte, treat as single byte\n byteLen = 1\n }\n\n // Check if we have enough bytes\n if (offset + byteLen > bytes.length) {\n return [null, 0]\n }\n\n // Decode the character\n const slice = bytes.subarray(offset, offset + byteLen)\n const decoded = decoder.decode(slice)\n\n if (decoded.length === 0) {\n return [null, 0]\n }\n\n // Use codePointAt to properly handle surrogate pairs (emoji, etc.)\n // This returns the full Unicode code point, not just the first surrogate\n const codePoint = decoded.codePointAt(0)\n if (codePoint === undefined) {\n return [null, 0]\n }\n\n // Convert the code point back to a string (handles surrogate pairs correctly)\n const firstChar = String.fromCodePoint(codePoint)\n\n return [firstChar, byteLen]\n}\n\n/**\n * Slice a portion of a byte array.\n * Equivalent to `buffer.subarray(start, end)`.\n * @param bytes - Source array\n * @param start - Start index\n * @param end - End index (optional, defaults to length)\n * @returns New Uint8Array view of the slice\n * @public\n */\nexport function sliceBytes(\n bytes: Uint8Array,\n start: number,\n end?: number,\n): Uint8Array {\n return bytes.subarray(start, end)\n}\n\n/**\n * Create a copy of a byte array.\n * @param bytes - Array to copy\n * @returns New Uint8Array with copied data\n * @public\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n return new Uint8Array(bytes)\n}\n","import process from 'node:process'\nimport { encodeString } from '../bytes.js'\nimport type {\n Disposable,\n InputHandler,\n ResizeHandler,\n TerminalAdapter,\n TerminalSize,\n} from '../types.js'\n\n/**\n * Node.js terminal adapter using stdin/stdout.\n * @public\n */\nexport class NodeTerminalAdapter implements TerminalAdapter {\n private rawModeEnabled = false\n private readonly inputHandlers: Set<InputHandler> = new Set()\n private readonly resizeHandlers: Set<ResizeHandler> = new Set()\n private disposed = false\n\n constructor(\n private readonly input: NodeJS.ReadableStream = process.stdin,\n private readonly output: NodeJS.WritableStream = process.stdout,\n ) {}\n\n private readonly handleData = (data: Buffer | string): void => {\n const bytes =\n typeof data === 'string' ? encodeString(data) : new Uint8Array(data)\n for (const handler of this.inputHandlers) {\n handler(bytes)\n }\n }\n\n private readonly handleResize = (): void => {\n const size = this.getSize()\n for (const handler of this.resizeHandlers) {\n handler(size)\n }\n }\n\n onInput(handler: InputHandler): Disposable {\n if (this.inputHandlers.size === 0) {\n this.input.on('data', this.handleData)\n this.input.resume()\n }\n this.inputHandlers.add(handler)\n\n return {\n dispose: () => {\n this.inputHandlers.delete(handler)\n if (this.inputHandlers.size === 0) {\n this.input.off('data', this.handleData)\n }\n },\n }\n }\n\n onResize(handler: ResizeHandler): Disposable {\n if (this.resizeHandlers.size === 0 && this.isWritableStream(this.output)) {\n this.output.on('resize', this.handleResize)\n }\n this.resizeHandlers.add(handler)\n\n return {\n dispose: () => {\n this.resizeHandlers.delete(handler)\n if (\n this.resizeHandlers.size === 0 &&\n this.isWritableStream(this.output)\n ) {\n this.output.off('resize', this.handleResize)\n }\n },\n }\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n this.output.write(data)\n }\n\n getSize(): TerminalSize {\n const stream = this.output as { columns?: number; rows?: number }\n return {\n columns: stream.columns ?? 80,\n rows: stream.rows ?? 24,\n }\n }\n\n enableRawMode(): void {\n const stream = this.input as NodeJS.ReadStream\n if (this.isTTY() && typeof stream.setRawMode === 'function') {\n stream.setRawMode(true)\n stream.resume()\n this.rawModeEnabled = true\n }\n }\n\n disableRawMode(): void {\n const stream = this.input as NodeJS.ReadStream\n if (this.rawModeEnabled && typeof stream.setRawMode === 'function') {\n stream.setRawMode(false)\n stream.pause()\n this.rawModeEnabled = false\n }\n }\n\n isTTY(): boolean {\n const stream = this.input as NodeJS.ReadStream\n return typeof stream.isTTY === 'boolean' && stream.isTTY\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n this.disableRawMode()\n\n this.input.off('data', this.handleData)\n if (this.isWritableStream(this.output)) {\n this.output.off('resize', this.handleResize)\n }\n\n this.inputHandlers.clear()\n this.resizeHandlers.clear()\n }\n\n private isWritableStream(\n stream: NodeJS.WritableStream,\n ): stream is NodeJS.WriteStream {\n return (\n 'on' in stream && typeof (stream as NodeJS.WriteStream).on === 'function'\n )\n }\n}\n","/**\n * Node.js platform adapters for \\@boba-cli/machine.\n * @packageDocumentation\n */\n\nimport type {\n ArchiveAdapter,\n ClipboardAdapter,\n Disposable,\n EnvironmentAdapter,\n FileSystemAdapter,\n PathAdapter,\n PlatformAdapter,\n SignalAdapter,\n StyleAdapter,\n TerminalAdapter,\n} from '../types.js'\nimport { createStyle } from '../style/index.js'\nimport { NodeArchiveAdapter } from './archive.js'\nimport { NodeClipboardAdapter } from './clipboard.js'\nimport { NodeEnvironmentAdapter } from './environment.js'\nimport { NodeFileSystemAdapter } from './filesystem.js'\nimport { NodePathAdapter } from './path.js'\nimport { NodeSignalAdapter } from './signals.js'\nimport { NodeTerminalAdapter } from './terminal.js'\n\nexport { NodeArchiveAdapter } from './archive.js'\nexport { NodeClipboardAdapter } from './clipboard.js'\nexport { NodeEnvironmentAdapter } from './environment.js'\nexport { NodeFileSystemAdapter } from './filesystem.js'\nexport { NodePathAdapter } from './path.js'\nexport { NodeSignalAdapter } from './signals.js'\nexport { NodeTerminalAdapter } from './terminal.js'\n\n/**\n * Options for creating a Node.js platform adapter.\n * @public\n */\nexport interface NodePlatformOptions {\n /** Custom input stream (default: process.stdin). */\n input?: NodeJS.ReadableStream\n /** Custom output stream (default: process.stdout). */\n output?: NodeJS.WritableStream\n}\n\n/**\n * Complete Node.js platform adapter.\n * Combines terminal, signal, clipboard, environment, filesystem, path, archive, and style adapters.\n * @public\n */\nexport class NodePlatformAdapter implements PlatformAdapter {\n readonly terminal: TerminalAdapter\n readonly signals: SignalAdapter\n readonly clipboard: ClipboardAdapter\n readonly environment: EnvironmentAdapter\n readonly filesystem: FileSystemAdapter\n readonly path: PathAdapter\n readonly archive: ArchiveAdapter\n readonly style: StyleAdapter\n\n private disposed = false\n private readonly disposables: Disposable[] = []\n\n /**\n * Create a new Node.js platform adapter.\n * @param options - Configuration options\n */\n constructor(options: NodePlatformOptions = {}) {\n const terminalAdapter = new NodeTerminalAdapter(\n options.input,\n options.output,\n )\n const signalAdapter = new NodeSignalAdapter()\n const clipboardAdapter = new NodeClipboardAdapter()\n const environmentAdapter = new NodeEnvironmentAdapter()\n const filesystemAdapter = new NodeFileSystemAdapter()\n const pathAdapter = new NodePathAdapter()\n const archiveAdapter = new NodeArchiveAdapter()\n\n // Create style adapter using environment's color support\n const colorSupport = environmentAdapter.getColorSupport()\n const styleAdapter: StyleAdapter = {\n style: createStyle(colorSupport),\n enabled: colorSupport.level > 0,\n level: colorSupport.level,\n }\n\n this.terminal = terminalAdapter\n this.signals = signalAdapter\n this.clipboard = clipboardAdapter\n this.environment = environmentAdapter\n this.filesystem = filesystemAdapter\n this.path = pathAdapter\n this.archive = archiveAdapter\n this.style = styleAdapter\n\n this.disposables.push(terminalAdapter, signalAdapter)\n }\n\n dispose(): void {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n for (const disposable of this.disposables) {\n disposable.dispose()\n }\n }\n}\n\n/**\n * Create a Node.js platform adapter with default settings.\n * @param options - Configuration options\n * @returns A new platform adapter\n * @public\n */\nexport function createNodePlatform(\n options: NodePlatformOptions = {},\n): PlatformAdapter {\n return new NodePlatformAdapter(options)\n}\n"]}
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color support levels for terminal output.
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
interface ColorSupport {
|
|
6
|
+
/** The maximum color level supported (0-3). */
|
|
7
|
+
readonly level: number;
|
|
8
|
+
/** Whether basic 16-color support is available. */
|
|
9
|
+
readonly hasBasic: boolean;
|
|
10
|
+
/** Whether 256-color support is available. */
|
|
11
|
+
readonly has256: boolean;
|
|
12
|
+
/** Whether 16 million (true color) support is available. */
|
|
13
|
+
readonly has16m: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Terminal background mode.
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
type TerminalBackground = 'dark' | 'light' | 'unknown';
|
|
20
|
+
/**
|
|
21
|
+
* Terminal dimensions.
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
interface TerminalSize {
|
|
25
|
+
/** Width in columns. */
|
|
26
|
+
readonly columns: number;
|
|
27
|
+
/** Height in rows. */
|
|
28
|
+
readonly rows: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Disposable resource that can be cleaned up.
|
|
32
|
+
* @public
|
|
33
|
+
*/
|
|
34
|
+
interface Disposable {
|
|
35
|
+
/** Dispose of the resource. */
|
|
36
|
+
dispose(): void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Handler for terminal input data.
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
type InputHandler = (data: Uint8Array) => void;
|
|
43
|
+
/**
|
|
44
|
+
* Handler for terminal resize events.
|
|
45
|
+
* @public
|
|
46
|
+
*/
|
|
47
|
+
type ResizeHandler = (size: TerminalSize) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Handler for signals (SIGINT, SIGTERM, etc.).
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
type SignalHandler = () => void;
|
|
53
|
+
/**
|
|
54
|
+
* Terminal adapter interface for platform-agnostic terminal operations.
|
|
55
|
+
* @public
|
|
56
|
+
*/
|
|
57
|
+
interface TerminalAdapter extends Disposable {
|
|
58
|
+
/**
|
|
59
|
+
* Subscribe to input data.
|
|
60
|
+
* @param handler - Callback to receive input as Uint8Array
|
|
61
|
+
* @returns Disposable to unsubscribe
|
|
62
|
+
*/
|
|
63
|
+
onInput(handler: InputHandler): Disposable;
|
|
64
|
+
/**
|
|
65
|
+
* Subscribe to resize events.
|
|
66
|
+
* @param handler - Callback to receive new terminal size
|
|
67
|
+
* @returns Disposable to unsubscribe
|
|
68
|
+
*/
|
|
69
|
+
onResize(handler: ResizeHandler): Disposable;
|
|
70
|
+
/**
|
|
71
|
+
* Write data to the terminal output.
|
|
72
|
+
* @param data - String data to write
|
|
73
|
+
*/
|
|
74
|
+
write(data: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Get the current terminal size.
|
|
77
|
+
* @returns Current terminal dimensions
|
|
78
|
+
*/
|
|
79
|
+
getSize(): TerminalSize;
|
|
80
|
+
/**
|
|
81
|
+
* Enable raw mode (no line buffering, no echo).
|
|
82
|
+
*/
|
|
83
|
+
enableRawMode(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Disable raw mode.
|
|
86
|
+
*/
|
|
87
|
+
disableRawMode(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Check if the terminal is a TTY.
|
|
90
|
+
* @returns True if the terminal is a TTY
|
|
91
|
+
*/
|
|
92
|
+
isTTY(): boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Signal adapter interface for handling OS signals.
|
|
96
|
+
* @public
|
|
97
|
+
*/
|
|
98
|
+
interface SignalAdapter extends Disposable {
|
|
99
|
+
/**
|
|
100
|
+
* Subscribe to interrupt signals (SIGINT in Node, beforeunload in browser).
|
|
101
|
+
* @param handler - Callback to invoke on interrupt
|
|
102
|
+
* @returns Disposable to unsubscribe
|
|
103
|
+
*/
|
|
104
|
+
onInterrupt(handler: SignalHandler): Disposable;
|
|
105
|
+
/**
|
|
106
|
+
* Subscribe to termination signals (SIGTERM in Node).
|
|
107
|
+
* @param handler - Callback to invoke on termination
|
|
108
|
+
* @returns Disposable to unsubscribe
|
|
109
|
+
*/
|
|
110
|
+
onTerminate(handler: SignalHandler): Disposable;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Clipboard adapter interface for platform-agnostic clipboard operations.
|
|
114
|
+
* @public
|
|
115
|
+
*/
|
|
116
|
+
interface ClipboardAdapter {
|
|
117
|
+
/**
|
|
118
|
+
* Read text from the clipboard.
|
|
119
|
+
* @returns Promise resolving to clipboard text
|
|
120
|
+
*/
|
|
121
|
+
read(): Promise<string>;
|
|
122
|
+
/**
|
|
123
|
+
* Write text to the clipboard.
|
|
124
|
+
* @param text - Text to write
|
|
125
|
+
* @returns Promise resolving when complete
|
|
126
|
+
*/
|
|
127
|
+
write(text: string): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Check if clipboard operations are available.
|
|
130
|
+
* @returns True if clipboard is available
|
|
131
|
+
*/
|
|
132
|
+
isAvailable(): boolean;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Environment adapter interface for platform-agnostic environment access.
|
|
136
|
+
* @public
|
|
137
|
+
*/
|
|
138
|
+
interface EnvironmentAdapter {
|
|
139
|
+
/**
|
|
140
|
+
* Get an environment variable value.
|
|
141
|
+
* @param name - Variable name
|
|
142
|
+
* @returns Variable value or undefined
|
|
143
|
+
*/
|
|
144
|
+
get(name: string): string | undefined;
|
|
145
|
+
/**
|
|
146
|
+
* Get color support level.
|
|
147
|
+
* @returns Color support information
|
|
148
|
+
*/
|
|
149
|
+
getColorSupport(): ColorSupport;
|
|
150
|
+
/**
|
|
151
|
+
* Detect terminal background mode.
|
|
152
|
+
* @returns Background mode (dark, light, or unknown)
|
|
153
|
+
*/
|
|
154
|
+
getTerminalBackground(): TerminalBackground;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* File stat information returned by filesystem operations.
|
|
158
|
+
* @public
|
|
159
|
+
*/
|
|
160
|
+
interface FileStat {
|
|
161
|
+
/** File size in bytes. */
|
|
162
|
+
readonly size: number;
|
|
163
|
+
/** Unix file mode (permissions). */
|
|
164
|
+
readonly mode: number;
|
|
165
|
+
/** Last modification time. */
|
|
166
|
+
readonly mtime: Date;
|
|
167
|
+
/** Whether this is a directory. */
|
|
168
|
+
readonly isDirectory: boolean;
|
|
169
|
+
/** Whether this is a regular file. */
|
|
170
|
+
readonly isFile: boolean;
|
|
171
|
+
/** Whether this is a symbolic link. */
|
|
172
|
+
readonly isSymbolicLink: boolean;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Directory entry returned by readdir with withFileTypes option.
|
|
176
|
+
* @public
|
|
177
|
+
*/
|
|
178
|
+
interface DirectoryEntry {
|
|
179
|
+
/** Name of the file or directory. */
|
|
180
|
+
readonly name: string;
|
|
181
|
+
/** Check if this entry is a directory. */
|
|
182
|
+
isDirectory(): boolean;
|
|
183
|
+
/** Check if this entry is a regular file. */
|
|
184
|
+
isFile(): boolean;
|
|
185
|
+
/** Check if this entry is a symbolic link. */
|
|
186
|
+
isSymbolicLink(): boolean;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* FileSystem adapter interface for platform-agnostic file operations.
|
|
190
|
+
* @public
|
|
191
|
+
*/
|
|
192
|
+
interface FileSystemAdapter {
|
|
193
|
+
/**
|
|
194
|
+
* Read directory contents.
|
|
195
|
+
* @param path - Directory path
|
|
196
|
+
* @param options - Options for reading directory
|
|
197
|
+
* @returns Array of directory entries or file names
|
|
198
|
+
*/
|
|
199
|
+
readdir(path: string, options?: {
|
|
200
|
+
withFileTypes?: boolean;
|
|
201
|
+
}): Promise<DirectoryEntry[] | string[]>;
|
|
202
|
+
/**
|
|
203
|
+
* Get file/directory stats.
|
|
204
|
+
* @param path - File or directory path
|
|
205
|
+
* @returns File stat information
|
|
206
|
+
*/
|
|
207
|
+
stat(path: string): Promise<FileStat>;
|
|
208
|
+
/**
|
|
209
|
+
* Read file contents as text.
|
|
210
|
+
* @param path - File path
|
|
211
|
+
* @param encoding - Text encoding (default: 'utf-8')
|
|
212
|
+
* @returns File contents as string
|
|
213
|
+
*/
|
|
214
|
+
readFile(path: string, encoding?: string): Promise<string>;
|
|
215
|
+
/**
|
|
216
|
+
* Write text to a file.
|
|
217
|
+
* @param path - File path
|
|
218
|
+
* @param content - Text content to write
|
|
219
|
+
* @returns Promise resolving when complete
|
|
220
|
+
*/
|
|
221
|
+
writeFile(path: string, content: string): Promise<void>;
|
|
222
|
+
/**
|
|
223
|
+
* Check if a file or directory exists.
|
|
224
|
+
* @param path - File or directory path
|
|
225
|
+
* @returns True if the path exists
|
|
226
|
+
*/
|
|
227
|
+
exists(path: string): Promise<boolean>;
|
|
228
|
+
/**
|
|
229
|
+
* Create a directory.
|
|
230
|
+
* @param path - Directory path
|
|
231
|
+
* @param options - Options for directory creation
|
|
232
|
+
* @returns Promise resolving when complete
|
|
233
|
+
*/
|
|
234
|
+
mkdir(path: string, options?: {
|
|
235
|
+
recursive?: boolean;
|
|
236
|
+
}): Promise<void>;
|
|
237
|
+
/**
|
|
238
|
+
* Delete a file.
|
|
239
|
+
* @param path - File path
|
|
240
|
+
* @returns Promise resolving when complete
|
|
241
|
+
*/
|
|
242
|
+
unlink(path: string): Promise<void>;
|
|
243
|
+
/**
|
|
244
|
+
* Remove a directory.
|
|
245
|
+
* @param path - Directory path
|
|
246
|
+
* @param options - Options for directory removal
|
|
247
|
+
* @returns Promise resolving when complete
|
|
248
|
+
*/
|
|
249
|
+
rmdir(path: string, options?: {
|
|
250
|
+
recursive?: boolean;
|
|
251
|
+
force?: boolean;
|
|
252
|
+
}): Promise<void>;
|
|
253
|
+
/**
|
|
254
|
+
* Rename or move a file or directory.
|
|
255
|
+
* @param src - Source path
|
|
256
|
+
* @param dst - Destination path
|
|
257
|
+
* @returns Promise resolving when complete
|
|
258
|
+
*/
|
|
259
|
+
rename(src: string, dst: string): Promise<void>;
|
|
260
|
+
/**
|
|
261
|
+
* Copy a file.
|
|
262
|
+
* @param src - Source file path
|
|
263
|
+
* @param dst - Destination file path
|
|
264
|
+
* @returns Promise resolving when complete
|
|
265
|
+
*/
|
|
266
|
+
copyFile(src: string, dst: string): Promise<void>;
|
|
267
|
+
/**
|
|
268
|
+
* Get current working directory.
|
|
269
|
+
* @returns Current working directory path
|
|
270
|
+
*/
|
|
271
|
+
cwd(): string;
|
|
272
|
+
/**
|
|
273
|
+
* Get user's home directory.
|
|
274
|
+
* @returns Home directory path
|
|
275
|
+
*/
|
|
276
|
+
homedir(): string;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Path adapter interface for platform-agnostic path operations.
|
|
280
|
+
* @public
|
|
281
|
+
*/
|
|
282
|
+
interface PathAdapter {
|
|
283
|
+
/**
|
|
284
|
+
* Join path segments.
|
|
285
|
+
* @param segments - Path segments to join
|
|
286
|
+
* @returns Joined path
|
|
287
|
+
*/
|
|
288
|
+
join(...segments: string[]): string;
|
|
289
|
+
/**
|
|
290
|
+
* Get directory name from path.
|
|
291
|
+
* @param path - File or directory path
|
|
292
|
+
* @returns Directory name
|
|
293
|
+
*/
|
|
294
|
+
dirname(path: string): string;
|
|
295
|
+
/**
|
|
296
|
+
* Get base name from path.
|
|
297
|
+
* @param path - File or directory path
|
|
298
|
+
* @param ext - Optional extension to remove
|
|
299
|
+
* @returns Base name
|
|
300
|
+
*/
|
|
301
|
+
basename(path: string, ext?: string): string;
|
|
302
|
+
/**
|
|
303
|
+
* Get file extension.
|
|
304
|
+
* @param path - File path
|
|
305
|
+
* @returns Extension (including dot)
|
|
306
|
+
*/
|
|
307
|
+
extname(path: string): string;
|
|
308
|
+
/**
|
|
309
|
+
* Resolve path segments to absolute path.
|
|
310
|
+
* @param segments - Path segments to resolve
|
|
311
|
+
* @returns Absolute path
|
|
312
|
+
*/
|
|
313
|
+
resolve(...segments: string[]): string;
|
|
314
|
+
/**
|
|
315
|
+
* Check if path is absolute.
|
|
316
|
+
* @param path - Path to check
|
|
317
|
+
* @returns True if path is absolute
|
|
318
|
+
*/
|
|
319
|
+
isAbsolute(path: string): boolean;
|
|
320
|
+
/**
|
|
321
|
+
* Normalize a path.
|
|
322
|
+
* @param path - Path to normalize
|
|
323
|
+
* @returns Normalized path
|
|
324
|
+
*/
|
|
325
|
+
normalize(path: string): string;
|
|
326
|
+
/**
|
|
327
|
+
* Platform-specific path separator.
|
|
328
|
+
*/
|
|
329
|
+
readonly sep: string;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Archive adapter interface for zip/unzip operations.
|
|
333
|
+
* @public
|
|
334
|
+
*/
|
|
335
|
+
interface ArchiveAdapter {
|
|
336
|
+
/**
|
|
337
|
+
* Create a zip archive from a directory.
|
|
338
|
+
* @param sourceDir - Source directory to archive
|
|
339
|
+
* @param destPath - Destination path for the zip file
|
|
340
|
+
*/
|
|
341
|
+
zip(sourceDir: string, destPath: string): Promise<void>;
|
|
342
|
+
/**
|
|
343
|
+
* Extract a zip archive to a directory.
|
|
344
|
+
* @param archivePath - Path to the zip file
|
|
345
|
+
* @param destDir - Destination directory for extraction
|
|
346
|
+
*/
|
|
347
|
+
unzip(archivePath: string, destDir: string): Promise<void>;
|
|
348
|
+
/**
|
|
349
|
+
* Check if archive operations are available.
|
|
350
|
+
* @returns True if archiving is supported on this platform
|
|
351
|
+
*/
|
|
352
|
+
isAvailable(): boolean;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Chainable style function for terminal text styling.
|
|
356
|
+
* @public
|
|
357
|
+
*/
|
|
358
|
+
interface StyleFn {
|
|
359
|
+
(text: string): string;
|
|
360
|
+
readonly bold: StyleFn;
|
|
361
|
+
readonly dim: StyleFn;
|
|
362
|
+
readonly italic: StyleFn;
|
|
363
|
+
readonly underline: StyleFn;
|
|
364
|
+
readonly strikethrough: StyleFn;
|
|
365
|
+
readonly inverse: StyleFn;
|
|
366
|
+
readonly hidden: StyleFn;
|
|
367
|
+
readonly black: StyleFn;
|
|
368
|
+
readonly red: StyleFn;
|
|
369
|
+
readonly green: StyleFn;
|
|
370
|
+
readonly yellow: StyleFn;
|
|
371
|
+
readonly blue: StyleFn;
|
|
372
|
+
readonly magenta: StyleFn;
|
|
373
|
+
readonly cyan: StyleFn;
|
|
374
|
+
readonly white: StyleFn;
|
|
375
|
+
readonly gray: StyleFn;
|
|
376
|
+
readonly grey: StyleFn;
|
|
377
|
+
readonly blackBright: StyleFn;
|
|
378
|
+
readonly redBright: StyleFn;
|
|
379
|
+
readonly greenBright: StyleFn;
|
|
380
|
+
readonly yellowBright: StyleFn;
|
|
381
|
+
readonly blueBright: StyleFn;
|
|
382
|
+
readonly magentaBright: StyleFn;
|
|
383
|
+
readonly cyanBright: StyleFn;
|
|
384
|
+
readonly whiteBright: StyleFn;
|
|
385
|
+
readonly bgBlack: StyleFn;
|
|
386
|
+
readonly bgRed: StyleFn;
|
|
387
|
+
readonly bgGreen: StyleFn;
|
|
388
|
+
readonly bgYellow: StyleFn;
|
|
389
|
+
readonly bgBlue: StyleFn;
|
|
390
|
+
readonly bgMagenta: StyleFn;
|
|
391
|
+
readonly bgCyan: StyleFn;
|
|
392
|
+
readonly bgWhite: StyleFn;
|
|
393
|
+
readonly bgBlackBright: StyleFn;
|
|
394
|
+
readonly bgRedBright: StyleFn;
|
|
395
|
+
readonly bgGreenBright: StyleFn;
|
|
396
|
+
readonly bgYellowBright: StyleFn;
|
|
397
|
+
readonly bgBlueBright: StyleFn;
|
|
398
|
+
readonly bgMagentaBright: StyleFn;
|
|
399
|
+
readonly bgCyanBright: StyleFn;
|
|
400
|
+
readonly bgWhiteBright: StyleFn;
|
|
401
|
+
hex(color: string): StyleFn;
|
|
402
|
+
rgb(r: number, g: number, b: number): StyleFn;
|
|
403
|
+
bgHex(color: string): StyleFn;
|
|
404
|
+
bgRgb(r: number, g: number, b: number): StyleFn;
|
|
405
|
+
ansi256(code: number): StyleFn;
|
|
406
|
+
bgAnsi256(code: number): StyleFn;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Style adapter for platform-agnostic terminal styling.
|
|
410
|
+
* @public
|
|
411
|
+
*/
|
|
412
|
+
interface StyleAdapter {
|
|
413
|
+
/** The chainable style function. */
|
|
414
|
+
readonly style: StyleFn;
|
|
415
|
+
/** Whether styling is enabled. */
|
|
416
|
+
readonly enabled: boolean;
|
|
417
|
+
/** Color support level (0-3). */
|
|
418
|
+
readonly level: number;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Complete platform adapter combining all platform-specific functionality.
|
|
422
|
+
* @public
|
|
423
|
+
*/
|
|
424
|
+
interface PlatformAdapter extends Disposable {
|
|
425
|
+
/** Terminal I/O adapter. */
|
|
426
|
+
readonly terminal: TerminalAdapter;
|
|
427
|
+
/** Signal handling adapter. */
|
|
428
|
+
readonly signals: SignalAdapter;
|
|
429
|
+
/** Clipboard operations adapter. */
|
|
430
|
+
readonly clipboard: ClipboardAdapter;
|
|
431
|
+
/** Environment access adapter. */
|
|
432
|
+
readonly environment: EnvironmentAdapter;
|
|
433
|
+
/** FileSystem operations adapter. */
|
|
434
|
+
readonly filesystem: FileSystemAdapter;
|
|
435
|
+
/** Path operations adapter. */
|
|
436
|
+
readonly path: PathAdapter;
|
|
437
|
+
/** Archive operations adapter. */
|
|
438
|
+
readonly archive: ArchiveAdapter;
|
|
439
|
+
/** Style adapter for terminal text styling. */
|
|
440
|
+
readonly style: StyleAdapter;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
export type { ArchiveAdapter as A, ColorSupport as C, DirectoryEntry as D, EnvironmentAdapter as E, FileStat as F, InputHandler as I, PathAdapter as P, ResizeHandler as R, StyleFn as S, TerminalAdapter as T, ClipboardAdapter as a, Disposable as b, FileSystemAdapter as c, PlatformAdapter as d, SignalAdapter as e, SignalHandler as f, StyleAdapter as g, TerminalBackground as h, TerminalSize as i };
|