elit 3.4.4 → 3.4.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 CHANGED
@@ -17,7 +17,7 @@ If you are generating or editing code for Elit, follow these rules first:
17
17
  - Prefer subpath imports in generated code. They make environment boundaries obvious.
18
18
  - `createRouterView(router, options)` returns a function. Render it inside `reactive(router.currentRoute, () => RouterView())`.
19
19
  - Browser-facing code may import local `.ts` files during development. Elit rewrites those imports for browser output.
20
- - Config files can be `elit.config.ts`, `elit.config.js`, `elit.config.mjs`, `elit.config.cjs`, or `elit.config.json`.
20
+ - Config files can be `elit.config.ts`, `elit.config.mts`, `elit.config.js`, `elit.config.mjs`, `elit.config.cjs`, or `elit.config.json`.
21
21
  - Environment files are loaded in this order: `.env.{mode}.local`, `.env.{mode}`, `.env.local`, `.env`.
22
22
  - Only `VITE_` variables are injected into client bundles.
23
23
 
@@ -142,6 +142,9 @@ npx elit preview
142
142
  npx elit test
143
143
  npx elit desktop ./src/main.ts
144
144
  npx elit desktop build ./src/main.ts --release
145
+ npx elit wapk pack .
146
+ npx elit wapk run ./app.wapk
147
+ npx elit desktop wapk run ./app.wapk
145
148
  ```
146
149
 
147
150
  Useful flags:
@@ -157,6 +160,12 @@ Useful flags:
157
160
  - `elit desktop --runtime quickjs|node|bun|deno`
158
161
  - `elit desktop build --platform windows|linux|macos --out-dir dist`
159
162
  - `elit desktop build --compiler auto|none|esbuild|tsx|tsup`
163
+ - `elit wapk ./app.wapk --runtime node|bun|deno`
164
+ - `elit wapk run ./app.wapk --sync-interval 100 --watcher`
165
+ - `elit wapk pack . --include-deps`
166
+ - `elit wapk inspect ./app.wapk`
167
+ - `elit wapk extract ./app.wapk`
168
+ - `elit desktop wapk ./app.wapk --runtime node|bun|deno --watcher`
160
169
 
161
170
  Desktop mode notes:
162
171
 
@@ -168,11 +177,21 @@ Desktop mode notes:
168
177
  - Desktop icon support includes `.ico`, `.png`, and `.svg`.
169
178
  - Desktop build auto-detects `icon.*` and `favicon.*` in the entry directory, project directory, and sibling `public/` folders.
170
179
 
180
+ WAPK mode notes:
181
+
182
+ - `elit wapk <file.wapk>` and `elit wapk run <file.wapk>` run packaged apps.
183
+ - `elit desktop wapk <file.wapk>` and `elit desktop wapk run <file.wapk>` run packaged apps in desktop mode.
184
+ - During run, the archive is expanded into a temporary work directory and changes are synced back to the same `.wapk` file.
185
+ - Use `--sync-interval <ms>` for polling mode, or `--watcher` / `--use-watcher` for event-driven sync.
186
+ - Configure package metadata in `elit.config.*` under `wapk`.
187
+ - See the full example app at `examples/wapk-example`.
188
+
171
189
  ## Config File
172
190
 
173
191
  Elit loads one of these files from the project root:
174
192
 
175
193
  - `elit.config.ts`
194
+ - `elit.config.mts`
176
195
  - `elit.config.js`
177
196
  - `elit.config.mjs`
178
197
  - `elit.config.cjs`
@@ -186,6 +205,29 @@ The config shape is:
186
205
  build?: BuildOptions | BuildOptions[];
187
206
  preview?: PreviewOptions;
188
207
  test?: TestOptions;
208
+ desktop?: {
209
+ runtime?: 'quickjs' | 'node' | 'bun' | 'deno';
210
+ compiler?: 'auto' | 'none' | 'esbuild' | 'tsx' | 'tsup';
211
+ release?: boolean;
212
+ outDir?: string;
213
+ platform?: 'windows' | 'linux' | 'macos';
214
+ wapk?: {
215
+ runtime?: 'node' | 'bun' | 'deno';
216
+ syncInterval?: number;
217
+ useWatcher?: boolean;
218
+ release?: boolean;
219
+ };
220
+ };
221
+ wapk?: {
222
+ name?: string;
223
+ version?: string;
224
+ runtime?: 'node' | 'bun' | 'deno';
225
+ entry?: string;
226
+ scripts?: Record<string, string>;
227
+ port?: number;
228
+ env?: Record<string, string | number | boolean>;
229
+ desktop?: Record<string, unknown>;
230
+ };
189
231
  }
190
232
  ```
191
233
 
@@ -230,6 +272,29 @@ export default {
230
272
  test: {
231
273
  include: ['testing/unit/**/*.test.ts'],
232
274
  },
275
+ desktop: {
276
+ runtime: 'quickjs',
277
+ compiler: 'auto',
278
+ release: false,
279
+ outDir: 'dist',
280
+ platform: 'windows',
281
+ wapk: {
282
+ runtime: 'bun',
283
+ syncInterval: 150,
284
+ useWatcher: true,
285
+ release: true,
286
+ },
287
+ },
288
+ wapk: {
289
+ name: 'my-app',
290
+ version: '1.0.0',
291
+ runtime: 'bun',
292
+ entry: './src/server.ts',
293
+ port: 3000,
294
+ env: {
295
+ NODE_ENV: 'production',
296
+ },
297
+ },
233
298
  };
