elit 3.5.3 → 3.5.5
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 +82 -4
- package/dist/chokidar.d.ts.map +1 -1
- package/dist/chokidar.js +306 -16
- package/dist/chokidar.js.map +1 -1
- package/dist/chokidar.mjs +306 -16
- package/dist/chokidar.mjs.map +1 -1
- package/dist/cli.d.mts +15 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2547 -185
- package/dist/cli.mjs +81817 -0
- package/dist/config.d.mts +96 -1
- package/dist/config.d.ts +95 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/config.mjs.map +1 -1
- package/dist/mobile-cli.d.ts.map +1 -1
- package/dist/pm-cli.d.ts +139 -0
- package/dist/pm-cli.d.ts.map +1 -0
- package/dist/server.js +220 -197
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +221 -198
- package/dist/server.mjs.map +1 -1
- package/dist/wapk-cli.d.ts +25 -4
- package/dist/wapk-cli.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/chokidar.ts +28 -2
- package/src/cli.ts +45 -5
- package/src/config.ts +101 -0
- package/src/desktop-cli.ts +2 -2
- package/src/mobile-cli.ts +52 -39
- package/src/pm-cli.ts +2369 -0
- package/src/wapk-cli.ts +717 -51
package/dist/chokidar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chokidar.ts","../src/runtime.ts"],"sourcesContent":["/**\n * File watcher module with unified API across runtimes\n * Pure implementation without external dependencies\n * Compatible with 'chokidar' package API\n * - Node.js: uses native fs.watch\n * - Bun: uses native fs.watch with enhancements\n * - Deno: uses Deno.watchFs\n */\n\nimport { EventEmitter } from 'events';\nimport { runtime } from './runtime';\n\n/**\n * Helper: Normalize path separators (eliminates duplication in path handling)\n */\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n\n/**\n * Helper: Emit event and all event (eliminates duplication in event emitting)\n */\nfunction emitEvent(watcher: FSWatcher, eventType: string, path: string): void {\n watcher.emit(eventType, path);\n watcher.emit('all', eventType, path);\n}\n\n/**\n * Helper: Check if path matches any pattern (eliminates duplication in pattern matching)\n */\nfunction matchesAnyPattern(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => matchesPattern(path, pattern));\n}\n\n/**\n * Helper: Handle rename event (eliminates duplication in rename handling)\n */\nfunction handleRenameEvent(watcher: FSWatcher, fullPath: string, fs: any): void {\n try {\n fs.statSync(fullPath);\n emitEvent(watcher, 'add', fullPath);\n } catch {\n emitEvent(watcher, 'unlink', fullPath);\n }\n}\n\n/**\n * Helper: Setup fs.watch for Node.js/Bun (eliminates duplication in watcher setup)\n */\nfunction setupFsWatch(\n watcher: FSWatcher,\n baseDir: string,\n patterns: string[],\n fs: any\n): void {\n try {\n const nativeWatcher = fs.watch(baseDir, { recursive: true }, (eventType: string, filename: string) => {\n if (!filename) return;\n\n const fullPath = normalizePath(`${baseDir}/${filename}`);\n\n // Check if the file matches any of the patterns\n if (!matchesAnyPattern(fullPath, patterns)) return;\n\n if (eventType === 'rename') {\n handleRenameEvent(watcher, fullPath, fs);\n } else if (eventType === 'change') {\n emitEvent(watcher, 'change', fullPath);\n }\n });\n\n watcher._setWatcher(nativeWatcher);\n // Track watched paths directly\n watcher['_watched'].add(baseDir);\n\n // Emit ready after a short delay\n queueMicrotask(() => watcher.emit('ready'));\n } catch (error) {\n watcher.emit('error', error as Error);\n }\n}\n\n/**\n * Watch options\n */\nexport interface WatchOptions {\n /**\n * Indicates whether the process should continue to run as long as files are being watched.\n * If set to false, the process will continue running even if the watcher is closed.\n */\n persistent?: boolean;\n\n /**\n * Indicates whether to watch files that don't have read permissions.\n */\n ignorePermissionErrors?: boolean;\n\n /**\n * A function that takes one parameter (the path of the file/directory)\n * and returns true to ignore or false to watch.\n */\n ignored?: string | RegExp | ((path: string) => boolean);\n\n /**\n * If set to false, only the parent directory will be watched for new files.\n */\n ignoreInitial?: boolean;\n\n /**\n * If set to true, symlinks will be followed.\n */\n followSymlinks?: boolean;\n\n /**\n * Interval of file system polling (in milliseconds).\n */\n interval?: number;\n\n /**\n * Interval of file system polling for binary files (in milliseconds).\n */\n binaryInterval?: number;\n\n /**\n * If set to true, will provide fs.Stats object as second argument\n * in add, addDir, and change events.\n */\n alwaysStat?: boolean;\n\n /**\n * If set, limits how many levels of subdirectories will be traversed.\n */\n depth?: number;\n\n /**\n * By default, add event fires when a file first appears on disk.\n * Setting this will wait for the write to finish before firing.\n */\n awaitWriteFinish?: boolean | {\n stabilityThreshold?: number;\n pollInterval?: number;\n };\n\n /**\n * If set to true, will use fs.watchFile() (polling) instead of fs.watch().\n */\n usePolling?: boolean;\n\n /**\n * Whether to use fsevents watching on macOS (if available).\n */\n useFsEvents?: boolean;\n\n /**\n * The base path to watch.\n */\n cwd?: string;\n\n /**\n * Whether to disable globbing.\n */\n disableGlobbing?: boolean;\n\n /**\n * Automatically filter out artifacts that occur when using editors.\n */\n atomic?: boolean | number;\n}\n\n/**\n * FSWatcher class - Compatible with chokidar\n */\nexport class FSWatcher extends EventEmitter {\n private _watcher: any;\n private _closed: boolean = false;\n private _watched: Set<string> = new Set();\n\n constructor(options?: WatchOptions) {\n super();\n this.options = options || {};\n }\n\n public options: WatchOptions;\n\n /**\n * Add paths to be watched\n */\n add(paths: string | string[]): FSWatcher {\n if (this._closed) {\n throw new Error('Watcher has been closed');\n }\n\n const pathArray = Array.isArray(paths) ? paths : [paths];\n\n if (runtime === 'node') {\n if (this._watcher) {\n this._watcher.add(pathArray);\n }\n } else {\n pathArray.forEach(path => this._watched.add(path));\n }\n\n return this;\n }\n\n /**\n * Stop watching paths\n */\n unwatch(paths: string | string[]): FSWatcher {\n if (this._closed) {\n return this;\n }\n\n const pathArray = Array.isArray(paths) ? paths : [paths];\n\n if (runtime === 'node') {\n if (this._watcher) {\n this._watcher.unwatch(pathArray);\n }\n } else {\n pathArray.forEach(path => this._watched.delete(path));\n }\n\n return this;\n }\n\n /**\n * Close the watcher\n */\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n\n if (runtime === 'node') {\n if (this._watcher) {\n await this._watcher.close();\n }\n }\n\n this.removeAllListeners();\n }\n\n /**\n * Get watched paths\n */\n getWatched(): { [directory: string]: string[] } {\n if (runtime === 'node' && this._watcher) {\n return this._watcher.getWatched();\n }\n\n const result: { [directory: string]: string[] } = {};\n this._watched.forEach(path => {\n const dir = path.substring(0, path.lastIndexOf('/')) || '.';\n const file = path.substring(path.lastIndexOf('/') + 1);\n if (!result[dir]) {\n result[dir] = [];\n }\n result[dir].push(file);\n });\n\n return result;\n }\n\n /**\n * Internal method to set native watcher\n * @internal\n */\n _setWatcher(watcher: any): void {\n this._watcher = watcher;\n }\n}\n\n/**\n * Extract base directory from glob pattern\n * e.g., 'src/**\\/*.ts' -> 'src', '**\\/*.ts' -> '.'\n */\nfunction getBaseDirectory(pattern: string): string {\n // Remove glob patterns to get the base directory\n const parts = pattern.split(/[\\\\\\/]/);\n let baseDir = '';\n\n for (const part of parts) {\n if (part.includes('*') || part.includes('?')) {\n break;\n }\n baseDir = baseDir ? `${baseDir}/${part}` : part;\n }\n\n return baseDir || '.';\n}\n\n/**\n * Check if a path matches a glob pattern\n */\nfunction matchesPattern(filePath: string, pattern: string): boolean {\n // Simple glob matching - convert pattern to regex\n const regexPattern = normalizePath(pattern)\n .replace(/\\*\\*/g, '.*')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${regexPattern}$`);\n const normalizedPath = normalizePath(filePath);\n\n return regex.test(normalizedPath);\n}\n\n/**\n * Watch files and directories\n */\nexport function watch(\n paths: string | string[],\n options?: WatchOptions\n): FSWatcher {\n const watcher = new FSWatcher(options);\n const pathArray = Array.isArray(paths) ? paths : [paths];\n\n // Extract patterns and their base directories\n const watchMap = new Map<string, string[]>();\n\n pathArray.forEach(path => {\n const baseDir = getBaseDirectory(path);\n if (!watchMap.has(baseDir)) {\n watchMap.set(baseDir, []);\n }\n watchMap.get(baseDir)!.push(path);\n });\n\n if (runtime === 'node') {\n // Node.js - use native fs.watch\n const fs = require('fs');\n watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns, fs));\n } else if (runtime === 'bun') {\n // Bun - use native fs.watch\n const fs = require('fs');\n watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns, fs));\n } else if (runtime === 'deno') {\n // Deno - use Deno.watchFs\n // Extract just the base directories for Deno\n const baseDirs = Array.from(watchMap.keys());\n const allPatterns = Array.from(watchMap.values()).flat();\n\n (async () => {\n try {\n // @ts-ignore\n const denoWatcher = Deno.watchFs(baseDirs);\n\n for await (const event of denoWatcher) {\n if (watcher['_closed']) break;\n\n for (const path of event.paths) {\n const normalizedPath = normalizePath(path);\n\n // Check if the file matches any of the patterns\n if (!matchesAnyPattern(normalizedPath, allPatterns)) continue;\n\n switch (event.kind) {\n case 'create':\n emitEvent(watcher, 'add', path);\n break;\n case 'modify':\n emitEvent(watcher, 'change', path);\n break;\n case 'remove':\n emitEvent(watcher, 'unlink', path);\n break;\n }\n }\n }\n } catch (error) {\n if (!watcher['_closed']) {\n watcher.emit('error', error as Error);\n }\n }\n })();\n\n pathArray.forEach(path => watcher.add(path));\n queueMicrotask(() => watcher.emit('ready'));\n }\n\n return watcher;\n}\n\n/**\n * Get current runtime\n */\nexport function getRuntime(): 'node' | 'bun' | 'deno' {\n return runtime;\n}\n\n/**\n * Default export\n */\nexport default {\n watch,\n FSWatcher,\n getRuntime,\n};\n","/**\n * Runtime detection and global type declarations\n * Shared across all modules for consistency\n */\n\n/**\n * Runtime detection (cached at module load)\n */\nexport const runtime = (() => {\n // @ts-ignore - Deno global\n if (typeof Deno !== 'undefined') return 'deno';\n // @ts-ignore - Bun global\n if (typeof Bun !== 'undefined') return 'bun';\n return 'node';\n})() as 'node' | 'bun' | 'deno';\n\nexport const isNode = runtime === 'node';\nexport const isBun = runtime === 'bun';\nexport const isDeno = runtime === 'deno';\n\n// Global declarations for runtime-specific APIs\ndeclare global {\n // @ts-ignore - Bun global\n const Bun: {\n build(options: {\n entrypoints: string[];\n outdir?: string;\n target?: string;\n format?: string;\n minify?: boolean;\n sourcemap?: string;\n external?: string[];\n naming?: string;\n plugins?: any[];\n define?: Record<string, string>;\n }): Promise<{\n success: boolean;\n outputs: Array<{ path: string; size: number }>;\n logs: any[];\n }>;\n Transpiler: new (options?: {\n loader?: string;\n target?: string;\n minify?: boolean;\n }) => {\n transform(code: string, loader?: string): Promise<string>;\n transformSync(code: string, loader?: string): string;\n };\n file(path: string): {\n size: number;\n arrayBuffer(): ArrayBuffer | Promise<ArrayBuffer>;\n exists(): Promise<boolean>;\n };\n write(path: string, data: string | Buffer | Uint8Array): Promise<void>;\n } | undefined;\n\n // @ts-ignore - Deno global\n const Deno: {\n emit(rootSpecifier: string | URL, options?: {\n bundle?: 'module' | 'classic';\n check?: boolean;\n compilerOptions?: any;\n importMap?: string;\n importMapPath?: string;\n sources?: Record<string, string>;\n }): Promise<{\n files: Record<string, string>;\n diagnostics: any[];\n }>;\n writeTextFile(path: string, data: string): Promise<void>;\n readFile(path: string): Promise<Uint8Array>;\n readFileSync(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array): Promise<void>;\n writeFileSync(path: string, data: Uint8Array): void;\n stat(path: string): Promise<any>;\n statSync(path: string): any;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n mkdirSync(path: string, options?: { recursive?: boolean }): void;\n readDir(path: string): AsyncIterable<any>;\n readDirSync(path: string): Iterable<any>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n removeSync(path: string, options?: { recursive?: boolean }): void;\n rename(oldPath: string, newPath: string): Promise<void>;\n renameSync(oldPath: string, newPath: string): void;\n copyFile(src: string, dest: string): Promise<void>;\n copyFileSync(src: string, dest: string): void;\n realPath(path: string): Promise<string>;\n realPathSync(path: string): string;\n watchFs(paths: string | string[]): AsyncIterable<{\n kind: string;\n paths: string[];\n }>;\n build: {\n os: string;\n };\n } | undefined;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/chokidar.ts","../src/runtime.ts","../src/fs.ts","../src/path.ts"],"sourcesContent":["/**\n * File watcher module with unified API across runtimes\n * Pure implementation without external dependencies\n * Compatible with 'chokidar' package API\n * - Node.js: uses native fs.watch\n * - Bun: uses native fs.watch with enhancements\n * - Deno: uses Deno.watchFs\n */\n\nimport { EventEmitter } from 'events';\nimport { existsSync, statSync } from './fs';\nimport { dirname } from './path';\nimport { runtime } from './runtime';\n\n/**\n * Helper: Normalize path separators (eliminates duplication in path handling)\n */\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n\n/**\n * Helper: Emit event and all event (eliminates duplication in event emitting)\n */\nfunction emitEvent(watcher: FSWatcher, eventType: string, path: string): void {\n watcher.emit(eventType, path);\n watcher.emit('all', eventType, path);\n}\n\n/**\n * Helper: Check if path matches any pattern (eliminates duplication in pattern matching)\n */\nfunction matchesAnyPattern(path: string, patterns: string[]): boolean {\n return patterns.some(pattern => matchesPattern(path, pattern));\n}\n\n/**\n * Helper: Handle rename event (eliminates duplication in rename handling)\n */\nfunction handleRenameEvent(watcher: FSWatcher, fullPath: string, fs: any): void {\n try {\n fs.statSync(fullPath);\n emitEvent(watcher, 'add', fullPath);\n } catch {\n emitEvent(watcher, 'unlink', fullPath);\n }\n}\n\n/**\n * Helper: Setup fs.watch for Node.js/Bun (eliminates duplication in watcher setup)\n */\nfunction setupFsWatch(\n watcher: FSWatcher,\n baseDir: string,\n patterns: string[],\n fs: any\n): void {\n try {\n const nativeWatcher = fs.watch(baseDir, { recursive: true }, (eventType: string, filename: string) => {\n if (!filename) return;\n\n const fullPath = normalizePath(`${baseDir}/${filename}`);\n\n // Check if the file matches any of the patterns\n if (!matchesAnyPattern(fullPath, patterns)) return;\n\n if (eventType === 'rename') {\n handleRenameEvent(watcher, fullPath, fs);\n } else if (eventType === 'change') {\n emitEvent(watcher, 'change', fullPath);\n }\n });\n\n watcher._setWatcher(nativeWatcher);\n // Track watched paths directly\n watcher['_watched'].add(baseDir);\n\n // Emit ready after a short delay\n queueMicrotask(() => watcher.emit('ready'));\n } catch (error) {\n watcher.emit('error', error as Error);\n }\n}\n\n/**\n * Watch options\n */\nexport interface WatchOptions {\n /**\n * Indicates whether the process should continue to run as long as files are being watched.\n * If set to false, the process will continue running even if the watcher is closed.\n */\n persistent?: boolean;\n\n /**\n * Indicates whether to watch files that don't have read permissions.\n */\n ignorePermissionErrors?: boolean;\n\n /**\n * A function that takes one parameter (the path of the file/directory)\n * and returns true to ignore or false to watch.\n */\n ignored?: string | RegExp | ((path: string) => boolean);\n\n /**\n * If set to false, only the parent directory will be watched for new files.\n */\n ignoreInitial?: boolean;\n\n /**\n * If set to true, symlinks will be followed.\n */\n followSymlinks?: boolean;\n\n /**\n * Interval of file system polling (in milliseconds).\n */\n interval?: number;\n\n /**\n * Interval of file system polling for binary files (in milliseconds).\n */\n binaryInterval?: number;\n\n /**\n * If set to true, will provide fs.Stats object as second argument\n * in add, addDir, and change events.\n */\n alwaysStat?: boolean;\n\n /**\n * If set, limits how many levels of subdirectories will be traversed.\n */\n depth?: number;\n\n /**\n * By default, add event fires when a file first appears on disk.\n * Setting this will wait for the write to finish before firing.\n */\n awaitWriteFinish?: boolean | {\n stabilityThreshold?: number;\n pollInterval?: number;\n };\n\n /**\n * If set to true, will use fs.watchFile() (polling) instead of fs.watch().\n */\n usePolling?: boolean;\n\n /**\n * Whether to use fsevents watching on macOS (if available).\n */\n useFsEvents?: boolean;\n\n /**\n * The base path to watch.\n */\n cwd?: string;\n\n /**\n * Whether to disable globbing.\n */\n disableGlobbing?: boolean;\n\n /**\n * Automatically filter out artifacts that occur when using editors.\n */\n atomic?: boolean | number;\n}\n\n/**\n * FSWatcher class - Compatible with chokidar\n */\nexport class FSWatcher extends EventEmitter {\n private _watcher: any;\n private _closed: boolean = false;\n private _watched: Set<string> = new Set();\n\n constructor(options?: WatchOptions) {\n super();\n this.options = options || {};\n }\n\n public options: WatchOptions;\n\n /**\n * Add paths to be watched\n */\n add(paths: string | string[]): FSWatcher {\n if (this._closed) {\n throw new Error('Watcher has been closed');\n }\n\n const pathArray = Array.isArray(paths) ? paths : [paths];\n\n if (runtime === 'node') {\n if (this._watcher) {\n this._watcher.add(pathArray);\n }\n } else {\n pathArray.forEach(path => this._watched.add(path));\n }\n\n return this;\n }\n\n /**\n * Stop watching paths\n */\n unwatch(paths: string | string[]): FSWatcher {\n if (this._closed) {\n return this;\n }\n\n const pathArray = Array.isArray(paths) ? paths : [paths];\n\n if (runtime === 'node') {\n if (this._watcher) {\n this._watcher.unwatch(pathArray);\n }\n } else {\n pathArray.forEach(path => this._watched.delete(path));\n }\n\n return this;\n }\n\n /**\n * Close the watcher\n */\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n\n if (runtime === 'node') {\n if (this._watcher) {\n await this._watcher.close();\n }\n }\n\n this.removeAllListeners();\n }\n\n /**\n * Get watched paths\n */\n getWatched(): { [directory: string]: string[] } {\n if (runtime === 'node' && this._watcher) {\n return this._watcher.getWatched();\n }\n\n const result: { [directory: string]: string[] } = {};\n this._watched.forEach(path => {\n const dir = path.substring(0, path.lastIndexOf('/')) || '.';\n const file = path.substring(path.lastIndexOf('/') + 1);\n if (!result[dir]) {\n result[dir] = [];\n }\n result[dir].push(file);\n });\n\n return result;\n }\n\n /**\n * Internal method to set native watcher\n * @internal\n */\n _setWatcher(watcher: any): void {\n this._watcher = watcher;\n }\n}\n\n/**\n * Extract base directory from glob pattern\n * e.g., 'src/**\\/*.ts' -> 'src', '**\\/*.ts' -> '.'\n */\nfunction getBaseDirectory(pattern: string): string {\n const normalizedPattern = normalizePath(pattern);\n\n // Remove glob patterns to get the base directory\n const parts = normalizedPattern.split(/[\\\\\\/]/);\n let baseDir = '';\n let sawGlob = false;\n\n for (const part of parts) {\n if (part.includes('*') || part.includes('?')) {\n sawGlob = true;\n break;\n }\n baseDir = baseDir ? `${baseDir}/${part}` : part;\n }\n\n if (sawGlob) {\n return baseDir || '.';\n }\n\n if (normalizedPattern && existsSync(normalizedPattern)) {\n try {\n return statSync(normalizedPattern).isDirectory()\n ? normalizedPattern\n : normalizePath(dirname(normalizedPattern)) || '.';\n } catch {\n return normalizePath(dirname(normalizedPattern)) || '.';\n }\n }\n\n const lastSegment = parts[parts.length - 1] || '';\n if (lastSegment.includes('.') && !lastSegment.startsWith('.')) {\n return normalizePath(dirname(normalizedPattern)) || '.';\n }\n\n return normalizedPattern || '.';\n}\n\n/**\n * Check if a path matches a glob pattern\n */\nfunction matchesPattern(filePath: string, pattern: string): boolean {\n // Simple glob matching - convert pattern to regex\n const regexPattern = normalizePath(pattern)\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '.*')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${regexPattern}$`);\n const normalizedPath = normalizePath(filePath);\n\n return regex.test(normalizedPath);\n}\n\n/**\n * Watch files and directories\n */\nexport function watch(\n paths: string | string[],\n options?: WatchOptions\n): FSWatcher {\n const watcher = new FSWatcher(options);\n const pathArray = Array.isArray(paths) ? paths : [paths];\n\n // Extract patterns and their base directories\n const watchMap = new Map<string, string[]>();\n\n pathArray.forEach(path => {\n const baseDir = getBaseDirectory(path);\n if (!watchMap.has(baseDir)) {\n watchMap.set(baseDir, []);\n }\n watchMap.get(baseDir)!.push(path);\n });\n\n if (runtime === 'node') {\n // Node.js - use native fs.watch\n const fs = require('fs');\n watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns, fs));\n } else if (runtime === 'bun') {\n // Bun - use native fs.watch\n const fs = require('fs');\n watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns, fs));\n } else if (runtime === 'deno') {\n // Deno - use Deno.watchFs\n // Extract just the base directories for Deno\n const baseDirs = Array.from(watchMap.keys());\n const allPatterns = Array.from(watchMap.values()).flat();\n\n (async () => {\n try {\n // @ts-ignore\n const denoWatcher = Deno.watchFs(baseDirs);\n\n for await (const event of denoWatcher) {\n if (watcher['_closed']) break;\n\n for (const path of event.paths) {\n const normalizedPath = normalizePath(path);\n\n // Check if the file matches any of the patterns\n if (!matchesAnyPattern(normalizedPath, allPatterns)) continue;\n\n switch (event.kind) {\n case 'create':\n emitEvent(watcher, 'add', path);\n break;\n case 'modify':\n emitEvent(watcher, 'change', path);\n break;\n case 'remove':\n emitEvent(watcher, 'unlink', path);\n break;\n }\n }\n }\n } catch (error) {\n if (!watcher['_closed']) {\n watcher.emit('error', error as Error);\n }\n }\n })();\n\n pathArray.forEach(path => watcher.add(path));\n queueMicrotask(() => watcher.emit('ready'));\n }\n\n return watcher;\n}\n\n/**\n * Get current runtime\n */\nexport function getRuntime(): 'node' | 'bun' | 'deno' {\n return runtime;\n}\n\n/**\n * Default export\n */\nexport default {\n watch,\n FSWatcher,\n getRuntime,\n};\n","/**\n * Runtime detection and global type declarations\n * Shared across all modules for consistency\n */\n\n/**\n * Runtime detection (cached at module load)\n */\nexport const runtime = (() => {\n // @ts-ignore - Deno global\n if (typeof Deno !== 'undefined') return 'deno';\n // @ts-ignore - Bun global\n if (typeof Bun !== 'undefined') return 'bun';\n return 'node';\n})() as 'node' | 'bun' | 'deno';\n\nexport const isNode = runtime === 'node';\nexport const isBun = runtime === 'bun';\nexport const isDeno = runtime === 'deno';\n\n// Global declarations for runtime-specific APIs\ndeclare global {\n // @ts-ignore - Bun global\n const Bun: {\n build(options: {\n entrypoints: string[];\n outdir?: string;\n target?: string;\n format?: string;\n minify?: boolean;\n sourcemap?: string;\n external?: string[];\n naming?: string;\n plugins?: any[];\n define?: Record<string, string>;\n }): Promise<{\n success: boolean;\n outputs: Array<{ path: string; size: number }>;\n logs: any[];\n }>;\n Transpiler: new (options?: {\n loader?: string;\n target?: string;\n minify?: boolean;\n }) => {\n transform(code: string, loader?: string): Promise<string>;\n transformSync(code: string, loader?: string): string;\n };\n file(path: string): {\n size: number;\n arrayBuffer(): ArrayBuffer | Promise<ArrayBuffer>;\n exists(): Promise<boolean>;\n };\n write(path: string, data: string | Buffer | Uint8Array): Promise<void>;\n } | undefined;\n\n // @ts-ignore - Deno global\n const Deno: {\n emit(rootSpecifier: string | URL, options?: {\n bundle?: 'module' | 'classic';\n check?: boolean;\n compilerOptions?: any;\n importMap?: string;\n importMapPath?: string;\n sources?: Record<string, string>;\n }): Promise<{\n files: Record<string, string>;\n diagnostics: any[];\n }>;\n writeTextFile(path: string, data: string): Promise<void>;\n readFile(path: string): Promise<Uint8Array>;\n readFileSync(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array): Promise<void>;\n writeFileSync(path: string, data: Uint8Array): void;\n stat(path: string): Promise<any>;\n statSync(path: string): any;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n mkdirSync(path: string, options?: { recursive?: boolean }): void;\n readDir(path: string): AsyncIterable<any>;\n readDirSync(path: string): Iterable<any>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n removeSync(path: string, options?: { recursive?: boolean }): void;\n rename(oldPath: string, newPath: string): Promise<void>;\n renameSync(oldPath: string, newPath: string): void;\n copyFile(src: string, dest: string): Promise<void>;\n copyFileSync(src: string, dest: string): void;\n realPath(path: string): Promise<string>;\n realPathSync(path: string): string;\n watchFs(paths: string | string[]): AsyncIterable<{\n kind: string;\n paths: string[];\n }>;\n build: {\n os: string;\n };\n } | undefined;\n}\n","/**\n * File System module with unified API across runtimes\n * Compatible with Node.js 'fs' module API\n * - Node.js: uses 'fs' module\n * - Bun: uses Bun.file() and native APIs\n * - Deno: uses Deno.readFile(), etc.\n */\n\nimport { runtime, isNode, isBun, isDeno } from './runtime';\n\n/**\n * Helper: Parse options from string or object (eliminates duplication in options parsing)\n */\nfunction parseOptions<T>(options: T | string | undefined, defaultValue: T): T {\n return typeof options === 'string' ? { encoding: options } as T : options || defaultValue;\n}\n\n/**\n * Helper: Decode content with optional encoding (eliminates duplication in read operations)\n */\nfunction decodeContent(content: ArrayBuffer | Uint8Array, encoding?: string | null): string | Buffer {\n if (encoding) {\n return new TextDecoder(encoding).decode(content);\n }\n return Buffer.from(content instanceof ArrayBuffer ? new Uint8Array(content) : content);\n}\n\n/**\n * Helper: Convert data to Uint8Array (eliminates duplication in write operations)\n */\nfunction dataToUint8Array(data: string | Buffer | Uint8Array): Uint8Array {\n if (typeof data === 'string') {\n return new TextEncoder().encode(data);\n }\n if (data instanceof Buffer) {\n return new Uint8Array(data);\n }\n return data;\n}\n\n/**\n * Helper: Process directory entries (eliminates duplication in readdir operations)\n */\nfunction processDenoEntries(iterator: any, withFileTypes?: boolean): any[] {\n const entries: any[] = [];\n for (const entry of iterator) {\n if (withFileTypes) {\n entries.push(createDirentFromDenoEntry(entry));\n } else {\n entries.push(entry.name);\n }\n }\n return entries;\n}\n\n/**\n * Helper: Process directory entries async (eliminates duplication in async readdir)\n */\nasync function processDenoEntriesAsync(iterator: any, withFileTypes?: boolean): Promise<any[]> {\n const entries: any[] = [];\n for await (const entry of iterator) {\n if (withFileTypes) {\n entries.push(createDirentFromDenoEntry(entry));\n } else {\n entries.push(entry.name);\n }\n }\n return entries;\n}\n\n// Pre-load fs module for Node.js\nlet fs: any, fsPromises: any;\nif (isNode || isBun) {\n fs = require('fs');\n fsPromises = require('fs/promises');\n}\n\n/**\n * File encoding types\n */\nexport type BufferEncoding =\n | 'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'ucs2' | 'ucs-2'\n | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex';\n\n/**\n * Read file options\n */\nexport interface ReadFileOptions {\n encoding?: BufferEncoding | null;\n flag?: string;\n signal?: AbortSignal;\n}\n\n/**\n * Write file options\n */\nexport interface WriteFileOptions {\n encoding?: BufferEncoding | null;\n mode?: number;\n flag?: string;\n signal?: AbortSignal;\n}\n\n/**\n * Mkdir options\n */\nexport interface MkdirOptions {\n recursive?: boolean;\n mode?: number;\n}\n\n/**\n * Readdir options\n */\nexport interface ReaddirOptions {\n encoding?: BufferEncoding | null;\n withFileTypes?: boolean;\n recursive?: boolean;\n}\n\n/**\n * File stats\n */\nexport interface Stats {\n isFile(): boolean;\n isDirectory(): boolean;\n isBlockDevice(): boolean;\n isCharacterDevice(): boolean;\n isSymbolicLink(): boolean;\n isFIFO(): boolean;\n isSocket(): boolean;\n dev: number;\n ino: number;\n mode: number;\n nlink: number;\n uid: number;\n gid: number;\n rdev: number;\n size: number;\n blksize: number;\n blocks: number;\n atimeMs: number;\n mtimeMs: number;\n ctimeMs: number;\n birthtimeMs: number;\n atime: Date;\n mtime: Date;\n ctime: Date;\n birthtime: Date;\n}\n\n/**\n * Directory entry\n */\nexport interface Dirent {\n name: string;\n isFile(): boolean;\n isDirectory(): boolean;\n isBlockDevice(): boolean;\n isCharacterDevice(): boolean;\n isSymbolicLink(): boolean;\n isFIFO(): boolean;\n isSocket(): boolean;\n}\n\n/**\n * Read file (async)\n */\nexport async function readFile(path: string, options?: ReadFileOptions | BufferEncoding): Promise<string | Buffer> {\n const opts = parseOptions<ReadFileOptions>(options, {});\n\n if (isNode || isBun) {\n return fsPromises.readFile(path, opts);\n } else if (isDeno) {\n // @ts-ignore\n const content = await Deno.readFile(path);\n return decodeContent(content, opts.encoding);\n }\n\n throw new Error('Unsupported runtime');\n}\n\n/**\n * Read file (sync)\n */\nexport function readFileSync(path: string, options?: ReadFileOptions | BufferEncoding): string | Buffer {\n const opts = parseOptions<ReadFileOptions>(options, {});\n\n if (isNode || isBun) {\n return fs.readFileSync(path, opts);\n } else if (isDeno) {\n // @ts-ignore\n const content = Deno.readFileSync(path);\n return decodeContent(content, opts.encoding);\n }\n\n throw new Error('Unsupported runtime');\n}\n\n/**\n * Write file (async)\n */\nexport async function writeFile(path: string, data: string | Buffer | Uint8Array, options?: WriteFileOptions | BufferEncoding): Promise<void> {\n const opts = parseOptions<WriteFileOptions>(options, {});\n\n if (isNode || isBun) {\n return fsPromises.writeFile(path, data, opts);\n } else if (isDeno) {\n // @ts-ignore\n await Deno.writeFile(path, dataToUint8Array(data));\n }\n}\n\n/**\n * Write file (sync)\n */\nexport function writeFileSync(path: string, data: string | Buffer | Uint8Array, options?: WriteFileOptions | BufferEncoding): void {\n const opts = parseOptions<WriteFileOptions>(options, {});\n\n if (isNode || isBun) {\n fs.writeFileSync(path, data, opts);\n } else if (isDeno) {\n // @ts-ignore\n Deno.writeFileSync(path, dataToUint8Array(data));\n }\n}\n\n/**\n * Append file (async)\n */\nexport async function appendFile(path: string, data: string | Buffer, options?: WriteFileOptions | BufferEncoding): Promise<void> {\n const opts = parseOptions<WriteFileOptions>(options, {});\n\n if (isNode) {\n return fsPromises.appendFile(path, data, opts);\n } else {\n if (await exists(path)) {\n const existing = await readFile(path);\n const combined = Buffer.isBuffer(existing)\n ? Buffer.concat([existing, Buffer.isBuffer(data) ? data : Buffer.from(data)])\n : existing + (Buffer.isBuffer(data) ? data.toString() : data);\n await writeFile(path, combined, opts);\n } else {\n await writeFile(path, data, opts);\n }\n }\n}\n\n/**\n * Append file (sync)\n */\nexport function appendFileSync(path: string, data: string | Buffer, options?: WriteFileOptions | BufferEncoding): void {\n const opts = parseOptions<WriteFileOptions>(options, {});\n\n if (isNode) {\n fs.appendFileSync(path, data, opts);\n } else {\n if (existsSync(path)) {\n const existing = readFileSync(path);\n const combined = Buffer.isBuffer(existing)\n ? Buffer.concat([existing, Buffer.isBuffer(data) ? data : Buffer.from(data)])\n : existing + (Buffer.isBuffer(data) ? data.toString() : data);\n writeFileSync(path, combined, opts);\n } else {\n writeFileSync(path, data, opts);\n }\n }\n}\n\n/**\n * Check if file/directory exists (async)\n */\nexport async function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if file/directory exists (sync)\n */\nexport function existsSync(path: string): boolean {\n try {\n statSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get file stats (async)\n */\nexport async function stat(path: string): Promise<Stats> {\n if (isNode || isBun) {\n return fsPromises.stat(path);\n } else if (isDeno) {\n // @ts-ignore\n const info = await Deno.stat(path);\n return createStatsFromDenoFileInfo(info);\n }\n\n throw new Error('Unsupported runtime');\n}\n\n/**\n * Get file stats (sync)\n */\nexport function statSync(path: string): Stats {\n if (isNode || isBun) {\n return fs.statSync(path);\n } else if (isDeno) {\n // @ts-ignore\n const info = Deno.statSync(path);\n return createStatsFromDenoFileInfo(info);\n }\n\n throw new Error('Unsupported runtime');\n}\n\n/**\n * Create directory (async)\n */\nexport async function mkdir(path: string, options?: MkdirOptions | number): Promise<void> {\n const opts = typeof options === 'number' ? { mode: options } as MkdirOptions : options || {};\n\n if (isNode || isBun) {\n await fsPromises.mkdir(path, opts);\n } else if (isDeno) {\n // @ts-ignore\n await Deno.mkdir(path, { recursive: opts.recursive });\n }\n}\n\n/**\n * Create directory (sync)\n */\nexport function mkdirSync(path: string, options?: MkdirOptions | number): void {\n const opts = typeof options === 'number' ? { mode: options } as MkdirOptions : options || {};\n\n if (isNode || isBun) {\n fs.mkdirSync(path, opts);\n } else if (isDeno) {\n // @ts-ignore\n Deno.mkdirSync(path, { recursive: opts.recursive });\n }\n}\n\n/**\n * Read directory (async)\n */\nexport async function readdir(path: string, options?: ReaddirOptions | BufferEncoding): Promise<string[] | Dirent[]> {\n const opts = parseOptions<ReaddirOptions>(options, {});\n\n if (isNode || isBun) {\n return fsPromises.readdir(path, opts);\n } else if (isDeno) {\n // @ts-ignore\n return processDenoEntriesAsync(Deno.readDir(path), opts.withFileTypes);\n }\n\n throw new Error('Unsupported runtime');\n}\n\n/**\n * Read directory (sync)\n */\nexport function readdirSync(path: string, options?: ReaddirOptions | BufferEncoding): string[] | Dirent[] {\n const opts = parseOptions<ReaddirOptions>(options, {});\n\n if (isNode || isBun) {\n return fs.readdirSync(path, opts);\n } else if (isDeno) {\n // @ts-ignore\n return processDenoEntries(Deno.readDirSync(path), opts.withFileTypes);\n }\n\n throw new Error('Unsupported runtime');\n}\n\n/**\n * Remove file (async)\n */\nexport async function unlink(path: string): Promise<void> {\n if (isNode || isBun) {\n return fsPromises.unlink(path);\n } else if (isDeno) {\n // @ts-ignore\n await Deno.remove(path);\n }\n}\n\n/**\n * Remove file (sync)\n */\nexport function unlinkSync(path: string): void {\n if (isNode || isBun) {\n fs.unlinkSync(path);\n } else if (isDeno) {\n // @ts-ignore\n Deno.removeSync(path);\n }\n}\n\n/**\n * Remove directory (async)\n */\nexport async function rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n if (isNode || isBun) {\n return fsPromises.rmdir(path, options);\n } else if (isDeno) {\n // @ts-ignore\n await Deno.remove(path, { recursive: options?.recursive });\n }\n}\n\n/**\n * Remove directory (sync)\n */\nexport function rmdirSync(path: string, options?: { recursive?: boolean }): void {\n if (isNode || isBun) {\n fs.rmdirSync(path, options);\n } else if (isDeno) {\n // @ts-ignore\n Deno.removeSync(path, { recursive: options?.recursive });\n }\n}\n\n/**\n * Rename/move file (async)\n */\nexport async function rename(oldPath: string, newPath: string): Promise<void> {\n if (isNode || isBun) {\n return fsPromises.rename(oldPath, newPath);\n } else if (isDeno) {\n // @ts-ignore\n await Deno.rename(oldPath, newPath);\n }\n}\n\n/**\n * Rename/move file (sync)\n */\nexport function renameSync(oldPath: string, newPath: string): void {\n if (isNode || isBun) {\n fs.renameSync(oldPath, newPath);\n } else if (isDeno) {\n // @ts-ignore\n Deno.renameSync(oldPath, newPath);\n }\n}\n\n/**\n * Copy file (async)\n */\nexport async function copyFile(src: string, dest: string, flags?: number): Promise<void> {\n if (isNode || isBun) {\n return fsPromises.copyFile(src, dest, flags);\n } else if (isDeno) {\n // @ts-ignore\n await Deno.copyFile(src, dest);\n }\n}\n\n/**\n * Copy file (sync)\n */\nexport function copyFileSync(src: string, dest: string, flags?: number): void {\n if (isNode || isBun) {\n fs.copyFileSync(src, dest, flags);\n } else if (isDeno) {\n // @ts-ignore\n Deno.copyFileSync(src, dest);\n }\n}\n\n/**\n * Resolve pathname to absolute path (async)\n */\nexport async function realpath(path: string, options?: { encoding?: BufferEncoding }): Promise<string> {\n if (isNode || isBun) {\n return fsPromises.realpath(path, options);\n } else if (isDeno) {\n // @ts-ignore\n return await Deno.realPath(path);\n }\n return path;\n}\n\n/**\n * Resolve pathname to absolute path (sync)\n */\nexport function realpathSync(path: string, options?: { encoding?: BufferEncoding }): string {\n if (isNode || isBun) {\n return fs.realpathSync(path, options);\n } else if (isDeno) {\n // @ts-ignore\n return Deno.realPathSync(path);\n }\n return path;\n}\n\n/**\n * Helper: Create Stats from Deno FileInfo\n */\nfunction createStatsFromDenoFileInfo(info: any): Stats {\n return {\n isFile: () => info.isFile,\n isDirectory: () => info.isDirectory,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => info.isSymlink || false,\n isFIFO: () => false,\n isSocket: () => false,\n dev: info.dev || 0,\n ino: info.ino || 0,\n mode: info.mode || 0,\n nlink: info.nlink || 1,\n uid: info.uid || 0,\n gid: info.gid || 0,\n rdev: 0,\n size: info.size,\n blksize: info.blksize || 4096,\n blocks: info.blocks || Math.ceil(info.size / 512),\n atimeMs: info.atime?.getTime() || Date.now(),\n mtimeMs: info.mtime?.getTime() || Date.now(),\n ctimeMs: info.birthtime?.getTime() || Date.now(),\n birthtimeMs: info.birthtime?.getTime() || Date.now(),\n atime: info.atime || new Date(),\n mtime: info.mtime || new Date(),\n ctime: info.birthtime || new Date(),\n birthtime: info.birthtime || new Date(),\n };\n}\n\n/**\n * Helper: Create Dirent from Deno DirEntry\n */\nfunction createDirentFromDenoEntry(entry: any): Dirent {\n return {\n name: entry.name,\n isFile: () => entry.isFile,\n isDirectory: () => entry.isDirectory,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => entry.isSymlink || false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\n/**\n * Get current runtime\n */\nexport function getRuntime(): 'node' | 'bun' | 'deno' {\n return runtime;\n}\n\n/**\n * Promises API (re-export for compatibility)\n */\nexport const promises = {\n readFile,\n writeFile,\n appendFile,\n stat,\n mkdir,\n readdir,\n unlink,\n rmdir,\n rename,\n copyFile,\n realpath,\n};\n\n/**\n * Default export\n */\nexport default {\n readFile,\n readFileSync,\n writeFile,\n writeFileSync,\n appendFile,\n appendFileSync,\n exists,\n existsSync,\n stat,\n statSync,\n mkdir,\n mkdirSync,\n readdir,\n readdirSync,\n unlink,\n unlinkSync,\n rmdir,\n rmdirSync,\n rename,\n renameSync,\n copyFile,\n copyFileSync,\n realpath,\n realpathSync,\n promises,\n getRuntime,\n};\n","/**\n * Path module with unified API across runtimes\n * Pure implementation without external dependencies\n * Compatible with Node.js 'path' module API\n * Works on Node.js, Bun, and Deno\n */\n\nimport { isBun, isDeno, isNode, runtime } from './runtime';\n\n/**\n * Helper: Get path separator for platform (eliminates duplication in separator logic)\n */\nfunction getSeparator(isWin: boolean): string {\n return isWin ? '\\\\' : '/';\n}\n\n/**\n * Helper: Get current working directory (eliminates duplication in resolvePaths)\n */\nfunction getCwd(): string {\n if (isNode || isBun) {\n return process.cwd();\n } else if (isDeno) {\n // @ts-ignore\n return Deno.cwd();\n }\n return '/';\n}\n\n/**\n * Helper: Find last separator index (eliminates duplication in getExtname and getBasename)\n */\nfunction findLastSeparator(path: string): number {\n return Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\\\'));\n}\n\n/**\n * Helper: Create path operation object (eliminates duplication in posix and win32)\n */\nfunction createPathOps(isWin: boolean) {\n return {\n sep: getSeparator(isWin),\n delimiter: isWin ? ';' : ':',\n normalize: (path: string) => normalizePath(path, isWin),\n join: (...paths: string[]) => joinPaths(paths, isWin),\n resolve: (...paths: string[]) => resolvePaths(paths, isWin),\n isAbsolute: (path: string) => isWin ? isAbsoluteWin(path) : isAbsolutePosix(path),\n relative: (from: string, to: string) => relativePath(from, to, isWin),\n dirname: (path: string) => getDirname(path, isWin),\n basename: (path: string, ext?: string) => getBasename(path, ext, isWin),\n extname: (path: string) => getExtname(path),\n parse: (path: string) => parsePath(path, isWin),\n format: (pathObject: FormatInputPathObject) => formatPath(pathObject, isWin)\n };\n}\n\n/**\n * Helper: Check if path is absolute (POSIX)\n */\nfunction isAbsolutePosix(path: string): boolean {\n return path.length > 0 && path[0] === '/';\n}\n\n/**\n * Helper: Check if path is absolute (Windows)\n */\nfunction isAbsoluteWin(path: string): boolean {\n const len = path.length;\n if (len === 0) return false;\n\n const code = path.charCodeAt(0);\n if (code === 47 /* / */ || code === 92 /* \\ */) {\n return true;\n }\n\n // Check for drive letter\n if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122)) {\n if (len > 2 && path.charCodeAt(1) === 58 /* : */) {\n const code2 = path.charCodeAt(2);\n if (code2 === 47 /* / */ || code2 === 92 /* \\ */) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Platform detection\n */\nconst isWindows = (() => {\n if (isNode) {\n return process.platform === 'win32';\n } else if (isDeno) {\n // @ts-ignore\n return Deno.build.os === 'windows';\n }\n // Bun uses process.platform like Node\n return typeof process !== 'undefined' && process.platform === 'win32';\n})();\n\n/**\n * Path separator\n */\nexport const sep = isWindows ? '\\\\' : '/';\n\n/**\n * Path delimiter\n */\nexport const delimiter = isWindows ? ';' : ':';\n\n/**\n * POSIX path operations\n */\nconst posix = createPathOps(false);\n\n/**\n * Windows path operations\n */\nconst win32 = createPathOps(true);\n\n/**\n * Path object interface\n */\nexport interface ParsedPath {\n root: string;\n dir: string;\n base: string;\n ext: string;\n name: string;\n}\n\nexport interface FormatInputPathObject {\n root?: string;\n dir?: string;\n base?: string;\n ext?: string;\n name?: string;\n}\n\n/**\n * Normalize a path\n */\nfunction normalizePath(path: string, isWin: boolean): string {\n if (path.length === 0) return '.';\n\n const separator = getSeparator(isWin);\n const isAbsolute = isWin ? isAbsoluteWin(path) : isAbsolutePosix(path);\n const trailingSeparator = path[path.length - 1] === separator || (isWin && path[path.length - 1] === '/');\n\n // Normalize slashes\n let normalized = path.replace(isWin ? /[\\/\\\\]+/g : /\\/+/g, separator);\n\n // Split path\n const parts = normalized.split(separator);\n const result: string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part === '' || part === '.') {\n if (i === 0 && isAbsolute) result.push('');\n continue;\n }\n\n if (part === '..') {\n if (result.length > 0 && result[result.length - 1] !== '..') {\n if (!(result.length === 1 && result[0] === '')) {\n result.pop();\n }\n } else if (!isAbsolute) {\n result.push('..');\n }\n } else {\n result.push(part);\n }\n }\n\n let final = result.join(separator);\n\n if (final.length === 0) {\n return isAbsolute ? separator : '.';\n }\n\n if (trailingSeparator && final[final.length - 1] !== separator) {\n final += separator;\n }\n\n return final;\n}\n\n/**\n * Join paths\n */\nfunction joinPaths(paths: string[], isWin: boolean): string {\n if (paths.length === 0) return '.';\n\n const separator = getSeparator(isWin);\n let joined = '';\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n if (path && path.length > 0) {\n if (joined.length === 0) {\n joined = path;\n } else {\n joined += separator + path;\n }\n }\n }\n\n if (joined.length === 0) return '.';\n\n return normalizePath(joined, isWin);\n}\n\n/**\n * Resolve paths to absolute path\n */\nfunction resolvePaths(paths: string[], isWin: boolean): string {\n const separator = getSeparator(isWin);\n let resolved = '';\n let isAbsolute = false;\n\n for (let i = paths.length - 1; i >= 0 && !isAbsolute; i--) {\n const path = paths[i];\n if (path && path.length > 0) {\n resolved = path + (resolved.length > 0 ? separator + resolved : '');\n isAbsolute = isWin ? isAbsoluteWin(resolved) : isAbsolutePosix(resolved);\n }\n }\n\n if (!isAbsolute) {\n const cwd = getCwd();\n resolved = cwd + (resolved.length > 0 ? separator + resolved : '');\n }\n\n return normalizePath(resolved, isWin);\n}\n\n/**\n * Get relative path\n */\nfunction relativePath(from: string, to: string, isWin: boolean): string {\n from = resolvePaths([from], isWin);\n to = resolvePaths([to], isWin);\n\n if (from === to) return '';\n\n const separator = getSeparator(isWin);\n const fromParts = from.split(separator).filter(p => p.length > 0);\n const toParts = to.split(separator).filter(p => p.length > 0);\n\n let commonLength = 0;\n const minLength = Math.min(fromParts.length, toParts.length);\n\n for (let i = 0; i < minLength; i++) {\n if (fromParts[i] === toParts[i]) {\n commonLength++;\n } else {\n break;\n }\n }\n\n const upCount = fromParts.length - commonLength;\n const result: string[] = [];\n\n for (let i = 0; i < upCount; i++) {\n result.push('..');\n }\n\n for (let i = commonLength; i < toParts.length; i++) {\n result.push(toParts[i]);\n }\n\n return result.join(separator) || '.';\n}\n\n/**\n * Get directory name\n */\nfunction getDirname(path: string, isWin: boolean): string {\n if (path.length === 0) return '.';\n\n const separator = getSeparator(isWin);\n const normalized = normalizePath(path, isWin);\n const lastSepIndex = normalized.lastIndexOf(separator);\n\n if (lastSepIndex === -1) return '.';\n if (lastSepIndex === 0) return separator;\n\n return normalized.slice(0, lastSepIndex);\n}\n\n/**\n * Get base name\n */\nfunction getBasename(path: string, ext?: string, isWin?: boolean): string {\n if (path.length === 0) return '';\n\n const lastSepIndex = isWin ? findLastSeparator(path) : path.lastIndexOf('/');\n let base = lastSepIndex === -1 ? path : path.slice(lastSepIndex + 1);\n\n if (ext && base.endsWith(ext)) {\n base = base.slice(0, base.length - ext.length);\n }\n\n return base;\n}\n\n/**\n * Get extension name\n */\nfunction getExtname(path: string): string {\n const lastDotIndex = path.lastIndexOf('.');\n const lastSepIndex = findLastSeparator(path);\n\n if (lastDotIndex === -1 || lastDotIndex < lastSepIndex || lastDotIndex === path.length - 1) {\n return '';\n }\n\n return path.slice(lastDotIndex);\n}\n\n/**\n * Parse path into components\n */\nfunction parsePath(path: string, isWin: boolean): ParsedPath {\n let root = '';\n if (isWin) {\n // Check for Windows drive letter\n if (path.length >= 2 && path[1] === ':') {\n root = path.slice(0, 2);\n if (path.length > 2 && (path[2] === '\\\\' || path[2] === '/')) {\n root += '\\\\';\n }\n } else if (path[0] === '\\\\' || path[0] === '/') {\n root = '\\\\';\n }\n } else {\n if (path[0] === '/') {\n root = '/';\n }\n }\n\n const dir = getDirname(path, isWin);\n const base = getBasename(path, undefined, isWin);\n const ext = getExtname(path);\n const name = ext ? base.slice(0, base.length - ext.length) : base;\n\n return { root, dir, base, ext, name };\n}\n\n/**\n * Format path from components\n */\nfunction formatPath(pathObject: FormatInputPathObject, isWin: boolean): string {\n const separator = getSeparator(isWin);\n const dir = pathObject.dir || pathObject.root || '';\n const base = pathObject.base || ((pathObject.name || '') + (pathObject.ext || ''));\n\n if (!dir) return base;\n if (dir === pathObject.root) return dir + base;\n\n return dir + separator + base;\n}\n\n/**\n * Normalize a path (platform-specific)\n */\nexport function normalize(path: string): string {\n return normalizePath(path, isWindows);\n}\n\n/**\n * Join paths (platform-specific)\n */\nexport function join(...paths: string[]): string {\n return joinPaths(paths, isWindows);\n}\n\n/**\n * Resolve paths to absolute path (platform-specific)\n */\nexport function resolve(...paths: string[]): string {\n return resolvePaths(paths, isWindows);\n}\n\n/**\n * Check if path is absolute (platform-specific)\n */\nexport function isAbsolute(path: string): boolean {\n return isWindows ? win32.isAbsolute(path) : posix.isAbsolute(path);\n}\n\n/**\n * Get relative path (platform-specific)\n */\nexport function relative(from: string, to: string): string {\n return relativePath(from, to, isWindows);\n}\n\n/**\n * Get directory name (platform-specific)\n */\nexport function dirname(path: string): string {\n return getDirname(path, isWindows);\n}\n\n/**\n * Get base name (platform-specific)\n */\nexport function basename(path: string, ext?: string): string {\n return getBasename(path, ext, isWindows);\n}\n\n/**\n * Get extension name\n */\nexport function extname(path: string): string {\n return getExtname(path);\n}\n\n/**\n * Parse path into components (platform-specific)\n */\nexport function parse(path: string): ParsedPath {\n return parsePath(path, isWindows);\n}\n\n/**\n * Format path from components (platform-specific)\n */\nexport function format(pathObject: FormatInputPathObject): string {\n return formatPath(pathObject, isWindows);\n}\n\n/**\n * Convert to namespaced path (Windows only)\n */\nexport function toNamespacedPath(path: string): string {\n if (!isWindows || path.length === 0) return path;\n\n const resolved = resolve(path);\n\n if (resolved.length >= 3) {\n if (resolved[0] === '\\\\') {\n // UNC path\n if (resolved[1] === '\\\\' && resolved[2] !== '?') {\n return '\\\\\\\\?\\\\UNC\\\\' + resolved.slice(2);\n }\n } else if (resolved[1] === ':' && resolved[2] === '\\\\') {\n // Drive letter\n return '\\\\\\\\?\\\\' + resolved;\n }\n }\n\n return path;\n}\n\n/**\n * Get current runtime\n */\nexport function getRuntime(): 'node' | 'bun' | 'deno' {\n return runtime;\n}\n\n/**\n * Export POSIX and Win32 implementations\n */\nexport { posix, win32 };\n\n/**\n * Default export\n */\nexport default {\n sep,\n delimiter,\n normalize,\n join,\n resolve,\n isAbsolute,\n relative,\n dirname,\n basename,\n extname,\n parse,\n format,\n toNamespacedPath,\n posix,\n win32,\n getRuntime,\n};\n"],"mappings":"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","names":["normalizePath","fs"]}
|
package/dist/chokidar.mjs
CHANGED
|
@@ -15,9 +15,282 @@ var runtime = (() => {
|
|
|
15
15
|
if (typeof Bun !== "undefined") return "bun";
|
|
16
16
|
return "node";
|
|
17
17
|
})();
|
|
18
|
+
var isNode = runtime === "node";
|
|
19
|
+
var isBun = runtime === "bun";
|
|
20
|
+
var isDeno = runtime === "deno";
|
|
21
|
+
|
|
22
|
+
// src/fs.ts
|
|
23
|
+
var fs;
|
|
24
|
+
var fsPromises;
|
|
25
|
+
if (isNode || isBun) {
|
|
26
|
+
fs = __require("fs");
|
|
27
|
+
fsPromises = __require("fs/promises");
|
|
28
|
+
}
|
|
29
|
+
function existsSync(path) {
|
|
30
|
+
try {
|
|
31
|
+
statSync(path);
|
|
32
|
+
return true;
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function statSync(path) {
|
|
38
|
+
if (isNode || isBun) {
|
|
39
|
+
return fs.statSync(path);
|
|
40
|
+
} else if (isDeno) {
|
|
41
|
+
const info = Deno.statSync(path);
|
|
42
|
+
return createStatsFromDenoFileInfo(info);
|
|
43
|
+
}
|
|
44
|
+
throw new Error("Unsupported runtime");
|
|
45
|
+
}
|
|
46
|
+
function createStatsFromDenoFileInfo(info) {
|
|
47
|
+
return {
|
|
48
|
+
isFile: () => info.isFile,
|
|
49
|
+
isDirectory: () => info.isDirectory,
|
|
50
|
+
isBlockDevice: () => false,
|
|
51
|
+
isCharacterDevice: () => false,
|
|
52
|
+
isSymbolicLink: () => info.isSymlink || false,
|
|
53
|
+
isFIFO: () => false,
|
|
54
|
+
isSocket: () => false,
|
|
55
|
+
dev: info.dev || 0,
|
|
56
|
+
ino: info.ino || 0,
|
|
57
|
+
mode: info.mode || 0,
|
|
58
|
+
nlink: info.nlink || 1,
|
|
59
|
+
uid: info.uid || 0,
|
|
60
|
+
gid: info.gid || 0,
|
|
61
|
+
rdev: 0,
|
|
62
|
+
size: info.size,
|
|
63
|
+
blksize: info.blksize || 4096,
|
|
64
|
+
blocks: info.blocks || Math.ceil(info.size / 512),
|
|
65
|
+
atimeMs: info.atime?.getTime() || Date.now(),
|
|
66
|
+
mtimeMs: info.mtime?.getTime() || Date.now(),
|
|
67
|
+
ctimeMs: info.birthtime?.getTime() || Date.now(),
|
|
68
|
+
birthtimeMs: info.birthtime?.getTime() || Date.now(),
|
|
69
|
+
atime: info.atime || /* @__PURE__ */ new Date(),
|
|
70
|
+
mtime: info.mtime || /* @__PURE__ */ new Date(),
|
|
71
|
+
ctime: info.birthtime || /* @__PURE__ */ new Date(),
|
|
72
|
+
birthtime: info.birthtime || /* @__PURE__ */ new Date()
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/path.ts
|
|
77
|
+
function getSeparator(isWin) {
|
|
78
|
+
return isWin ? "\\" : "/";
|
|
79
|
+
}
|
|
80
|
+
function getCwd() {
|
|
81
|
+
if (isNode || isBun) {
|
|
82
|
+
return process.cwd();
|
|
83
|
+
} else if (isDeno) {
|
|
84
|
+
return Deno.cwd();
|
|
85
|
+
}
|
|
86
|
+
return "/";
|
|
87
|
+
}
|
|
88
|
+
function findLastSeparator(path) {
|
|
89
|
+
return Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
|
|
90
|
+
}
|
|
91
|
+
function createPathOps(isWin) {
|
|
92
|
+
return {
|
|
93
|
+
sep: getSeparator(isWin),
|
|
94
|
+
delimiter: isWin ? ";" : ":",
|
|
95
|
+
normalize: (path) => normalizePath(path, isWin),
|
|
96
|
+
join: (...paths) => joinPaths(paths, isWin),
|
|
97
|
+
resolve: (...paths) => resolvePaths(paths, isWin),
|
|
98
|
+
isAbsolute: (path) => isWin ? isAbsoluteWin(path) : isAbsolutePosix(path),
|
|
99
|
+
relative: (from, to) => relativePath(from, to, isWin),
|
|
100
|
+
dirname: (path) => getDirname(path, isWin),
|
|
101
|
+
basename: (path, ext) => getBasename(path, ext, isWin),
|
|
102
|
+
extname: (path) => getExtname(path),
|
|
103
|
+
parse: (path) => parsePath(path, isWin),
|
|
104
|
+
format: (pathObject) => formatPath(pathObject, isWin)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function isAbsolutePosix(path) {
|
|
108
|
+
return path.length > 0 && path[0] === "/";
|
|
109
|
+
}
|
|
110
|
+
function isAbsoluteWin(path) {
|
|
111
|
+
const len = path.length;
|
|
112
|
+
if (len === 0) return false;
|
|
113
|
+
const code = path.charCodeAt(0);
|
|
114
|
+
if (code === 47 || code === 92) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
if (code >= 65 && code <= 90 || code >= 97 && code <= 122) {
|
|
118
|
+
if (len > 2 && path.charCodeAt(1) === 58) {
|
|
119
|
+
const code2 = path.charCodeAt(2);
|
|
120
|
+
if (code2 === 47 || code2 === 92) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
var isWindows = (() => {
|
|
128
|
+
if (isNode) {
|
|
129
|
+
return process.platform === "win32";
|
|
130
|
+
} else if (isDeno) {
|
|
131
|
+
return Deno.build.os === "windows";
|
|
132
|
+
}
|
|
133
|
+
return typeof process !== "undefined" && process.platform === "win32";
|
|
134
|
+
})();
|
|
135
|
+
var posix = createPathOps(false);
|
|
136
|
+
var win32 = createPathOps(true);
|
|
137
|
+
function normalizePath(path, isWin) {
|
|
138
|
+
if (path.length === 0) return ".";
|
|
139
|
+
const separator = getSeparator(isWin);
|
|
140
|
+
const isAbsolute = isWin ? isAbsoluteWin(path) : isAbsolutePosix(path);
|
|
141
|
+
const trailingSeparator = path[path.length - 1] === separator || isWin && path[path.length - 1] === "/";
|
|
142
|
+
let normalized = path.replace(isWin ? /[\/\\]+/g : /\/+/g, separator);
|
|
143
|
+
const parts = normalized.split(separator);
|
|
144
|
+
const result = [];
|
|
145
|
+
for (let i = 0; i < parts.length; i++) {
|
|
146
|
+
const part = parts[i];
|
|
147
|
+
if (part === "" || part === ".") {
|
|
148
|
+
if (i === 0 && isAbsolute) result.push("");
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (part === "..") {
|
|
152
|
+
if (result.length > 0 && result[result.length - 1] !== "..") {
|
|
153
|
+
if (!(result.length === 1 && result[0] === "")) {
|
|
154
|
+
result.pop();
|
|
155
|
+
}
|
|
156
|
+
} else if (!isAbsolute) {
|
|
157
|
+
result.push("..");
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
result.push(part);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
let final = result.join(separator);
|
|
164
|
+
if (final.length === 0) {
|
|
165
|
+
return isAbsolute ? separator : ".";
|
|
166
|
+
}
|
|
167
|
+
if (trailingSeparator && final[final.length - 1] !== separator) {
|
|
168
|
+
final += separator;
|
|
169
|
+
}
|
|
170
|
+
return final;
|
|
171
|
+
}
|
|
172
|
+
function joinPaths(paths, isWin) {
|
|
173
|
+
if (paths.length === 0) return ".";
|
|
174
|
+
const separator = getSeparator(isWin);
|
|
175
|
+
let joined = "";
|
|
176
|
+
for (let i = 0; i < paths.length; i++) {
|
|
177
|
+
const path = paths[i];
|
|
178
|
+
if (path && path.length > 0) {
|
|
179
|
+
if (joined.length === 0) {
|
|
180
|
+
joined = path;
|
|
181
|
+
} else {
|
|
182
|
+
joined += separator + path;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (joined.length === 0) return ".";
|
|
187
|
+
return normalizePath(joined, isWin);
|
|
188
|
+
}
|
|
189
|
+
function resolvePaths(paths, isWin) {
|
|
190
|
+
const separator = getSeparator(isWin);
|
|
191
|
+
let resolved = "";
|
|
192
|
+
let isAbsolute = false;
|
|
193
|
+
for (let i = paths.length - 1; i >= 0 && !isAbsolute; i--) {
|
|
194
|
+
const path = paths[i];
|
|
195
|
+
if (path && path.length > 0) {
|
|
196
|
+
resolved = path + (resolved.length > 0 ? separator + resolved : "");
|
|
197
|
+
isAbsolute = isWin ? isAbsoluteWin(resolved) : isAbsolutePosix(resolved);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (!isAbsolute) {
|
|
201
|
+
const cwd = getCwd();
|
|
202
|
+
resolved = cwd + (resolved.length > 0 ? separator + resolved : "");
|
|
203
|
+
}
|
|
204
|
+
return normalizePath(resolved, isWin);
|
|
205
|
+
}
|
|
206
|
+
function relativePath(from, to, isWin) {
|
|
207
|
+
from = resolvePaths([from], isWin);
|
|
208
|
+
to = resolvePaths([to], isWin);
|
|
209
|
+
if (from === to) return "";
|
|
210
|
+
const separator = getSeparator(isWin);
|
|
211
|
+
const fromParts = from.split(separator).filter((p) => p.length > 0);
|
|
212
|
+
const toParts = to.split(separator).filter((p) => p.length > 0);
|
|
213
|
+
let commonLength = 0;
|
|
214
|
+
const minLength = Math.min(fromParts.length, toParts.length);
|
|
215
|
+
for (let i = 0; i < minLength; i++) {
|
|
216
|
+
if (fromParts[i] === toParts[i]) {
|
|
217
|
+
commonLength++;
|
|
218
|
+
} else {
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const upCount = fromParts.length - commonLength;
|
|
223
|
+
const result = [];
|
|
224
|
+
for (let i = 0; i < upCount; i++) {
|
|
225
|
+
result.push("..");
|
|
226
|
+
}
|
|
227
|
+
for (let i = commonLength; i < toParts.length; i++) {
|
|
228
|
+
result.push(toParts[i]);
|
|
229
|
+
}
|
|
230
|
+
return result.join(separator) || ".";
|
|
231
|
+
}
|
|
232
|
+
function getDirname(path, isWin) {
|
|
233
|
+
if (path.length === 0) return ".";
|
|
234
|
+
const separator = getSeparator(isWin);
|
|
235
|
+
const normalized = normalizePath(path, isWin);
|
|
236
|
+
const lastSepIndex = normalized.lastIndexOf(separator);
|
|
237
|
+
if (lastSepIndex === -1) return ".";
|
|
238
|
+
if (lastSepIndex === 0) return separator;
|
|
239
|
+
return normalized.slice(0, lastSepIndex);
|
|
240
|
+
}
|
|
241
|
+
function getBasename(path, ext, isWin) {
|
|
242
|
+
if (path.length === 0) return "";
|
|
243
|
+
const lastSepIndex = isWin ? findLastSeparator(path) : path.lastIndexOf("/");
|
|
244
|
+
let base = lastSepIndex === -1 ? path : path.slice(lastSepIndex + 1);
|
|
245
|
+
if (ext && base.endsWith(ext)) {
|
|
246
|
+
base = base.slice(0, base.length - ext.length);
|
|
247
|
+
}
|
|
248
|
+
return base;
|
|
249
|
+
}
|
|
250
|
+
function getExtname(path) {
|
|
251
|
+
const lastDotIndex = path.lastIndexOf(".");
|
|
252
|
+
const lastSepIndex = findLastSeparator(path);
|
|
253
|
+
if (lastDotIndex === -1 || lastDotIndex < lastSepIndex || lastDotIndex === path.length - 1) {
|
|
254
|
+
return "";
|
|
255
|
+
}
|
|
256
|
+
return path.slice(lastDotIndex);
|
|
257
|
+
}
|
|
258
|
+
function parsePath(path, isWin) {
|
|
259
|
+
let root = "";
|
|
260
|
+
if (isWin) {
|
|
261
|
+
if (path.length >= 2 && path[1] === ":") {
|
|
262
|
+
root = path.slice(0, 2);
|
|
263
|
+
if (path.length > 2 && (path[2] === "\\" || path[2] === "/")) {
|
|
264
|
+
root += "\\";
|
|
265
|
+
}
|
|
266
|
+
} else if (path[0] === "\\" || path[0] === "/") {
|
|
267
|
+
root = "\\";
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
if (path[0] === "/") {
|
|
271
|
+
root = "/";
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const dir = getDirname(path, isWin);
|
|
275
|
+
const base = getBasename(path, void 0, isWin);
|
|
276
|
+
const ext = getExtname(path);
|
|
277
|
+
const name = ext ? base.slice(0, base.length - ext.length) : base;
|
|
278
|
+
return { root, dir, base, ext, name };
|
|
279
|
+
}
|
|
280
|
+
function formatPath(pathObject, isWin) {
|
|
281
|
+
const separator = getSeparator(isWin);
|
|
282
|
+
const dir = pathObject.dir || pathObject.root || "";
|
|
283
|
+
const base = pathObject.base || (pathObject.name || "") + (pathObject.ext || "");
|
|
284
|
+
if (!dir) return base;
|
|
285
|
+
if (dir === pathObject.root) return dir + base;
|
|
286
|
+
return dir + separator + base;
|
|
287
|
+
}
|
|
288
|
+
function dirname(path) {
|
|
289
|
+
return getDirname(path, isWindows);
|
|
290
|
+
}
|
|
18
291
|
|
|
19
292
|
// src/chokidar.ts
|
|
20
|
-
function
|
|
293
|
+
function normalizePath2(path) {
|
|
21
294
|
return path.replace(/\\/g, "/");
|
|
22
295
|
}
|
|
23
296
|
function emitEvent(watcher, eventType, path) {
|
|
@@ -27,22 +300,22 @@ function emitEvent(watcher, eventType, path) {
|
|
|
27
300
|
function matchesAnyPattern(path, patterns) {
|
|
28
301
|
return patterns.some((pattern) => matchesPattern(path, pattern));
|
|
29
302
|
}
|
|
30
|
-
function handleRenameEvent(watcher, fullPath,
|
|
303
|
+
function handleRenameEvent(watcher, fullPath, fs2) {
|
|
31
304
|
try {
|
|
32
|
-
|
|
305
|
+
fs2.statSync(fullPath);
|
|
33
306
|
emitEvent(watcher, "add", fullPath);
|
|
34
307
|
} catch {
|
|
35
308
|
emitEvent(watcher, "unlink", fullPath);
|
|
36
309
|
}
|
|
37
310
|
}
|
|
38
|
-
function setupFsWatch(watcher, baseDir, patterns,
|
|
311
|
+
function setupFsWatch(watcher, baseDir, patterns, fs2) {
|
|
39
312
|
try {
|
|
40
|
-
const nativeWatcher =
|
|
313
|
+
const nativeWatcher = fs2.watch(baseDir, { recursive: true }, (eventType, filename) => {
|
|
41
314
|
if (!filename) return;
|
|
42
|
-
const fullPath =
|
|
315
|
+
const fullPath = normalizePath2(`${baseDir}/${filename}`);
|
|
43
316
|
if (!matchesAnyPattern(fullPath, patterns)) return;
|
|
44
317
|
if (eventType === "rename") {
|
|
45
|
-
handleRenameEvent(watcher, fullPath,
|
|
318
|
+
handleRenameEvent(watcher, fullPath, fs2);
|
|
46
319
|
} else if (eventType === "change") {
|
|
47
320
|
emitEvent(watcher, "change", fullPath);
|
|
48
321
|
}
|
|
@@ -137,20 +410,37 @@ var FSWatcher = class extends EventEmitter {
|
|
|
137
410
|
}
|
|
138
411
|
};
|
|
139
412
|
function getBaseDirectory(pattern) {
|
|
140
|
-
const
|
|
413
|
+
const normalizedPattern = normalizePath2(pattern);
|
|
414
|
+
const parts = normalizedPattern.split(/[\\\/]/);
|
|
141
415
|
let baseDir = "";
|
|
416
|
+
let sawGlob = false;
|
|
142
417
|
for (const part of parts) {
|
|
143
418
|
if (part.includes("*") || part.includes("?")) {
|
|
419
|
+
sawGlob = true;
|
|
144
420
|
break;
|
|
145
421
|
}
|
|
146
422
|
baseDir = baseDir ? `${baseDir}/${part}` : part;
|
|
147
423
|
}
|
|
148
|
-
|
|
424
|
+
if (sawGlob) {
|
|
425
|
+
return baseDir || ".";
|
|
426
|
+
}
|
|
427
|
+
if (normalizedPattern && existsSync(normalizedPattern)) {
|
|
428
|
+
try {
|
|
429
|
+
return statSync(normalizedPattern).isDirectory() ? normalizedPattern : normalizePath2(dirname(normalizedPattern)) || ".";
|
|
430
|
+
} catch {
|
|
431
|
+
return normalizePath2(dirname(normalizedPattern)) || ".";
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
const lastSegment = parts[parts.length - 1] || "";
|
|
435
|
+
if (lastSegment.includes(".") && !lastSegment.startsWith(".")) {
|
|
436
|
+
return normalizePath2(dirname(normalizedPattern)) || ".";
|
|
437
|
+
}
|
|
438
|
+
return normalizedPattern || ".";
|
|
149
439
|
}
|
|
150
440
|
function matchesPattern(filePath, pattern) {
|
|
151
|
-
const regexPattern =
|
|
441
|
+
const regexPattern = normalizePath2(pattern).replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, ".*").replace(/\*/g, "[^/]*").replace(/\?/g, ".");
|
|
152
442
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
153
|
-
const normalizedPath =
|
|
443
|
+
const normalizedPath = normalizePath2(filePath);
|
|
154
444
|
return regex.test(normalizedPath);
|
|
155
445
|
}
|
|
156
446
|
function watch(paths, options) {
|
|
@@ -165,11 +455,11 @@ function watch(paths, options) {
|
|
|
165
455
|
watchMap.get(baseDir).push(path);
|
|
166
456
|
});
|
|
167
457
|
if (runtime === "node") {
|
|
168
|
-
const
|
|
169
|
-
watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns,
|
|
458
|
+
const fs2 = __require("fs");
|
|
459
|
+
watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns, fs2));
|
|
170
460
|
} else if (runtime === "bun") {
|
|
171
|
-
const
|
|
172
|
-
watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns,
|
|
461
|
+
const fs2 = __require("fs");
|
|
462
|
+
watchMap.forEach((patterns, baseDir) => setupFsWatch(watcher, baseDir, patterns, fs2));
|
|
173
463
|
} else if (runtime === "deno") {
|
|
174
464
|
const baseDirs = Array.from(watchMap.keys());
|
|
175
465
|
const allPatterns = Array.from(watchMap.values()).flat();
|
|
@@ -179,7 +469,7 @@ function watch(paths, options) {
|
|
|
179
469
|
for await (const event of denoWatcher) {
|
|
180
470
|
if (watcher["_closed"]) break;
|
|
181
471
|
for (const path of event.paths) {
|
|
182
|
-
const normalizedPath =
|
|
472
|
+
const normalizedPath = normalizePath2(path);
|
|
183
473
|
if (!matchesAnyPattern(normalizedPath, allPatterns)) continue;
|
|
184
474
|
switch (event.kind) {
|
|
185
475
|
case "create":
|