234
299
  ```
235
300
 
@@ -239,6 +304,9 @@ Important details:
239
304
  - `dev.clients` is the most flexible setup when you want SSR, API routes, multiple apps, or per-client proxy rules.
240
305
  - `preview` supports the same concepts as `dev`: multiple clients, API routes, proxy rules, workers, SSR, and HTTPS.
241
306
  - Only `VITE_` variables are exposed to client code during bundling.
307
+ - `desktop` config provides defaults for `elit desktop`, `elit desktop build`, and `elit desktop wapk`.
308
+ - `wapk` config is loaded from `elit.config.*`, then package metadata is used as fallback.
309
+ - `wapk run` and `desktop wapk run` sync runtime file changes back into the same `.wapk` archive.
242
310
 
243
311
  ## Browser Patterns
244
312
 
package/dist/build.js CHANGED
@@ -65,18 +65,14 @@ function dataToUint8Array(data) {
65
65
  }
66
66
  var fs;
67
67
  var fsPromises;
68
- if (isNode) {
68
+ if (isNode || isBun) {
69
69
  fs = require("fs");
70
70
  fsPromises = require("fs/promises");
71
71
  }
72
72
  function readFileSync(path, options) {
73
73
  const opts = parseOptions(options, {});
74
- if (isNode) {
74
+ if (isNode || isBun) {
75
75
  return fs.readFileSync(path, opts);
76
- } else if (isBun) {
77
- const file = Bun.file(path);
78
- const content = file.arrayBuffer();
79
- return decodeContent(content, opts.encoding);
80
76
  } else if (isDeno) {
81
77
  const content = Deno.readFileSync(path);
82
78
  return decodeContent(content, opts.encoding);
@@ -102,17 +98,8 @@ function existsSync(path) {
102
98
  }
103
99
  }
104
100
  function statSync(path) {
105
- if (isNode) {
101
+ if (isNode || isBun) {
106
102
  return fs.statSync(path);
107
- } else if (isBun) {
108
- const file = Bun.file(path);
109
- const size = file.size;
110
- try {
111
- file.arrayBuffer();
112
- } catch {
113
- throw new Error(`ENOENT: no such file or directory, stat '${path}'`);
114
- }
115
- return createStatsObject(path, size, false);
116
103
  } else if (isDeno) {
117
104
  const info = Deno.statSync(path);
118
105
  return createStatsFromDenoFileInfo(info);
@@ -138,36 +125,6 @@ function copyFileSync(src, dest, flags) {
138
125
  Deno.copyFileSync(src, dest);
139
126
  }
140
127
  }
141
- function createStatsObject(_path, size, isDir) {
142
- const now = Date.now();
143
- return {
144
- isFile: () => !isDir,
145
- isDirectory: () => isDir,
146
- isBlockDevice: () => false,
147
- isCharacterDevice: () => false,
148
- isSymbolicLink: () => false,
149
- isFIFO: () => false,
150
- isSocket: () => false,
151
- dev: 0,
152
- ino: 0,
153
- mode: isDir ? 16877 : 33188,
154
- nlink: 1,
155
- uid: 0,
156
- gid: 0,
157
- rdev: 0,
158
- size,
159
- blksize: 4096,
160
- blocks: Math.ceil(size / 512),
161
- atimeMs: now,
162
- mtimeMs: now,
163
- ctimeMs: now,
164
- birthtimeMs: now,
165
- atime: new Date(now),
166
- mtime: new Date(now),
167
- ctime: new Date(now),
168
- birthtime: new Date(now)
169
- };
170
- }
171
128
  function createStatsFromDenoFileInfo(info) {
172
129
  return {
173
130
  isFile: () => info.isFile,
package/dist/build.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/build.ts","../src/runtime.ts","../src/fs.ts","../src/path.ts"],"sourcesContent":["/**\n * Build module for bundling applications\n * Pure implementation with cross-runtime support\n * Compatible with standard build tools API\n * - Node.js: uses esbuild\n * - Bun: uses Bun.build\n * - Deno: uses Deno.emit\n */\n\nimport { statSync, mkdirSync, readFileSync, writeFileSync, copyFileSync, existsSync } from './fs';\nimport { resolve, join, basename, extname, dirname } from './path';\nimport { runtime } from './runtime';\nimport type { BuildOptions, BuildResult } from './types';\n\n/**\n * Helper: Ensure directory exists (eliminates duplication in directory creation)\n */\nfunction ensureDir(dirPath: string): void {\n try {\n mkdirSync(dirPath, { recursive: true });\n } catch (error) {\n // Directory might already exist\n }\n}\n\n/**\n * Helper: Calculate build time and size (eliminates duplication in build result)\n */\nfunction calculateBuildMetrics(startTime: number, outputPath: string): { buildTime: number; size: number } {\n const buildTime = Date.now() - startTime;\n const stats = statSync(outputPath);\n return { buildTime, size: stats.size };\n}\n\n/**\n * Helper: Read file and ensure string output (eliminates duplication in file reading)\n */\nfunction readFileAsString(filePath: string): string {\n const contentBuffer = readFileSync(filePath, 'utf-8');\n return typeof contentBuffer === 'string' ? contentBuffer : contentBuffer.toString('utf-8');\n}\n\n/**\n * Helper: Get esbuild minify options (eliminates duplication in esbuild config)\n */\nfunction getMinifyOptions(minify?: boolean): object {\n return minify ? {\n minifyWhitespace: true,\n minifyIdentifiers: true,\n minifySyntax: true,\n legalComments: 'none',\n mangleProps: /^_/,\n keepNames: false\n } : {};\n}\n\n/**\n * Helper: Log build info (eliminates duplication in logging)\n */\nfunction logBuildInfo(config: BuildOptions, outputPath: string): void {\n console.log('\\n🔨 Building...');\n console.log(` Entry: ${config.entry}`);\n console.log(` Output: ${outputPath}`);\n console.log(` Format: ${config.format}`);\n console.log(` Target: ${config.target}`);\n}\n\n/**\n * Helper: Log build success (eliminates duplication in success logging)\n */\nfunction logBuildSuccess(buildTime: number, size: number): void {\n console.log(`\\n✅ Build successful!`);\n console.log(` Time: ${buildTime}ms`);\n console.log(` Size: ${formatBytes(size)}`);\n}\n\nconst defaultOptions: Omit<BuildOptions, 'entry'> = {\n outDir: 'dist',\n minify: true,\n sourcemap: false,\n target: 'es2020',\n format: 'esm',\n treeshake: true,\n logging: true,\n external: []\n};\n\nexport async function build(options: BuildOptions): Promise<BuildResult> {\n const config = { ...defaultOptions, ...options };\n const startTime = Date.now();\n\n if (!config.entry) {\n throw new Error('Entry file is required');\n }\n\n const entryPath = resolve(config.entry);\n const outDir = resolve(config.outDir!);\n\n // Determine output filename\n let outFile = config.outFile;\n if (!outFile) {\n const baseName = basename(config.entry, extname(config.entry));\n const ext = config.format === 'cjs' ? '.cjs' : '.js';\n outFile = baseName + ext;\n }\n\n const outputPath = join(outDir, outFile);\n\n // Ensure output directory exists\n ensureDir(outDir);\n\n if (config.logging) {\n logBuildInfo(config, outputPath);\n }\n\n // Browser-only plugin for automatic client/server separation\n const browserOnlyPlugin = {\n name: 'browser-only',\n setup(build: any) {\n // External all Node.js built-in modules\n build.onResolve({ filter: /^(node:.*|fs|path|http|https|url|os|child_process|net|tls|crypto|stream|util|events|buffer|zlib|readline|process|assert|constants|dns|domain|punycode|querystring|repl|string_decoder|sys|timers|tty|v8|vm)$/ }, () => {\n return { path: 'node-builtin', external: true, sideEffects: false };\n });\n\n // External common server-side dependencies\n build.onResolve({ filter: /^(chokidar|esbuild|mime-types|open|ws|fs\\/promises)$/ }, () => {\n return { path: 'server-dep', external: true, sideEffects: false };\n });\n\n // Intercept imports from elit server-side modules\n build.onLoad({ filter: /server|config|cli/ }, () => ({\n contents: 'export default {};',\n }));\n },\n };\n\n try {\n const platform = config.platform || (config.format === 'cjs' ? 'node' : 'browser');\n const plugins = platform === 'browser' ? [browserOnlyPlugin] : [];\n\n // Prepare environment variables for injection\n const define: Record<string, string> = {};\n if (config.env) {\n Object.entries(config.env).forEach(([key, value]) => {\n // Only inject variables prefixed with VITE_ to client code\n if (key.startsWith('VITE_')) {\n define[`import.meta.env.${key}`] = JSON.stringify(value);\n }\n });\n // Add MODE\n if (config.env.MODE) {\n define['import.meta.env.MODE'] = JSON.stringify(config.env.MODE);\n }\n // Add DEV/PROD flags\n define['import.meta.env.DEV'] = JSON.stringify(config.env.MODE !== 'production');\n define['import.meta.env.PROD'] = JSON.stringify(config.env.MODE === 'production');\n }\n\n let result: any;\n let buildTime: number;\n let size: number;\n\n if (runtime === 'node') {\n // Node.js - use esbuild\n const { build: esbuild } = await import('esbuild');\n\n const baseOptions = {\n entryPoints: [entryPath],\n bundle: true,\n outfile: outputPath,\n format: config.format,\n target: config.target,\n minify: config.minify,\n sourcemap: config.sourcemap,\n external: config.external,\n treeShaking: config.treeshake,\n globalName: config.globalName,\n platform,\n plugins,\n define,\n logLevel: config.logging ? 'info' : 'silent',\n metafile: true,\n // Prioritize browser field for browser builds\n mainFields: platform === 'browser' ? ['browser', 'module', 'main'] : ['module', 'main'],\n };\n\n const esbuildOptions: any = {\n ...baseOptions,\n ...getMinifyOptions(config.minify)\n };\n\n if (config.resolve?.alias) {\n esbuildOptions.resolve = { alias: config.resolve.alias };\n }\n\n result = await esbuild(esbuildOptions);\n\n ({ buildTime, size } = calculateBuildMetrics(startTime, outputPath));\n } else if (runtime === 'bun') {\n // Bun - use Bun.build\n // @ts-ignore\n result = await Bun.build({\n entrypoints: [entryPath],\n outdir: outDir,\n target: 'bun',\n format: config.format === 'cjs' ? 'cjs' : 'esm',\n minify: config.minify,\n sourcemap: config.sourcemap ? 'external' : 'none',\n external: config.external,\n naming: outFile,\n define\n });\n\n if (!result.success) {\n throw new Error('Bun build failed: ' + JSON.stringify(result.logs));\n }\n\n ({ buildTime, size } = calculateBuildMetrics(startTime, outputPath));\n } else {\n // Deno - use Deno.emit\n // @ts-ignore\n result = await Deno.emit(entryPath, {\n bundle: 'module',\n check: false,\n compilerOptions: {\n target: config.target,\n module: config.format === 'cjs' ? 'commonjs' : 'esnext',\n sourceMap: config.sourcemap\n }\n });\n\n // Write the bundled output\n const bundledCode = result.files['deno:///bundle.js'];\n if (bundledCode) {\n // @ts-ignore\n await Deno.writeTextFile(outputPath, bundledCode);\n }\n\n ({ buildTime, size } = calculateBuildMetrics(startTime, outputPath));\n }\n\n if (config.logging) {\n logBuildSuccess(buildTime, size);\n\n // Show metafile info (Node.js esbuild only)\n if (runtime === 'node' && result.metafile) {\n const inputs = Object.keys(result.metafile.inputs).length;\n console.log(` Files: ${inputs} input(s)`);\n\n // Show largest modules\n const outputKeys = Object.keys(result.metafile.outputs);\n if (outputKeys.length > 0) {\n const mainOutput = result.metafile.outputs[outputKeys[0]];\n if (mainOutput && mainOutput.inputs) {\n const sortedInputs = Object.entries(mainOutput.inputs)\n .sort(([, a], [, b]) => {\n const aBytes = (a as any).bytesInOutput || 0;\n const bBytes = (b as any).bytesInOutput || 0;\n return bBytes - aBytes;\n })\n .slice(0, 5);\n\n if (sortedInputs.length > 0) {\n console.log('\\n 📊 Top 5 largest modules:');\n sortedInputs.forEach(([file, info]) => {\n const fileName = file.split(/[/\\\\]/).pop() || file;\n const infoBytes = (info as any).bytesInOutput || 0;\n console.log(` ${fileName.padEnd(30)} ${formatBytes(infoBytes)}`);\n });\n }\n }\n }\n }\n }\n\n const buildResult: BuildResult = {\n outputPath,\n buildTime,\n size\n };\n\n // Handle copy files\n if (config.copy && config.copy.length > 0) {\n if (config.logging) {\n console.log('\\n📦 Copying files...');\n }\n\n for (const copyItem of config.copy) {\n const fromPath = resolve(copyItem.from);\n const toPath = resolve(outDir, copyItem.to);\n\n // Ensure target directory exists\n const targetDir = dirname(toPath);\n if (!existsSync(targetDir)) {\n ensureDir(targetDir);\n }\n\n if (existsSync(fromPath)) {\n if (copyItem.transform) {\n // Read, transform, and write\n const content = readFileAsString(fromPath);\n const transformed = copyItem.transform(content, config);\n writeFileSync(toPath, transformed);\n } else {\n // Direct copy\n copyFileSync(fromPath, toPath);\n }\n\n if (config.logging) {\n console.log(` ✓ ${copyItem.from} → ${copyItem.to}`);\n }\n } else if (config.logging) {\n console.warn(` ⚠ File not found: ${copyItem.from}`);\n }\n }\n }\n\n // Call post-build hook\n if (config.onBuildEnd) {\n await config.onBuildEnd(buildResult);\n }\n\n if (config.logging) {\n console.log('');\n }\n\n return buildResult;\n } catch (error) {\n if (config.logging) {\n console.error('\\n❌ Build failed:');\n console.error(error);\n }\n throw error;\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport type { BuildOptions, BuildResult } from './types';\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: Check if runtime is Bun or Deno (eliminates duplication in Deno API calls)\n */\nconst isBunOrDeno = isBun || isDeno;\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) {\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) {\n return fsPromises.readFile(path, opts);\n } else if (isBun) {\n // @ts-ignore\n const file = Bun.file(path);\n const content = await file.arrayBuffer();\n return decodeContent(content, opts.encoding);\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) {\n return fs.readFileSync(path, opts);\n } else if (isBun) {\n // @ts-ignore\n const file = Bun.file(path);\n const content = file.arrayBuffer();\n return decodeContent(content as ArrayBuffer, opts.encoding);\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) {\n return fsPromises.writeFile(path, data, opts);\n } else if (isBun) {\n // @ts-ignore\n await Bun.write(path, data);\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) {\n fs.writeFileSync(path, data, opts);\n } else if (isBun) {\n // @ts-ignore\n Bun.write(path, data);\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) {\n return fsPromises.stat(path);\n } else if (isBun) {\n // @ts-ignore\n const file = Bun.file(path);\n const size = file.size;\n const exists = await file.exists();\n\n if (!exists) {\n throw new Error(`ENOENT: no such file or directory, stat '${path}'`);\n }\n\n // Create a Stats-like object\n return createStatsObject(path, size, false);\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) {\n return fs.statSync(path);\n } else if (isBun) {\n // @ts-ignore\n const file = Bun.file(path);\n const size = file.size;\n\n // Bun doesn't have sync exists check, so we try to read\n try {\n file.arrayBuffer();\n } catch {\n throw new Error(`ENOENT: no such file or directory, stat '${path}'`);\n }\n\n return createStatsObject(path, size, false);\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) {\n await fsPromises.mkdir(path, opts);\n } else if (isBun) {\n // @ts-ignore\n await Deno.mkdir(path, { recursive: opts.recursive });\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) {\n fs.mkdirSync(path, opts);\n } else if (isBun) {\n // @ts-ignore\n Deno.mkdirSync(path, { recursive: opts.recursive });\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) {\n return fsPromises.readdir(path, opts);\n } else if (isBunOrDeno) {\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) {\n return fs.readdirSync(path, opts);\n } else if (isBunOrDeno) {\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) {\n return fsPromises.unlink(path);\n } else if (isBun) {\n // @ts-ignore\n await Deno.remove(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) {\n fs.unlinkSync(path);\n } else if (isBun) {\n // @ts-ignore\n Deno.removeSync(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) {\n return fsPromises.rmdir(path, options);\n } else if (isBun) {\n // @ts-ignore\n await Deno.remove(path, { recursive: options?.recursive });\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) {\n fs.rmdirSync(path, options);\n } else if (isBun) {\n // @ts-ignore\n Deno.removeSync(path, { recursive: options?.recursive });\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) {\n return fsPromises.rename(oldPath, newPath);\n } else if (isBun) {\n // @ts-ignore\n await Deno.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) {\n fs.renameSync(oldPath, newPath);\n } else if (isBun) {\n // @ts-ignore\n Deno.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) {\n return fsPromises.copyFile(src, dest, flags);\n } else if (isBun) {\n // @ts-ignore\n await Deno.copyFile(src, dest);\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) {\n fs.copyFileSync(src, dest, flags);\n } else if (isBun) {\n // @ts-ignore\n Deno.copyFileSync(src, dest);\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) {\n return fsPromises.realpath(path, options);\n } else if (isBun) {\n // Bun supports fs.promises.realpath\n const fs = require('fs/promises');\n return fs.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) {\n return fs.realpathSync(path, options);\n } else if (isBun) {\n // Bun supports fs.realpathSync\n const fs = require('fs');\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 object\n */\nfunction createStatsObject(_path: string, size: number, isDir: boolean): Stats {\n const now = Date.now();\n return {\n isFile: () => !isDir,\n isDirectory: () => isDir,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n dev: 0,\n ino: 0,\n mode: isDir ? 16877 : 33188,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size,\n blksize: 4096,\n blocks: Math.ceil(size / 512),\n atimeMs: now,\n mtimeMs: now,\n ctimeMs: now,\n birthtimeMs: now,\n atime: new Date(now),\n mtime: new Date(now),\n ctime: new Date(now),\n birthtime: new Date(now),\n };\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,IAAM,WAAW,MAAM;AAE5B,MAAI,OAAO,SAAS,YAAa,QAAO;AAExC,MAAI,OAAO,QAAQ,YAAa,QAAO;AACvC,SAAO;AACT,GAAG;AAEI,IAAM,SAAS,YAAY;AAC3B,IAAM,QAAQ,YAAY;AAC1B,IAAM,SAAS,YAAY;;;ACAlC,SAAS,aAAgB,SAAiC,cAAoB;AAC5E,SAAO,OAAO,YAAY,WAAW,EAAE,UAAU,QAAQ,IAAS,WAAW;AAC/E;AAKA,SAAS,cAAc,SAAmC,UAA2C;AACnG,MAAI,UAAU;AACZ,WAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,OAAO;AAAA,EACjD;AACA,SAAO,OAAO,KAAK,mBAAmB,cAAc,IAAI,WAAW,OAAO,IAAI,OAAO;AACvF;AAKA,SAAS,iBAAiB,MAAgD;AACxE,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EACtC;AACA,MAAI,gBAAgB,QAAQ;AAC1B,WAAO,IAAI,WAAW,IAAI;AAAA,EAC5B;AACA,SAAO;AACT;AAiCA,IAAI;AAAJ,IAAa;AACb,IAAI,QAAQ;AACV,OAAK,QAAQ,IAAI;AACjB,eAAa,QAAQ,aAAa;AACpC;AAmHO,SAAS,aAAa,MAAc,SAA6D;AACtG,QAAM,OAAO,aAA8B,SAAS,CAAC,CAAC;AAEtD,MAAI,QAAQ;AACV,WAAO,GAAG,aAAa,MAAM,IAAI;AAAA,EACnC,WAAW,OAAO;AAEhB,UAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,UAAM,UAAU,KAAK,YAAY;AACjC,WAAO,cAAc,SAAwB,KAAK,QAAQ;AAAA,EAC5D,WAAW,QAAQ;AAEjB,UAAM,UAAU,KAAK,aAAa,IAAI;AACtC,WAAO,cAAc,SAAS,KAAK,QAAQ;AAAA,EAC7C;AAEA,QAAM,IAAI,MAAM,qBAAqB;AACvC;AAsBO,SAAS,cAAc,MAAc,MAAoC,SAAmD;AACjI,QAAM,OAAO,aAA+B,SAAS,CAAC,CAAC;AAEvD,MAAI,QAAQ;AACV,OAAG,cAAc,MAAM,MAAM,IAAI;AAAA,EACnC,WAAW,OAAO;AAEhB,QAAI,MAAM,MAAM,IAAI;AAAA,EACtB,WAAW,QAAQ;AAEjB,SAAK,cAAc,MAAM,iBAAiB,IAAI,CAAC;AAAA,EACjD;AACF;AA2DO,SAAS,WAAW,MAAuB;AAChD,MAAI;AACF,aAAS,IAAI;AACb,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAgCO,SAAS,SAAS,MAAqB;AAC5C,MAAI,QAAQ;AACV,WAAO,GAAG,SAAS,IAAI;AAAA,EACzB,WAAW,OAAO;AAEhB,UAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,UAAM,OAAO,KAAK;AAGlB,QAAI;AACF,WAAK,YAAY;AAAA,IACnB,QAAQ;AACN,YAAM,IAAI,MAAM,4CAA4C,IAAI,GAAG;AAAA,IACrE;AAEA,WAAO,kBAAkB,MAAM,MAAM,KAAK;AAAA,EAC5C,WAAW,QAAQ;AAEjB,UAAM,OAAO,KAAK,SAAS,IAAI;AAC/B,WAAO,4BAA4B,IAAI;AAAA,EACzC;AAEA,QAAM,IAAI,MAAM,qBAAqB;AACvC;AAsBO,SAAS,UAAU,MAAc,SAAuC;AAC7E,QAAM,OAAO,OAAO,YAAY,WAAW,EAAE,MAAM,QAAQ,IAAoB,WAAW,CAAC;AAE3F,MAAI,QAAQ;AACV,OAAG,UAAU,MAAM,IAAI;AAAA,EACzB,WAAW,OAAO;AAEhB,SAAK,UAAU,MAAM,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,EACpD,WAAW,QAAQ;AAEjB,SAAK,UAAU,MAAM,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,EACpD;AACF;AA8IO,SAAS,aAAa,KAAa,MAAc,OAAsB;AAC5E,MAAI,QAAQ;AACV,OAAG,aAAa,KAAK,MAAM,KAAK;AAAA,EAClC,WAAW,OAAO;AAEhB,SAAK,aAAa,KAAK,IAAI;AAAA,EAC7B,WAAW,QAAQ;AAEjB,SAAK,aAAa,KAAK,IAAI;AAAA,EAC7B;AACF;AAuCA,SAAS,kBAAkB,OAAe,MAAc,OAAuB;AAC7E,QAAM,MAAM,KAAK,IAAI;AACrB,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,gBAAgB,MAAM;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,OAAO;AAAA,IACP,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,IACT,QAAQ,KAAK,KAAK,OAAO,GAAG;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO,IAAI,KAAK,GAAG;AAAA,IACnB,OAAO,IAAI,KAAK,GAAG;AAAA,IACnB,OAAO,IAAI,KAAK,GAAG;AAAA,IACnB,WAAW,IAAI,KAAK,GAAG;AAAA,EACzB;AACF;AAKA,SAAS,4BAA4B,MAAkB;AACrD,SAAO;AAAA,IACL,QAAQ,MAAM,KAAK;AAAA,IACnB,aAAa,MAAM,KAAK;AAAA,IACxB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,gBAAgB,MAAM,KAAK,aAAa;AAAA,IACxC,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,KAAK,KAAK,OAAO;AAAA,IACjB,KAAK,KAAK,OAAO;AAAA,IACjB,MAAM,KAAK,QAAQ;AAAA,IACnB,OAAO,KAAK,SAAS;AAAA,IACrB,KAAK,KAAK,OAAO;AAAA,IACjB,KAAK,KAAK,OAAO;AAAA,IACjB,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,SAAS,KAAK,WAAW;AAAA,IACzB,QAAQ,KAAK,UAAU,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,IAChD,SAAS,KAAK,OAAO,QAAQ,KAAK,KAAK,IAAI;AAAA,IAC3C,SAAS,KAAK,OAAO,QAAQ,KAAK,KAAK,IAAI;AAAA,IAC3C,SAAS,KAAK,WAAW,QAAQ,KAAK,KAAK,IAAI;AAAA,IAC/C,aAAa,KAAK,WAAW,QAAQ,KAAK,KAAK,IAAI;AAAA,IACnD,OAAO,KAAK,SAAS,oBAAI,KAAK;AAAA,IAC9B,OAAO,KAAK,SAAS,oBAAI,KAAK;AAAA,IAC9B,OAAO,KAAK,aAAa,oBAAI,KAAK;AAAA,IAClC,WAAW,KAAK,aAAa,oBAAI,KAAK;AAAA,EACxC;AACF;;;ACloBA,SAAS,aAAa,OAAwB;AAC5C,SAAO,QAAQ,OAAO;AACxB;AAKA,SAAS,SAAiB;AACxB,MAAI,UAAU,OAAO;AACnB,WAAO,QAAQ,IAAI;AAAA,EACrB,WAAW,QAAQ;AAEjB,WAAO,KAAK,IAAI;AAAA,EAClB;AACA,SAAO;AACT;AAKA,SAAS,kBAAkB,MAAsB;AAC/C,SAAO,KAAK,IAAI,KAAK,YAAY,GAAG,GAAG,KAAK,YAAY,IAAI,CAAC;AAC/D;AAKA,SAAS,cAAc,OAAgB;AACrC,SAAO;AAAA,IACL,KAAK,aAAa,KAAK;AAAA,IACvB,WAAW,QAAQ,MAAM;AAAA,IACzB,WAAW,CAAC,SAAiB,cAAc,MAAM,KAAK;AAAA,IACtD,MAAM,IAAI,UAAoB,UAAU,OAAO,KAAK;AAAA,IACpD,SAAS,IAAI,UAAoB,aAAa,OAAO,KAAK;AAAA,IAC1D,YAAY,CAAC,SAAiB,QAAQ,cAAc,IAAI,IAAI,gBAAgB,IAAI;AAAA,IAChF,UAAU,CAAC,MAAc,OAAe,aAAa,MAAM,IAAI,KAAK;AAAA,IACpE,SAAS,CAAC,SAAiB,WAAW,MAAM,KAAK;AAAA,IACjD,UAAU,CAAC,MAAc,QAAiB,YAAY,MAAM,KAAK,KAAK;AAAA,IACtE,SAAS,CAAC,SAAiB,WAAW,IAAI;AAAA,IAC1C,OAAO,CAAC,SAAiB,UAAU,MAAM,KAAK;AAAA,IAC9C,QAAQ,CAAC,eAAsC,WAAW,YAAY,KAAK;AAAA,EAC7E;AACF;AAKA,SAAS,gBAAgB,MAAuB;AAC9C,SAAO,KAAK,SAAS,KAAK,KAAK,CAAC,MAAM;AACxC;AAKA,SAAS,cAAc,MAAuB;AAC5C,QAAM,MAAM,KAAK;AACjB,MAAI,QAAQ,EAAG,QAAO;AAEtB,QAAM,OAAO,KAAK,WAAW,CAAC;AAC9B,MAAI,SAAS,MAAc,SAAS,IAAY;AAC9C,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,MAAM,QAAQ,MAAQ,QAAQ,MAAM,QAAQ,KAAM;AAC7D,QAAI,MAAM,KAAK,KAAK,WAAW,CAAC,MAAM,IAAY;AAChD,YAAM,QAAQ,KAAK,WAAW,CAAC;AAC/B,UAAI,UAAU,MAAc,UAAU,IAAY;AAChD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,IAAM,aAAa,MAAM;AACvB,MAAI,QAAQ;AACV,WAAO,QAAQ,aAAa;AAAA,EAC9B,WAAW,QAAQ;AAEjB,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAEA,SAAO,OAAO,YAAY,eAAe,QAAQ,aAAa;AAChE,GAAG;AAeH,IAAM,QAAQ,cAAc,KAAK;AAKjC,IAAM,QAAQ,cAAc,IAAI;AAwBhC,SAAS,cAAc,MAAc,OAAwB;AAC3D,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,aAAa,QAAQ,cAAc,IAAI,IAAI,gBAAgB,IAAI;AACrE,QAAM,oBAAoB,KAAK,KAAK,SAAS,CAAC,MAAM,aAAc,SAAS,KAAK,KAAK,SAAS,CAAC,MAAM;AAGrG,MAAI,aAAa,KAAK,QAAQ,QAAQ,aAAa,QAAQ,SAAS;AAGpE,QAAM,QAAQ,WAAW,MAAM,SAAS;AACxC,QAAM,SAAmB,CAAC;AAE1B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AAEpB,QAAI,SAAS,MAAM,SAAS,KAAK;AAC/B,UAAI,MAAM,KAAK,WAAY,QAAO,KAAK,EAAE;AACzC;AAAA,IACF;AAEA,QAAI,SAAS,MAAM;AACjB,UAAI,OAAO,SAAS,KAAK,OAAO,OAAO,SAAS,CAAC,MAAM,MAAM;AAC3D,YAAI,EAAE,OAAO,WAAW,KAAK,OAAO,CAAC,MAAM,KAAK;AAC9C,iBAAO,IAAI;AAAA,QACb;AAAA,MACF,WAAW,CAAC,YAAY;AACtB,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO,KAAK,SAAS;AAEjC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,aAAa,YAAY;AAAA,EAClC;AAEA,MAAI,qBAAqB,MAAM,MAAM,SAAS,CAAC,MAAM,WAAW;AAC9D,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAKA,SAAS,UAAU,OAAiB,OAAwB;AAC1D,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,YAAY,aAAa,KAAK;AACpC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,UAAI,OAAO,WAAW,GAAG;AACvB,iBAAS;AAAA,MACX,OAAO;AACL,kBAAU,YAAY;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,SAAO,cAAc,QAAQ,KAAK;AACpC;AAKA,SAAS,aAAa,OAAiB,OAAwB;AAC7D,QAAM,YAAY,aAAa,KAAK;AACpC,MAAI,WAAW;AACf,MAAI,aAAa;AAEjB,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC,YAAY,KAAK;AACzD,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,iBAAW,QAAQ,SAAS,SAAS,IAAI,YAAY,WAAW;AAChE,mBAAa,QAAQ,cAAc,QAAQ,IAAI,gBAAgB,QAAQ;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,UAAM,MAAM,OAAO;AACnB,eAAW,OAAO,SAAS,SAAS,IAAI,YAAY,WAAW;AAAA,EACjE;AAEA,SAAO,cAAc,UAAU,KAAK;AACtC;AAKA,SAAS,aAAa,MAAc,IAAY,OAAwB;AACtE,SAAO,aAAa,CAAC,IAAI,GAAG,KAAK;AACjC,OAAK,aAAa,CAAC,EAAE,GAAG,KAAK;AAE7B,MAAI,SAAS,GAAI,QAAO;AAExB,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,YAAY,KAAK,MAAM,SAAS,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAChE,QAAM,UAAU,GAAG,MAAM,SAAS,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAE5D,MAAI,eAAe;AACnB,QAAM,YAAY,KAAK,IAAI,UAAU,QAAQ,QAAQ,MAAM;AAE3D,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,QAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,GAAG;AAC/B;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,UAAU,SAAS;AACnC,QAAM,SAAmB,CAAC;AAE1B,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,WAAS,IAAI,cAAc,IAAI,QAAQ,QAAQ,KAAK;AAClD,WAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,EACxB;AAEA,SAAO,OAAO,KAAK,SAAS,KAAK;AACnC;AAKA,SAAS,WAAW,MAAc,OAAwB;AACxD,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,QAAM,eAAe,WAAW,YAAY,SAAS;AAErD,MAAI,iBAAiB,GAAI,QAAO;AAChC,MAAI,iBAAiB,EAAG,QAAO;AAE/B,SAAO,WAAW,MAAM,GAAG,YAAY;AACzC;AAKA,SAAS,YAAY,MAAc,KAAc,OAAyB;AACxE,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,eAAe,QAAQ,kBAAkB,IAAI,IAAI,KAAK,YAAY,GAAG;AAC3E,MAAI,OAAO,iBAAiB,KAAK,OAAO,KAAK,MAAM,eAAe,CAAC;AAEnE,MAAI,OAAO,KAAK,SAAS,GAAG,GAAG;AAC7B,WAAO,KAAK,MAAM,GAAG,KAAK,SAAS,IAAI,MAAM;AAAA,EAC/C;AAEA,SAAO;AACT;AAKA,SAAS,WAAW,MAAsB;AACxC,QAAM,eAAe,KAAK,YAAY,GAAG;AACzC,QAAM,eAAe,kBAAkB,IAAI;AAE3C,MAAI,iBAAiB,MAAM,eAAe,gBAAgB,iBAAiB,KAAK,SAAS,GAAG;AAC1F,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,YAAY;AAChC;AAKA,SAAS,UAAU,MAAc,OAA4B;AAC3D,MAAI,OAAO;AACX,MAAI,OAAO;AAET,QAAI,KAAK,UAAU,KAAK,KAAK,CAAC,MAAM,KAAK;AACvC,aAAO,KAAK,MAAM,GAAG,CAAC;AACtB,UAAI,KAAK,SAAS,MAAM,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,MAAM;AAC5D,gBAAQ;AAAA,MACV;AAAA,IACF,WAAW,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK;AAC9C,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,QAAI,KAAK,CAAC,MAAM,KAAK;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,MAAM,WAAW,MAAM,KAAK;AAClC,QAAM,OAAO,YAAY,MAAM,QAAW,KAAK;AAC/C,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,OAAO,MAAM,KAAK,MAAM,GAAG,KAAK,SAAS,IAAI,MAAM,IAAI;AAE7D,SAAO,EAAE,MAAM,KAAK,MAAM,KAAK,KAAK;AACtC;AAKA,SAAS,WAAW,YAAmC,OAAwB;AAC7E,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,MAAM,WAAW,OAAO,WAAW,QAAQ;AACjD,QAAM,OAAO,WAAW,SAAU,WAAW,QAAQ,OAAO,WAAW,OAAO;AAE9E,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,WAAW,KAAM,QAAO,MAAM;AAE1C,SAAO,MAAM,YAAY;AAC3B;AAYO,SAAS,QAAQ,OAAyB;AAC/C,SAAO,UAAU,OAAO,SAAS;AACnC;AAKO,SAAS,WAAW,OAAyB;AAClD,SAAO,aAAa,OAAO,SAAS;AACtC;AAmBO,SAAS,QAAQ,MAAsB;AAC5C,SAAO,WAAW,MAAM,SAAS;AACnC;AAKO,SAAS,SAAS,MAAc,KAAsB;AAC3D,SAAO,YAAY,MAAM,KAAK,SAAS;AACzC;AAKO,SAAS,QAAQ,MAAsB;AAC5C,SAAO,WAAW,IAAI;AACxB;;;AHpZA,SAAS,UAAU,SAAuB;AACtC,MAAI;AACA,cAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C,SAAS,OAAO;AAAA,EAEhB;AACJ;AAKA,SAAS,sBAAsB,WAAmB,YAAyD;AACvG,QAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,QAAM,QAAQ,SAAS,UAAU;AACjC,SAAO,EAAE,WAAW,MAAM,MAAM,KAAK;AACzC;AAKA,SAAS,iBAAiB,UAA0B;AAChD,QAAM,gBAAgB,aAAa,UAAU,OAAO;AACpD,SAAO,OAAO,kBAAkB,WAAW,gBAAgB,cAAc,SAAS,OAAO;AAC7F;AAKA,SAAS,iBAAiB,QAA0B;AAChD,SAAO,SAAS;AAAA,IACZ,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,aAAa;AAAA,IACb,WAAW;AAAA,EACf,IAAI,CAAC;AACT;AAKA,SAAS,aAAa,QAAsB,YAA0B;AAClE,UAAQ,IAAI,yBAAkB;AAC9B,UAAQ,IAAI,aAAa,OAAO,KAAK,EAAE;AACvC,UAAQ,IAAI,aAAa,UAAU,EAAE;AACrC,UAAQ,IAAI,aAAa,OAAO,MAAM,EAAE;AACxC,UAAQ,IAAI,aAAa,OAAO,MAAM,EAAE;AAC5C;AAKA,SAAS,gBAAgB,WAAmB,MAAoB;AAC5D,UAAQ,IAAI;AAAA,yBAAuB;AACnC,UAAQ,IAAI,WAAW,SAAS,IAAI;AACpC,UAAQ,IAAI,WAAW,YAAY,IAAI,CAAC,EAAE;AAC9C;AAEA,IAAM,iBAA8C;AAAA,EAChD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU,CAAC;AACf;AAEA,eAAsB,MAAM,SAA6C;AACrE,QAAM,SAAS,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAC/C,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI,CAAC,OAAO,OAAO;AACf,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AAEA,QAAM,YAAY,QAAQ,OAAO,KAAK;AACtC,QAAM,SAAS,QAAQ,OAAO,MAAO;AAGrC,MAAI,UAAU,OAAO;AACrB,MAAI,CAAC,SAAS;AACV,UAAM,WAAW,SAAS,OAAO,OAAO,QAAQ,OAAO,KAAK,CAAC;AAC7D,UAAM,MAAM,OAAO,WAAW,QAAQ,SAAS;AAC/C,cAAU,WAAW;AAAA,EACzB;AAEA,QAAM,aAAa,KAAK,QAAQ,OAAO;AAGvC,YAAU,MAAM;AAEhB,MAAI,OAAO,SAAS;AAChB,iBAAa,QAAQ,UAAU;AAAA,EACnC;AAGA,QAAM,oBAAoB;AAAA,IACtB,MAAM;AAAA,IACN,MAAMA,QAAY;AAEd,MAAAA,OAAM,UAAU,EAAE,QAAQ,+MAA+M,GAAG,MAAM;AAC9O,eAAO,EAAE,MAAM,gBAAgB,UAAU,MAAM,aAAa,MAAM;AAAA,MACtE,CAAC;AAGD,MAAAA,OAAM,UAAU,EAAE,QAAQ,uDAAuD,GAAG,MAAM;AACtF,eAAO,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,MAAM;AAAA,MACpE,CAAC;AAGD,MAAAA,OAAM,OAAO,EAAE,QAAQ,oBAAoB,GAAG,OAAO;AAAA,QACjD,UAAU;AAAA,MACd,EAAE;AAAA,IACN;AAAA,EACJ;AAEA,MAAI;AACA,UAAM,WAAW,OAAO,aAAa,OAAO,WAAW,QAAQ,SAAS;AACxE,UAAM,UAAU,aAAa,YAAY,CAAC,iBAAiB,IAAI,CAAC;AAGhE,UAAM,SAAiC,CAAC;AACxC,QAAI,OAAO,KAAK;AACZ,aAAO,QAAQ,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAEjD,YAAI,IAAI,WAAW,OAAO,GAAG;AACzB,iBAAO,mBAAmB,GAAG,EAAE,IAAI,KAAK,UAAU,KAAK;AAAA,QAC3D;AAAA,MACJ,CAAC;AAED,UAAI,OAAO,IAAI,MAAM;AACjB,eAAO,sBAAsB,IAAI,KAAK,UAAU,OAAO,IAAI,IAAI;AAAA,MACnE;AAEA,aAAO,qBAAqB,IAAI,KAAK,UAAU,OAAO,IAAI,SAAS,YAAY;AAC/E,aAAO,sBAAsB,IAAI,KAAK,UAAU,OAAO,IAAI,SAAS,YAAY;AAAA,IACpF;AAEA,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,YAAY,QAAQ;AAEpB,YAAM,EAAE,OAAO,QAAQ,IAAI,MAAM,OAAO,SAAS;AAEjD,YAAM,cAAc;AAAA,QAChB,aAAa,CAAC,SAAS;AAAA,QACvB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,aAAa,OAAO;AAAA,QACpB,YAAY,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,OAAO,UAAU,SAAS;AAAA,QACpC,UAAU;AAAA;AAAA,QAEV,YAAY,aAAa,YAAY,CAAC,WAAW,UAAU,MAAM,IAAI,CAAC,UAAU,MAAM;AAAA,MAC1F;AAEA,YAAM,iBAAsB;AAAA,QACxB,GAAG;AAAA,QACH,GAAG,iBAAiB,OAAO,MAAM;AAAA,MACrC;AAEA,UAAI,OAAO,SAAS,OAAO;AACvB,uBAAe,UAAU,EAAE,OAAO,OAAO,QAAQ,MAAM;AAAA,MAC3D;AAEA,eAAS,MAAM,QAAQ,cAAc;AAErC,OAAC,EAAE,WAAW,KAAK,IAAI,sBAAsB,WAAW,UAAU;AAAA,IACtE,WAAW,YAAY,OAAO;AAG1B,eAAS,MAAM,IAAI,MAAM;AAAA,QACrB,aAAa,CAAC,SAAS;AAAA,QACvB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,OAAO,WAAW,QAAQ,QAAQ;AAAA,QAC1C,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO,YAAY,aAAa;AAAA,QAC3C,UAAU,OAAO;AAAA,QACjB,QAAQ;AAAA,QACR;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,OAAO,SAAS;AACjB,cAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,MACtE;AAEA,OAAC,EAAE,WAAW,KAAK,IAAI,sBAAsB,WAAW,UAAU;AAAA,IACtE,OAAO;AAGH,eAAS,MAAM,KAAK,KAAK,WAAW;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,iBAAiB;AAAA,UACb,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO,WAAW,QAAQ,aAAa;AAAA,UAC/C,WAAW,OAAO;AAAA,QACtB;AAAA,MACJ,CAAC;AAGD,YAAM,cAAc,OAAO,MAAM,mBAAmB;AACpD,UAAI,aAAa;AAEb,cAAM,KAAK,cAAc,YAAY,WAAW;AAAA,MACpD;AAEA,OAAC,EAAE,WAAW,KAAK,IAAI,sBAAsB,WAAW,UAAU;AAAA,IACtE;AAEA,QAAI,OAAO,SAAS;AAChB,sBAAgB,WAAW,IAAI;AAG/B,UAAI,YAAY,UAAU,OAAO,UAAU;AACvC,cAAM,SAAS,OAAO,KAAK,OAAO,SAAS,MAAM,EAAE;AACnD,gBAAQ,IAAI,YAAY,MAAM,WAAW;AAGzC,cAAM,aAAa,OAAO,KAAK,OAAO,SAAS,OAAO;AACtD,YAAI,WAAW,SAAS,GAAG;AACvB,gBAAM,aAAa,OAAO,SAAS,QAAQ,WAAW,CAAC,CAAC;AACxD,cAAI,cAAc,WAAW,QAAQ;AACjC,kBAAM,eAAe,OAAO,QAAQ,WAAW,MAAM,EAChD,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM;AACpB,oBAAM,SAAU,EAAU,iBAAiB;AAC3C,oBAAM,SAAU,EAAU,iBAAiB;AAC3C,qBAAO,SAAS;AAAA,YACpB,CAAC,EACA,MAAM,GAAG,CAAC;AAEf,gBAAI,aAAa,SAAS,GAAG;AACzB,sBAAQ,IAAI,sCAA+B;AAC3C,2BAAa,QAAQ,CAAC,CAAC,MAAM,IAAI,MAAM;AACnC,sBAAM,WAAW,KAAK,MAAM,OAAO,EAAE,IAAI,KAAK;AAC9C,sBAAM,YAAa,KAAa,iBAAiB;AACjD,wBAAQ,IAAI,QAAQ,SAAS,OAAO,EAAE,CAAC,IAAI,YAAY,SAAS,CAAC,EAAE;AAAA,cACvE,CAAC;AAAA,YACL;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,cAA2B;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAGA,QAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACvC,UAAI,OAAO,SAAS;AAChB,gBAAQ,IAAI,8BAAuB;AAAA,MACvC;AAEA,iBAAW,YAAY,OAAO,MAAM;AAChC,cAAM,WAAW,QAAQ,SAAS,IAAI;AACtC,cAAM,SAAS,QAAQ,QAAQ,SAAS,EAAE;AAG1C,cAAM,YAAY,QAAQ,MAAM;AAChC,YAAI,CAAC,WAAW,SAAS,GAAG;AACxB,oBAAU,SAAS;AAAA,QACvB;AAEA,YAAI,WAAW,QAAQ,GAAG;AACtB,cAAI,SAAS,WAAW;AAEpB,kBAAM,UAAU,iBAAiB,QAAQ;AACzC,kBAAM,cAAc,SAAS,UAAU,SAAS,MAAM;AACtD,0BAAc,QAAQ,WAAW;AAAA,UACrC,OAAO;AAEH,yBAAa,UAAU,MAAM;AAAA,UACjC;AAEA,cAAI,OAAO,SAAS;AAChB,oBAAQ,IAAI,YAAO,SAAS,IAAI,WAAM,SAAS,EAAE,EAAE;AAAA,UACvD;AAAA,QACJ,WAAW,OAAO,SAAS;AACvB,kBAAQ,KAAK,4BAAuB,SAAS,IAAI,EAAE;AAAA,QACvD;AAAA,MACJ;AAAA,IACJ;AAGA,QAAI,OAAO,YAAY;AACnB,YAAM,OAAO,WAAW,WAAW;AAAA,IACvC;AAEA,QAAI,OAAO,SAAS;AAChB,cAAQ,IAAI,EAAE;AAAA,IAClB;AAEA,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,QAAI,OAAO,SAAS;AAChB,cAAQ,MAAM,wBAAmB;AACjC,cAAQ,MAAM,KAAK;AAAA,IACvB;AACA,UAAM;AAAA,EACV;AACJ;AAEA,SAAS,YAAY,OAAuB;AACxC,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AAC1E;","names":["build"]}
1
+ {"version":3,"sources":["../src/build.ts","../src/runtime.ts","../src/fs.ts","../src/path.ts"],"sourcesContent":["/**\n * Build module for bundling applications\n * Pure implementation with cross-runtime support\n * Compatible with standard build tools API\n * - Node.js: uses esbuild\n * - Bun: uses Bun.build\n * - Deno: uses Deno.emit\n */\n\nimport { statSync, mkdirSync, readFileSync, writeFileSync, copyFileSync, existsSync } from './fs';\nimport { resolve, join, basename, extname, dirname } from './path';\nimport { runtime } from './runtime';\nimport type { BuildOptions, BuildResult } from './types';\n\n/**\n * Helper: Ensure directory exists (eliminates duplication in directory creation)\n */\nfunction ensureDir(dirPath: string): void {\n try {\n mkdirSync(dirPath, { recursive: true });\n } catch (error) {\n // Directory might already exist\n }\n}\n\n/**\n * Helper: Calculate build time and size (eliminates duplication in build result)\n */\nfunction calculateBuildMetrics(startTime: number, outputPath: string): { buildTime: number; size: number } {\n const buildTime = Date.now() - startTime;\n const stats = statSync(outputPath);\n return { buildTime, size: stats.size };\n}\n\n/**\n * Helper: Read file and ensure string output (eliminates duplication in file reading)\n */\nfunction readFileAsString(filePath: string): string {\n const contentBuffer = readFileSync(filePath, 'utf-8');\n return typeof contentBuffer === 'string' ? contentBuffer : contentBuffer.toString('utf-8');\n}\n\n/**\n * Helper: Get esbuild minify options (eliminates duplication in esbuild config)\n */\nfunction getMinifyOptions(minify?: boolean): object {\n return minify ? {\n minifyWhitespace: true,\n minifyIdentifiers: true,\n minifySyntax: true,\n legalComments: 'none',\n mangleProps: /^_/,\n keepNames: false\n } : {};\n}\n\n/**\n * Helper: Log build info (eliminates duplication in logging)\n */\nfunction logBuildInfo(config: BuildOptions, outputPath: string): void {\n console.log('\\n🔨 Building...');\n console.log(` Entry: ${config.entry}`);\n console.log(` Output: ${outputPath}`);\n console.log(` Format: ${config.format}`);\n console.log(` Target: ${config.target}`);\n}\n\n/**\n * Helper: Log build success (eliminates duplication in success logging)\n */\nfunction logBuildSuccess(buildTime: number, size: number): void {\n console.log(`\\n✅ Build successful!`);\n console.log(` Time: ${buildTime}ms`);\n console.log(` Size: ${formatBytes(size)}`);\n}\n\nconst defaultOptions: Omit<BuildOptions, 'entry'> = {\n outDir: 'dist',\n minify: true,\n sourcemap: false,\n target: 'es2020',\n format: 'esm',\n treeshake: true,\n logging: true,\n external: []\n};\n\nexport async function build(options: BuildOptions): Promise<BuildResult> {\n const config = { ...defaultOptions, ...options };\n const startTime = Date.now();\n\n if (!config.entry) {\n throw new Error('Entry file is required');\n }\n\n const entryPath = resolve(config.entry);\n const outDir = resolve(config.outDir!);\n\n // Determine output filename\n let outFile = config.outFile;\n if (!outFile) {\n const baseName = basename(config.entry, extname(config.entry));\n const ext = config.format === 'cjs' ? '.cjs' : '.js';\n outFile = baseName + ext;\n }\n\n const outputPath = join(outDir, outFile);\n\n // Ensure output directory exists\n ensureDir(outDir);\n\n if (config.logging) {\n logBuildInfo(config, outputPath);\n }\n\n // Browser-only plugin for automatic client/server separation\n const browserOnlyPlugin = {\n name: 'browser-only',\n setup(build: any) {\n // External all Node.js built-in modules\n build.onResolve({ filter: /^(node:.*|fs|path|http|https|url|os|child_process|net|tls|crypto|stream|util|events|buffer|zlib|readline|process|assert|constants|dns|domain|punycode|querystring|repl|string_decoder|sys|timers|tty|v8|vm)$/ }, () => {\n return { path: 'node-builtin', external: true, sideEffects: false };\n });\n\n // External common server-side dependencies\n build.onResolve({ filter: /^(chokidar|esbuild|mime-types|open|ws|fs\\/promises)$/ }, () => {\n return { path: 'server-dep', external: true, sideEffects: false };\n });\n\n // Intercept imports from elit server-side modules\n build.onLoad({ filter: /server|config|cli/ }, () => ({\n contents: 'export default {};',\n }));\n },\n };\n\n try {\n const platform = config.platform || (config.format === 'cjs' ? 'node' : 'browser');\n const plugins = platform === 'browser' ? [browserOnlyPlugin] : [];\n\n // Prepare environment variables for injection\n const define: Record<string, string> = {};\n if (config.env) {\n Object.entries(config.env).forEach(([key, value]) => {\n // Only inject variables prefixed with VITE_ to client code\n if (key.startsWith('VITE_')) {\n define[`import.meta.env.${key}`] = JSON.stringify(value);\n }\n });\n // Add MODE\n if (config.env.MODE) {\n define['import.meta.env.MODE'] = JSON.stringify(config.env.MODE);\n }\n // Add DEV/PROD flags\n define['import.meta.env.DEV'] = JSON.stringify(config.env.MODE !== 'production');\n define['import.meta.env.PROD'] = JSON.stringify(config.env.MODE === 'production');\n }\n\n let result: any;\n let buildTime: number;\n let size: number;\n\n if (runtime === 'node') {\n // Node.js - use esbuild\n const { build: esbuild } = await import('esbuild');\n\n const baseOptions = {\n entryPoints: [entryPath],\n bundle: true,\n outfile: outputPath,\n format: config.format,\n target: config.target,\n minify: config.minify,\n sourcemap: config.sourcemap,\n external: config.external,\n treeShaking: config.treeshake,\n globalName: config.globalName,\n platform,\n plugins,\n define,\n logLevel: config.logging ? 'info' : 'silent',\n metafile: true,\n // Prioritize browser field for browser builds\n mainFields: platform === 'browser' ? ['browser', 'module', 'main'] : ['module', 'main'],\n };\n\n const esbuildOptions: any = {\n ...baseOptions,\n ...getMinifyOptions(config.minify)\n };\n\n if (config.resolve?.alias) {\n esbuildOptions.resolve = { alias: config.resolve.alias };\n }\n\n result = await esbuild(esbuildOptions);\n\n ({ buildTime, size } = calculateBuildMetrics(startTime, outputPath));\n } else if (runtime === 'bun') {\n // Bun - use Bun.build\n // @ts-ignore\n result = await Bun.build({\n entrypoints: [entryPath],\n outdir: outDir,\n target: 'bun',\n format: config.format === 'cjs' ? 'cjs' : 'esm',\n minify: config.minify,\n sourcemap: config.sourcemap ? 'external' : 'none',\n external: config.external,\n naming: outFile,\n define\n });\n\n if (!result.success) {\n throw new Error('Bun build failed: ' + JSON.stringify(result.logs));\n }\n\n ({ buildTime, size } = calculateBuildMetrics(startTime, outputPath));\n } else {\n // Deno - use Deno.emit\n // @ts-ignore\n result = await Deno.emit(entryPath, {\n bundle: 'module',\n check: false,\n compilerOptions: {\n target: config.target,\n module: config.format === 'cjs' ? 'commonjs' : 'esnext',\n sourceMap: config.sourcemap\n }\n });\n\n // Write the bundled output\n const bundledCode = result.files['deno:///bundle.js'];\n if (bundledCode) {\n // @ts-ignore\n await Deno.writeTextFile(outputPath, bundledCode);\n }\n\n ({ buildTime, size } = calculateBuildMetrics(startTime, outputPath));\n }\n\n if (config.logging) {\n logBuildSuccess(buildTime, size);\n\n // Show metafile info (Node.js esbuild only)\n if (runtime === 'node' && result.metafile) {\n const inputs = Object.keys(result.metafile.inputs).length;\n console.log(` Files: ${inputs} input(s)`);\n\n // Show largest modules\n const outputKeys = Object.keys(result.metafile.outputs);\n if (outputKeys.length > 0) {\n const mainOutput = result.metafile.outputs[outputKeys[0]];\n if (mainOutput && mainOutput.inputs) {\n const sortedInputs = Object.entries(mainOutput.inputs)\n .sort(([, a], [, b]) => {\n const aBytes = (a as any).bytesInOutput || 0;\n const bBytes = (b as any).bytesInOutput || 0;\n return bBytes - aBytes;\n })\n .slice(0, 5);\n\n if (sortedInputs.length > 0) {\n console.log('\\n 📊 Top 5 largest modules:');\n sortedInputs.forEach(([file, info]) => {\n const fileName = file.split(/[/\\\\]/).pop() || file;\n const infoBytes = (info as any).bytesInOutput || 0;\n console.log(` ${fileName.padEnd(30)} ${formatBytes(infoBytes)}`);\n });\n }\n }\n }\n }\n }\n\n const buildResult: BuildResult = {\n outputPath,\n buildTime,\n size\n };\n\n // Handle copy files\n if (config.copy && config.copy.length > 0) {\n if (config.logging) {\n console.log('\\n📦 Copying files...');\n }\n\n for (const copyItem of config.copy) {\n const fromPath = resolve(copyItem.from);\n const toPath = resolve(outDir, copyItem.to);\n\n // Ensure target directory exists\n const targetDir = dirname(toPath);\n if (!existsSync(targetDir)) {\n ensureDir(targetDir);\n }\n\n if (existsSync(fromPath)) {\n if (copyItem.transform) {\n // Read, transform, and write\n const content = readFileAsString(fromPath);\n const transformed = copyItem.transform(content, config);\n writeFileSync(toPath, transformed);\n } else {\n // Direct copy\n copyFileSync(fromPath, toPath);\n }\n\n if (config.logging) {\n console.log(` ✓ ${copyItem.from} → ${copyItem.to}`);\n }\n } else if (config.logging) {\n console.warn(` ⚠ File not found: ${copyItem.from}`);\n }\n }\n }\n\n // Call post-build hook\n if (config.onBuildEnd) {\n await config.onBuildEnd(buildResult);\n }\n\n if (config.logging) {\n console.log('');\n }\n\n return buildResult;\n } catch (error) {\n if (config.logging) {\n console.error('\\n❌ Build failed:');\n console.error(error);\n }\n throw error;\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport type { BuildOptions, BuildResult } from './types';\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: Check if runtime is Bun or Deno (eliminates duplication in Deno API calls)\n */\nconst isBunOrDeno = isBun || isDeno;\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) {\n return fsPromises.writeFile(path, data, opts);\n } else if (isBun) {\n // @ts-ignore\n await Bun.write(path, data);\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) {\n fs.writeFileSync(path, data, opts);\n } else if (isBun) {\n // @ts-ignore\n Bun.write(path, data);\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) {\n await fsPromises.mkdir(path, opts);\n } else if (isBun) {\n // @ts-ignore\n await Deno.mkdir(path, { recursive: opts.recursive });\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) {\n fs.mkdirSync(path, opts);\n } else if (isBun) {\n // @ts-ignore\n Deno.mkdirSync(path, { recursive: opts.recursive });\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) {\n return fsPromises.readdir(path, opts);\n } else if (isBunOrDeno) {\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) {\n return fs.readdirSync(path, opts);\n } else if (isBunOrDeno) {\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) {\n return fsPromises.unlink(path);\n } else if (isBun) {\n // @ts-ignore\n await Deno.remove(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) {\n fs.unlinkSync(path);\n } else if (isBun) {\n // @ts-ignore\n Deno.removeSync(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) {\n return fsPromises.rmdir(path, options);\n } else if (isBun) {\n // @ts-ignore\n await Deno.remove(path, { recursive: options?.recursive });\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) {\n fs.rmdirSync(path, options);\n } else if (isBun) {\n // @ts-ignore\n Deno.removeSync(path, { recursive: options?.recursive });\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) {\n return fsPromises.rename(oldPath, newPath);\n } else if (isBun) {\n // @ts-ignore\n await Deno.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) {\n fs.renameSync(oldPath, newPath);\n } else if (isBun) {\n // @ts-ignore\n Deno.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) {\n return fsPromises.copyFile(src, dest, flags);\n } else if (isBun) {\n // @ts-ignore\n await Deno.copyFile(src, dest);\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) {\n fs.copyFileSync(src, dest, flags);\n } else if (isBun) {\n // @ts-ignore\n Deno.copyFileSync(src, dest);\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) {\n return fsPromises.realpath(path, options);\n } else if (isBun) {\n // Bun supports fs.promises.realpath\n const fs = require('fs/promises');\n return fs.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) {\n return fs.realpathSync(path, options);\n } else if (isBun) {\n // Bun supports fs.realpathSync\n const fs = require('fs');\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":["build"]}
package/dist/build.mjs CHANGED
@@ -37,18 +37,14 @@ function dataToUint8Array(data) {
37
37
  }
38
38
  var fs;
39
39
  var fsPromises;
40
- if (isNode) {
40
+ if (isNode || isBun) {
41
41
  fs = __require("fs");
42
42
  fsPromises = __require("fs/promises");
43
43
  }
44
44
  function readFileSync(path, options) {
45
45
  const opts = parseOptions(options, {});
46
- if (isNode) {
46
+ if (isNode || isBun) {
47
47
  return fs.readFileSync(path, opts);
48
- } else if (isBun) {
49
- const file = Bun.file(path);
50
- const content = file.arrayBuffer();
51
- return decodeContent(content, opts.encoding);
52
48
  } else if (isDeno) {
53
49
  const content = Deno.readFileSync(path);
54
50
  return decodeContent(content, opts.encoding);
@@ -74,17 +70,8 @@ function existsSync(path) {
74
70
  }
75
71
  }
76
72
  function statSync(path) {
77
- if (isNode) {
73
+ if (isNode || isBun) {
78
74
  return fs.statSync(path);
79
- } else if (isBun) {
80
- const file = Bun.file(path);
81
- const size = file.size;
82
- try {
83
- file.arrayBuffer();
84
- } catch {
85
- throw new Error(`ENOENT: no such file or directory, stat '${path}'`);
86
- }
87
- return createStatsObject(path, size, false);
88
75
  } else if (isDeno) {
89
76
  const info = Deno.statSync(path);
90
77
  return createStatsFromDenoFileInfo(info);
@@ -110,36 +97,6 @@ function copyFileSync(src, dest, flags) {
110
97
  Deno.copyFileSync(src, dest);
111
98
  }
112
99
  }
113
- function createStatsObject(_path, size, isDir) {
114
- const now = Date.now();
115
- return {
116
- isFile: () => !isDir,
117
- isDirectory: () => isDir,
118
- isBlockDevice: () => false,
119
- isCharacterDevice: () => false,
120
- isSymbolicLink: () => false,
121
- isFIFO: () => false,
122
- isSocket: () => false,
123
- dev: 0,
124
- ino: 0,
125
- mode: isDir ? 16877 : 33188,
126
- nlink: 1,
127
- uid: 0,
128
- gid: 0,
129
- rdev: 0,
130
- size,
131
- blksize: 4096,
132
- blocks: Math.ceil(size / 512),
133
- atimeMs: now,
134
- mtimeMs: now,
135
- ctimeMs: now,
136
- birthtimeMs: now,
137
- atime: new Date(now),
138
- mtime: new Date(now),
139
- ctime: new Date(now),
140
- birthtime: new Date(now)
141
- };
142
- }
143
100
  function createStatsFromDenoFileInfo(info) {
144
101
  return {
145
102
  isFile: () => info.isFile,