@walkeros/cli 0.3.2 ā 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/core/execution.d.ts.map +1 -1
- package/dist/core/execution.js +7 -1
- package/dist/core/execution.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAQtE;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjD;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,cAAc,EAC5B,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
package/dist/core/execution.js
CHANGED
|
@@ -11,7 +11,13 @@ import { executeInDocker, isDockerAvailable, } from './docker';
|
|
|
11
11
|
* @returns Execution mode
|
|
12
12
|
*/
|
|
13
13
|
export function getExecutionMode(options) {
|
|
14
|
-
|
|
14
|
+
// Force local mode if:
|
|
15
|
+
// 1. --local flag is provided, OR
|
|
16
|
+
// 2. Running inside a Docker container (WALKEROS_CONTAINER env var)
|
|
17
|
+
if (options.local || process.env.WALKEROS_CONTAINER === 'true') {
|
|
18
|
+
return 'local';
|
|
19
|
+
}
|
|
20
|
+
return 'docker';
|
|
15
21
|
}
|
|
16
22
|
/**
|
|
17
23
|
* Execute command based on mode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EAEf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAQlB;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EAEf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAQlB;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,uBAAuB;IACvB,kCAAkC;IAClC,oEAAoE;IACpE,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE,CAAC;QAC/D,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAOD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAA4B,EAC5B,aAAqB,EACrB,UAAoB,EACpB,OAAsB,EACtB,MAAe,EACf,UAAmB;IAEnB,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEvC,iBAAiB;IACjB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,kCAAkC,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtF,MAAM,EAAE,IAAI,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,IAAI,CACV,oCAAoC,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC5E,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,cAAc;QACd,MAAM,eAAe,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAClD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,eAAe,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -246,7 +246,10 @@ async function executeRunInDocker(mode, flowPath, options = {}) {
|
|
|
246
246
|
|
|
247
247
|
// src/core/execution.ts
|
|
248
248
|
function getExecutionMode(options) {
|
|
249
|
-
|
|
249
|
+
if (options.local || process.env.WALKEROS_CONTAINER === "true") {
|
|
250
|
+
return "local";
|
|
251
|
+
}
|
|
252
|
+
return "docker";
|
|
250
253
|
}
|
|
251
254
|
async function executeCommand(localHandler, dockerCommand, dockerArgs, options, logger, configFile) {
|
|
252
255
|
const mode = getExecutionMode(options);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/bundle/index.ts","../src/core/logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/docker.ts","../src/core/execution.ts","../src/config/validators.ts","../src/config/utils.ts","../src/config/defaults.ts","../src/config/parser.ts","../src/config/loader.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/package-manager.ts","../src/commands/bundle/template-engine.ts","../src/commands/bundle/serializer.ts","../src/commands/bundle/stats.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/tracker.ts","../src/commands/simulate/index.ts","../src/commands/run/index.ts","../src/commands/run/validators.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { bundleCommand } from './commands/bundle';\nimport { simulateCommand } from './commands/simulate';\nimport { runCommand } from './commands/run';\n\n// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand, simulateCommand, runCommand };\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle';\nexport { simulate } from './commands/simulate';\nexport { run } from './commands/run';\n\n// === Types ===\n// Export types for programmatic usage\nexport type { BuildOptions, EnvironmentConfig, Setup } from './types/bundle';\nexport type { BundleStats } from './commands/bundle/bundler';\nexport type { SimulationResult } from './commands/simulate/types';\nexport type {\n SourceDestinationItem,\n TemplateVariables,\n ProcessedTemplateVariables,\n TemplateSource,\n TemplateDestination,\n} from './types/template';\nexport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run';\nexport type { GlobalOptions } from './types/global';\n\nconst program = new Command();\n\nprogram\n .name('walkeros')\n .description('walkerOS CLI - Bundle and deploy walkerOS components')\n .version('0.1.0');\n\n// Bundle command\nprogram\n .command('bundle [file]')\n .description('Bundle NPM packages with custom code')\n .option(\n '-e, --env <name>',\n 'environment to build (for multi-environment configs)',\n )\n .option('--all', 'build all environments (for multi-environment configs)')\n .option('-s, --stats', 'show bundle statistics')\n .option('--json', 'output statistics in JSON format (implies --stats)')\n .option('--no-cache', 'disable package caching and download fresh packages')\n .option('-v, --verbose', 'verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await bundleCommand({\n config: file || 'bundle.config.json',\n env: options.env,\n all: options.all,\n stats: options.stats,\n json: options.json,\n cache: options.cache,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Simulate command\nprogram\n .command('simulate [file]')\n .description('Simulate event processing and capture API calls')\n .option('-e, --event <json>', 'Event to simulate (JSON string)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await simulateCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run command with subcommands\nconst runCmd = program\n .command('run')\n .description('Run walkerOS flows in collect or serve mode');\n\n// Run collect subcommand\nrunCmd\n .command('collect <file>')\n .description('Run collector mode (event collection endpoint)')\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('collect', {\n config: file,\n port: options.port,\n host: options.host,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run serve subcommand\nrunCmd\n .command('serve <file>')\n .description('Run serve mode (static file server for browser bundles)')\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--static-dir <dir>', 'Static directory for serve mode')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('serve', {\n config: file,\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Only run CLI if this file is executed directly (not imported as a module)\n// Check if the resolved file path matches the first CLI argument\nimport { fileURLToPath } from 'url';\nconst isMainModule =\n process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];\nif (isMainModule) {\n program.parse();\n}\n","/**\n * Bundle Command\n *\n * Supports both single-environment and multi-environment builds.\n */\n\nimport path from 'path';\nimport {\n createLogger,\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n executeCommand,\n} from '../../core';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllEnvironments,\n parseBundleConfig,\n type LoadConfigResult,\n} from '../../config';\nimport type { GlobalOptions } from '../../types';\nimport { bundleCore } from './bundler';\nimport { displayStats, createStatsSummary } from './stats';\n\nexport interface BundleCommandOptions extends GlobalOptions {\n config: string;\n env?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n\n // Build Docker args - file path as first positional arg\n const dockerArgs = [options.config];\n if (options.env) dockerArgs.push('--env', options.env);\n if (options.all) dockerArgs.push('--all');\n if (options.stats) dockerArgs.push('--stats');\n if (options.json) dockerArgs.push('--json');\n if (options.cache === false) dockerArgs.push('--no-cache');\n if (options.verbose) dockerArgs.push('--verbose');\n if (options.silent) dockerArgs.push('--silent');\n\n await executeCommand(\n async () => {\n try {\n // Validate flag combination\n if (options.env && options.all) {\n throw new Error('Cannot use both --env and --all flags together');\n }\n\n // Step 1: Read configuration file\n logger.info('š¦ Reading configuration...');\n const configPath = path.resolve(options.config);\n const rawConfig = await loadJsonConfig(configPath);\n\n // Step 2: Load configuration(s) based on flags\n const configsToBundle: LoadConfigResult[] = options.all\n ? loadAllEnvironments(rawConfig, { configPath, logger })\n : [\n loadBundleConfig(rawConfig, {\n configPath,\n environment: options.env,\n logger,\n }),\n ];\n\n // Step 3: Bundle each configuration\n const results: Array<{\n environment: string;\n success: boolean;\n stats?: unknown;\n error?: string;\n }> = [];\n\n for (const {\n flowConfig,\n buildOptions,\n environment,\n isMultiEnvironment,\n } of configsToBundle) {\n try {\n // Override cache setting from CLI if provided\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // Log environment being built (for multi-environment setups)\n if (isMultiEnvironment || options.all) {\n logger.info(`\\nš§ Building environment: ${environment}`);\n } else {\n logger.info('š§ Starting bundle process...');\n }\n\n // Run bundler\n const shouldCollectStats = options.stats || options.json;\n const stats = await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n shouldCollectStats,\n );\n\n results.push({\n environment,\n success: true,\n stats,\n });\n\n // Show stats if requested (for non-JSON, non-multi builds)\n if (!options.json && !options.all && options.stats && stats) {\n displayStats(stats, logger);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n results.push({\n environment,\n success: false,\n error: errorMessage,\n });\n\n if (!options.all) {\n throw error; // Re-throw for single environment builds\n }\n }\n }\n\n // Step 4: Report results\n const duration = timer.end() / 1000;\n const successCount = results.filter((r) => r.success).length;\n const failureCount = results.filter((r) => !r.success).length;\n\n if (options.json) {\n // JSON output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output =\n failureCount === 0\n ? createSuccessOutput(\n {\n environments: results,\n summary: {\n total: results.length,\n success: successCount,\n failed: failureCount,\n },\n },\n duration,\n )\n : createErrorOutput(\n `${failureCount} environment(s) failed to build`,\n duration,\n );\n outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n if (options.all) {\n logger.info(`\\nš Build Summary:`);\n logger.info(` Total: ${results.length}`);\n logger.success(` ā
Success: ${successCount}`);\n if (failureCount > 0) {\n logger.error(` ā Failed: ${failureCount}`);\n }\n }\n\n if (failureCount === 0) {\n logger.success(\n `\\nā
Bundle created successfully in ${timer.format()}`,\n );\n } else {\n throw new Error(`${failureCount} environment(s) failed to build`);\n }\n }\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n // JSON error output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output = createErrorOutput(errorMessage, duration);\n outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n logger.error('ā Bundle failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n },\n 'bundle',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level bundle function for programmatic usage.\n *\n * Handles configuration loading, parsing, and logger creation internally.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param options - Bundle options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.stats - Collect and return bundle statistics (default: false)\n * @param options.cache - Enable package caching (default: true)\n * @returns Bundle statistics if stats option is true, otherwise void\n *\n * @example\n * ```typescript\n * // With config object\n * await bundle({\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * sources: { browser: { code: 'sourceBrowser' } },\n * destinations: { api: { code: 'destinationApi' } },\n * code: 'export default startFlow({ sources, destinations })',\n * output: './dist/walker.js'\n * });\n *\n * // With config file\n * await bundle('./walker.config.json', { stats: true });\n * ```\n */\nexport async function bundle(\n configOrPath: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n stats?: boolean;\n cache?: boolean;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // 1. Load config if path provided\n let rawConfig: unknown;\n if (typeof configOrPath === 'string') {\n rawConfig = await loadJsonConfig(configOrPath);\n } else {\n rawConfig = configOrPath;\n }\n\n // 2. Parse and normalize config\n const { flowConfig, buildOptions } = parseBundleConfig(rawConfig);\n\n // 3. Handle cache option\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // 4. Create logger internally\n const logger = createLogger({\n silent: options.silent ?? false,\n verbose: options.verbose ?? false,\n });\n\n // 5. Call core bundler\n return await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n options.stats ?? false,\n );\n}\n","/* eslint-disable no-console */\nimport chalk from 'chalk';\n\nexport interface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\nexport interface Logger {\n log: (color: string, ...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void; // Alias for warning\n error: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n gray: (...args: unknown[]) => void;\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, silent = false, json = false } = options;\n\n const shouldLog = !silent && !json;\n const shouldDebug = verbose && !silent && !json;\n\n return {\n log: (color: string, ...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n // Map color names to chalk functions\n const colorMap: Record<string, (text: string) => string> = {\n red: chalk.red,\n green: chalk.green,\n blue: chalk.blue,\n yellow: chalk.yellow,\n gray: chalk.gray,\n grey: chalk.gray,\n cyan: chalk.cyan,\n magenta: chalk.magenta,\n white: chalk.white,\n black: chalk.black,\n };\n const colorFn = colorMap[color];\n const coloredMessage = colorFn ? colorFn(message) : message;\n console.log(coloredMessage);\n }\n },\n\n info: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.blue(message));\n }\n },\n\n success: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.green(message));\n }\n },\n\n warning: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n warn: (...args: unknown[]) => {\n // Alias for warning\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n error: (...args: unknown[]) => {\n if (!json) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.error(chalk.red(message));\n }\n },\n\n debug: (...args: unknown[]) => {\n if (shouldDebug) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n\n gray: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n };\n}\n","/**\n * Timer utilities for measuring execution time\n */\n\nexport interface Timer {\n start: () => void;\n end: () => number;\n getElapsed: () => number;\n format: () => string;\n}\n\n/**\n * Create a high-precision timer\n */\nexport function createTimer(): Timer {\n let startTime = 0;\n let endTime = 0;\n\n return {\n start() {\n startTime = Date.now();\n endTime = 0;\n },\n\n end() {\n endTime = Date.now();\n return endTime - startTime;\n },\n\n getElapsed() {\n const currentTime = endTime || Date.now();\n return currentTime - startTime;\n },\n\n format() {\n const elapsed = this.getElapsed();\n return (elapsed / 1000).toFixed(2) + 's';\n },\n };\n}\n","/**\n * Output formatting utilities for CLI commands\n */\n\nexport interface JsonOutput<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n error?: string;\n duration?: number;\n}\n\n/**\n * Create standardized JSON output for CLI commands\n */\nexport function createJsonOutput<T = Record<string, unknown>>(\n success: boolean,\n data?: T,\n error?: string,\n duration?: number,\n): JsonOutput<T> {\n return {\n success,\n ...(data && { data }),\n ...(error && { error }),\n ...(duration && { duration }),\n };\n}\n\n/**\n * Create success JSON output\n */\nexport function createSuccessOutput<T = Record<string, unknown>>(\n data?: T,\n duration?: number,\n): JsonOutput<T> {\n return createJsonOutput(true, data, undefined, duration);\n}\n\n/**\n * Create error JSON output\n */\nexport function createErrorOutput(\n error: string,\n duration?: number,\n): JsonOutput<never> {\n return createJsonOutput<never>(false, undefined, error, duration);\n}\n\n/**\n * Format bytes to KB with 2 decimal places\n */\nexport function formatBytes(bytes: number): string {\n return (bytes / 1024).toFixed(2);\n}\n\n/**\n * Format file size with appropriate unit\n */\nexport function formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)} ${units[unitIndex]}`;\n}\n","/**\n * Docker Execution Utilities\n *\n * Handles Docker container execution for CLI commands.\n */\n\nimport { spawn } from 'child_process';\nimport path from 'path';\nimport type { GlobalOptions } from '../types/global';\n\n/**\n * Docker image for CLI/build tools (bundle, simulate)\n */\nexport const CLI_DOCKER_IMAGE =\n process.env.WALKEROS_CLI_DOCKER_IMAGE || 'walkeros/cli:latest';\n\n/**\n * Docker image for production runtime (run command)\n */\nexport const RUNTIME_DOCKER_IMAGE =\n process.env.WALKEROS_RUNTIME_DOCKER_IMAGE || 'walkeros/docker:latest';\n\n/**\n * @deprecated Use CLI_DOCKER_IMAGE or RUNTIME_DOCKER_IMAGE instead\n */\nexport const DOCKER_IMAGE = CLI_DOCKER_IMAGE;\n\n/**\n * Build Docker command for executing CLI commands\n *\n * @param command - CLI command (bundle, simulate, run)\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Docker command array\n */\nexport function buildDockerCommand(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): string[] {\n const cwd = process.cwd();\n\n const cmd = ['docker', 'run', '--rm'];\n\n // Mount config file if provided\n if (configFile) {\n const configPath = path.resolve(cwd, configFile);\n\n // Mount config file at /config/flow.json (read-only, separate from workspace)\n cmd.push('-v', `${configPath}:/config/flow.json:ro`);\n\n // Update args to use container path - replace first occurrence of config file path\n args = args.map((arg) => (arg === configFile ? '/config/flow.json' : arg));\n }\n\n // Mount current directory for output files\n cmd.push('-v', `${cwd}:/workspace`);\n cmd.push('-w', '/workspace');\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Pass through environment variables\n if (options.verbose) {\n cmd.push('-e', 'VERBOSE=true');\n }\n if (options.silent) {\n cmd.push('-e', 'SILENT=true');\n }\n\n // Add the Docker image (CLI tools for bundle/simulate)\n cmd.push(CLI_DOCKER_IMAGE);\n\n // Add the command and arguments\n cmd.push(command, ...args);\n\n return cmd;\n}\n\n/**\n * Execute command in Docker container\n *\n * @param command - CLI command\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Promise that resolves when command completes\n */\nexport async function executeInDocker(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): Promise<void> {\n // Force --local execution inside container to prevent nested Docker attempts\n // Architecture: Host CLI decides environment (Docker vs local),\n // Container CLI always executes locally (no Docker-in-Docker)\n const containerArgs = [...args, '--local'];\n\n const dockerCmd = buildDockerCommand(\n command,\n containerArgs,\n options,\n configFile,\n );\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Docker command exited with code ${code}`));\n }\n });\n });\n}\n\n/**\n * Check if Docker is available\n *\n * @returns Promise resolving to true if Docker is available\n */\nexport async function isDockerAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['--version'], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Check if Docker image exists locally\n *\n * @param image - Docker image name\n * @returns Promise resolving to true if image exists\n */\nexport async function imageExists(\n image: string = CLI_DOCKER_IMAGE,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['image', 'inspect', image], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Build Docker command for run command (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode)\n * @param options - Runtime options\n * @returns Docker command array\n */\nexport function buildDockerRunCommand(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n staticDir?: string;\n } = {},\n): string[] {\n const cwd = process.cwd();\n const cmd = ['docker', 'run', '--rm'];\n\n // Set MODE environment variable\n cmd.push('-e', `MODE=${mode}`);\n\n // Mount flow bundle for collect mode\n if (mode === 'collect' && flowPath) {\n const absoluteFlowPath = path.resolve(cwd, flowPath);\n cmd.push('-v', `${absoluteFlowPath}:/app/flow.mjs:ro`);\n cmd.push('-e', 'FLOW=/app/flow.mjs');\n }\n\n // Port mapping\n if (options.port !== undefined) {\n cmd.push('-p', `${options.port}:${options.port}`);\n cmd.push('-e', `PORT=${options.port}`);\n }\n\n // Host\n if (options.host) {\n cmd.push('-e', `HOST=${options.host}`);\n }\n\n // Static directory for serve mode\n if (mode === 'serve' && options.staticDir) {\n const absoluteStaticDir = path.resolve(cwd, options.staticDir);\n cmd.push('-v', `${absoluteStaticDir}:/app/dist:ro`);\n cmd.push('-e', 'STATIC_DIR=/app/dist');\n }\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Add the runtime Docker image\n cmd.push(RUNTIME_DOCKER_IMAGE);\n\n return cmd;\n}\n\n/**\n * Execute run command in Docker container (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode)\n * @param options - Runtime and global options\n * @returns Promise that resolves when command completes\n */\nexport async function executeRunInDocker(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n staticDir?: string;\n silent?: boolean;\n } = {},\n): Promise<void> {\n const dockerCmd = buildDockerRunCommand(mode, flowPath, options);\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Docker command exited with code ${code}`));\n }\n });\n });\n}\n","/**\n * Execution Mode Handler\n *\n * Determines whether to execute commands locally or in Docker.\n */\n\nimport type { GlobalOptions } from '../types/global';\nimport {\n executeInDocker,\n executeRunInDocker,\n isDockerAvailable,\n} from './docker';\nimport type { Logger } from './logger';\n\n/**\n * Execution mode\n */\nexport type ExecutionMode = 'local' | 'docker';\n\n/**\n * Get execution mode from options\n *\n * @param options - Global options\n * @returns Execution mode\n */\nexport function getExecutionMode(options: GlobalOptions): ExecutionMode {\n return options.local ? 'local' : 'docker';\n}\n\n/**\n * Execute command handler type\n */\nexport type ExecuteHandler = () => Promise<void>;\n\n/**\n * Execute command based on mode\n *\n * @param localHandler - Function to execute locally\n * @param dockerCommand - Docker command name\n * @param dockerArgs - Docker command arguments\n * @param options - Global options\n * @param logger - Logger instance\n * @param configFile - Optional config file path to mount in Docker\n */\nexport async function executeCommand(\n localHandler: ExecuteHandler,\n dockerCommand: string,\n dockerArgs: string[],\n options: GlobalOptions,\n logger?: Logger,\n configFile?: string,\n): Promise<void> {\n const mode = getExecutionMode(options);\n\n // Handle dry-run\n if (options.dryRun) {\n if (mode === 'docker') {\n const cmd = `docker run walkeros/cli:latest ${dockerCommand} ${dockerArgs.join(' ')}`;\n logger?.info(`[DRY-RUN] Would execute: ${cmd}`);\n } else {\n logger?.info(\n `[DRY-RUN] Would execute locally: ${dockerCommand} ${dockerArgs.join(' ')}`,\n );\n }\n return;\n }\n\n // Execute based on mode\n if (mode === 'local') {\n if (logger && !options.silent) {\n logger.info('š„ļø Executing locally...');\n }\n await localHandler();\n } else {\n // Docker mode\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (logger && !options.silent) {\n logger.info('š³ Executing in Docker container...');\n }\n await executeInDocker(dockerCommand, dockerArgs, options, configFile);\n }\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n */\n\nimport type { Setup, EnvironmentConfig } from '../types/bundle';\n\n/**\n * Type guard: Check if value is a plain object.\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Type guard: Validate platform value.\n */\nexport function validatePlatform(\n platform: unknown,\n): platform is 'web' | 'server' {\n return platform === 'web' || platform === 'server';\n}\n\n/**\n * Type guard: Check if config is multi-environment format.\n */\nexport function isMultiEnvConfig(data: unknown): data is Setup {\n return (\n isObject(data) &&\n 'version' in data &&\n data.version === 1 &&\n 'environments' in data &&\n isObject(data.environments)\n );\n}\n\n/**\n * Type guard: Check if config is single-environment format.\n */\nexport function isSingleEnvConfig(data: unknown): data is EnvironmentConfig {\n return (\n isObject(data) &&\n 'flow' in data &&\n 'build' in data &&\n isObject(data.flow) &&\n isObject(data.build) &&\n 'platform' in data.flow &&\n validatePlatform((data.flow as { platform: unknown }).platform)\n );\n}\n\n// Legacy format support removed in v0.3.0\n// See docs/MIGRATION.md for migration guide\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\n\n/**\n * Substitute environment variables in a string.\n *\n * @param value - String with ${VAR} placeholders\n * @returns String with environment variables substituted\n * @throws Error if environment variable is not found\n *\n * @example\n * ```typescript\n * substituteEnvVariables('${HOME}/config') // \"/Users/name/config\"\n * ```\n */\nexport function substituteEnvVariables(value: string): string {\n return value.replace(/\\${([^}]+)}/g, (_, envVar) => {\n const envValue = process.env[envVar];\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} not found`);\n }\n return envValue;\n });\n}\n\n/**\n * Load and parse JSON configuration file.\n *\n * @param configPath - Path to JSON file\n * @returns Parsed configuration object\n * @throws Error if file not found or invalid JSON\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n const absolutePath = path.resolve(configPath);\n\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n\n try {\n const rawConfig = await fs.readJson(absolutePath);\n return rawConfig as T;\n } catch (error) {\n throw new Error(\n `Invalid JSON in config file: ${configPath}. ${error instanceof Error ? error.message : error}`,\n );\n }\n}\n\n/**\n * Generate a unique temporary directory path.\n *\n * @param tempDir - Base temporary directory (default: \".tmp\")\n * @returns Absolute path to unique temp directory\n *\n * @example\n * ```typescript\n * getTempDir() // \"/workspaces/project/.tmp/cli-1647261462000-abc123\"\n * getTempDir('/tmp') // \"/tmp/cli-1647261462000-abc123\"\n * ```\n */\nexport function getTempDir(tempDir = '.tmp'): string {\n const randomId = Math.random().toString(36).substring(2, 11);\n const basePath = path.isAbsolute(tempDir)\n ? tempDir\n : path.join(process.cwd(), tempDir);\n return path.join(basePath, `cli-${Date.now()}-${randomId}`);\n}\n","/**\n * Configuration Defaults\n *\n * Platform-specific default build options.\n */\n\nimport type { BuildOptions } from '../types/bundle';\n\n/**\n * Get default build configuration for platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @param code - User code to include (required for BuildOptions)\n * @param output - Output file path (optional, uses platform default)\n * @returns Platform-specific default build options\n *\n * @remarks\n * Provides sensible defaults for each platform:\n * - web: IIFE format for browser, ES2020 target\n * - server: ESM format for Node.js, Node18 target\n */\nexport function getDefaultBuildOptions(\n platform: 'web' | 'server',\n code: string,\n output?: string,\n): Partial<BuildOptions> {\n const common = {\n code,\n packages: {} as Record<string, { version?: string; imports?: string[] }>,\n minify: false,\n sourcemap: false,\n cache: true,\n };\n\n if (platform === 'web') {\n return {\n ...common,\n platform: 'browser',\n format: 'iife',\n target: 'es2020',\n output: output || './dist/walker.js',\n globalName: 'walkerOS',\n };\n }\n\n return {\n ...common,\n platform: 'node',\n format: 'esm',\n target: 'node18',\n output: output || './dist/bundle.js',\n };\n}\n\n/**\n * Ensure build options have all required fields.\n *\n * @param buildOptions - Build options (possibly incomplete)\n * @param flowPlatform - Platform from Flow.Config\n * @returns Complete build options with defaults filled in\n *\n * @remarks\n * Validates and fills in missing required fields using platform-specific defaults.\n * Throws error if critical fields (code, output) are missing.\n */\nexport function ensureBuildOptions(\n buildOptions: Partial<BuildOptions>,\n flowPlatform: 'web' | 'server',\n): BuildOptions {\n const defaults = getDefaultBuildOptions(\n flowPlatform,\n buildOptions.code || '',\n buildOptions.output,\n );\n\n // Validate required fields\n if (!buildOptions.code && !defaults.code) {\n throw new Error('BuildOptions.code is required');\n }\n if (!buildOptions.output && !defaults.output) {\n throw new Error('BuildOptions.output is required');\n }\n\n return {\n ...defaults,\n ...buildOptions,\n code: buildOptions.code || defaults.code!,\n output: buildOptions.output || defaults.output!,\n packages: buildOptions.packages || defaults.packages!,\n } as BuildOptions;\n}\n","/**\n * Configuration Parser\n *\n * Parsing and normalization logic for configurations.\n */\n\nimport path from 'path';\nimport type { Flow } from '@walkeros/core';\nimport type { BuildOptions, EnvironmentConfig } from '../types/bundle';\nimport { isObject, isSingleEnvConfig } from './validators';\nimport { ensureBuildOptions } from './defaults';\nimport { validatePlatform } from './validators';\n\n/**\n * Result of parsing bundle configuration.\n */\nexport interface ParsedConfig {\n flowConfig: Flow.Config;\n buildOptions: BuildOptions;\n}\n\n/**\n * Parse and normalize bundle configuration.\n *\n * @param data - Raw configuration data (EnvironmentConfig format: { flow, build })\n * @returns Normalized flowConfig and buildOptions with platform-specific defaults\n * @throws Error if validation fails\n *\n * @example\n * ```typescript\n * const { flowConfig, buildOptions } = parseBundleConfig({\n * flow: {\n * platform: 'web',\n * sources: { browser: {...} },\n * destinations: { gtag: {...} }\n * },\n * build: {\n * packages: { '@walkeros/core': {...} },\n * code: '...',\n * output: './dist/bundle.js'\n * }\n * });\n * ```\n */\nexport function parseBundleConfig(data: unknown): ParsedConfig {\n // Basic type checking\n if (!isObject(data)) {\n throw new Error(`Invalid config: expected object, got ${typeof data}`);\n }\n\n // Check for new format { flow, build }\n if (!('flow' in data) || !isObject(data.flow)) {\n throw new Error(\n `Invalid config: missing \"flow\" field. ` +\n `Expected format: { flow: { platform: \"web\" | \"server\", ... }, build: { ... } }`,\n );\n }\n\n if (!('build' in data) || !isObject(data.build)) {\n throw new Error(\n `Invalid config: missing \"build\" field. ` +\n `Expected format: { flow: { platform: \"web\" | \"server\", ... }, build: { ... } }`,\n );\n }\n\n const flowData = data.flow as Record<string, unknown>;\n if (\n !('platform' in flowData) ||\n (flowData.platform !== 'web' && flowData.platform !== 'server')\n ) {\n throw new Error(\n `Invalid config: flow.platform must be \"web\" or \"server\", got \"${flowData.platform}\"`,\n );\n }\n\n // Validate build.packages field\n const buildData = data.build as Record<string, unknown>;\n if ('packages' in buildData && !isObject(buildData.packages)) {\n throw new Error(\n `Invalid config: build.packages must be an object, got ${typeof buildData.packages}`,\n );\n }\n\n const config = data as unknown as EnvironmentConfig;\n return normalizeConfigs(config, '/unknown/path');\n}\n\n/**\n * Safely parse bundle configuration without throwing.\n *\n * @param data - Raw configuration data\n * @returns Success result with normalized configs or error result\n */\nexport function safeParseBundleConfig(data: unknown): {\n success: boolean;\n data?: ParsedConfig;\n error?: Error;\n} {\n try {\n const normalized = parseBundleConfig(data);\n return {\n success: true,\n data: normalized,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n/**\n * Normalize flow and build configurations with platform-specific defaults.\n *\n * @param config - Environment configuration or flow+build object\n * @param configPath - Path to config file (for relative template resolution)\n * @returns Normalized flow and build configurations\n */\nexport function normalizeConfigs(\n config:\n | EnvironmentConfig\n | { flow: Flow.Config; build: Partial<BuildOptions> },\n configPath?: string,\n): { flowConfig: Flow.Config; buildOptions: BuildOptions } {\n const flowConfig = config.flow;\n const platform = (flowConfig as unknown as { platform: 'web' | 'server' })\n .platform;\n\n if (!validatePlatform(platform)) {\n throw new Error(\n `Invalid platform \"${platform}\". Must be \"web\" or \"server\".`,\n );\n }\n\n // Apply platform-specific build defaults\n const buildDefaults: Partial<BuildOptions> =\n platform === 'web'\n ? {\n platform: 'browser',\n format: 'iife',\n target: 'es2020',\n minify: false,\n sourcemap: false,\n tempDir: '.tmp',\n cache: true,\n }\n : {\n platform: 'node',\n format: 'esm',\n target: 'node20',\n minify: false,\n sourcemap: false,\n tempDir: '.tmp',\n cache: true,\n };\n\n // Merge build config\n const buildConfig: Partial<BuildOptions> = {\n ...buildDefaults,\n ...config.build,\n };\n\n // Resolve template path relative to config file directory if it starts with ./ or ../\n if (\n configPath &&\n buildConfig.template &&\n !path.isAbsolute(buildConfig.template)\n ) {\n if (\n buildConfig.template.startsWith('./') ||\n buildConfig.template.startsWith('../')\n ) {\n const configDir = path.dirname(configPath);\n buildConfig.template = path.resolve(configDir, buildConfig.template);\n }\n }\n\n // Ensure all required build fields are present\n const buildOptions = ensureBuildOptions(buildConfig, platform);\n\n return {\n flowConfig,\n buildOptions,\n };\n}\n","/**\n * Configuration Loader\n *\n * Loads and parses configurations with support for:\n * - Single-environment configs\n * - Multi-environment setups\n * - Environment selection\n */\n\nimport type { Flow } from '@walkeros/core';\nimport type { BuildOptions, EnvironmentConfig, Setup } from '../types/bundle';\nimport {\n isMultiEnvConfig,\n isSingleEnvConfig,\n validatePlatform,\n isObject,\n} from './validators';\nimport { normalizeConfigs } from './parser';\n\n/**\n * Result of configuration loading.\n */\nexport interface LoadConfigResult {\n /** Runtime event processing configuration */\n flowConfig: Flow.Config;\n /** Build-time configuration */\n buildOptions: BuildOptions;\n /** Name of the selected environment (or 'default' for single configs) */\n environment: string;\n /** Whether this is a multi-environment setup */\n isMultiEnvironment: boolean;\n /** All available environment names (for multi-environment setups) */\n availableEnvironments?: string[];\n}\n\n/**\n * Options for loading configuration.\n */\nexport interface LoadConfigOptions {\n /** Path to config file */\n configPath: string;\n /** Environment name to load (for multi-environment configs) */\n environment?: string;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * Load and parse bundle configuration.\n *\n * @remarks\n * Automatically detects whether the config is:\n * - New format: { flow: {...}, build: {...} }\n * - Multi-environment format: { version: 1, environments: {...} }\n * - Legacy format: { platform, sources, destinations, packages, ... } (with deprecation warning)\n *\n * For multi-environment configs, requires `environment` option.\n *\n * @param rawConfig - Raw configuration object from JSON file\n * @param options - Loading options\n * @returns Parsed configuration with flow and build separated\n */\nexport function loadBundleConfig(\n rawConfig: unknown,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Check if multi-environment format\n if (isMultiEnvConfig(rawConfig)) {\n return loadMultiEnvironmentConfig(rawConfig, options);\n }\n\n // Check if new single-environment format\n if (isSingleEnvConfig(rawConfig)) {\n return loadSingleEnvironmentConfig(rawConfig, options);\n }\n\n // Invalid format - provide helpful error\n const configType = isObject(rawConfig)\n ? 'platform' in rawConfig\n ? `invalid platform value: \"${(rawConfig as { platform: unknown }).platform}\"`\n : 'missing \"flow\" and \"build\" fields'\n : `not an object (got ${typeof rawConfig})`;\n\n throw new Error(\n `Invalid configuration format at ${options.configPath}.\\n` +\n `Configuration ${configType}.\\n\\n` +\n `Expected either:\\n` +\n ` 1. Multi-environment: { version: 1, environments: { prod: { flow: {...}, build: {...} } } }\\n` +\n ` 2. Single-environment: { flow: { platform: \"web\" | \"server\", ... }, build: { packages: {...}, ... } }`,\n );\n}\n\n/**\n * Load multi-environment configuration.\n */\nfunction loadMultiEnvironmentConfig(\n setup: Setup,\n options: LoadConfigOptions,\n): LoadConfigResult {\n const availableEnvironments = Object.keys(setup.environments);\n\n // Validate environment selection\n if (!options.environment) {\n throw new Error(\n `Multi-environment configuration detected. Please specify an environment using --env flag.\\n` +\n `Available environments: ${availableEnvironments.join(', ')}`,\n );\n }\n\n const selectedEnv = options.environment;\n\n if (!setup.environments[selectedEnv]) {\n throw new Error(\n `Environment \"${selectedEnv}\" not found in configuration.\\n` +\n `Available environments: ${availableEnvironments.join(', ')}`,\n );\n }\n\n // Get the environment config\n const envConfig = setup.environments[selectedEnv];\n\n // Normalize flow and build configs separately\n const { flowConfig, buildOptions } = normalizeConfigs(\n envConfig,\n options.configPath,\n );\n\n if (options.logger) {\n options.logger.info(\n `š¦ Using environment: ${selectedEnv} (${availableEnvironments.length} total)`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n environment: selectedEnv,\n isMultiEnvironment: true,\n availableEnvironments,\n };\n}\n\n/**\n * Load single-environment configuration.\n */\nfunction loadSingleEnvironmentConfig(\n config: EnvironmentConfig,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Normalize the configs\n const { flowConfig, buildOptions } = normalizeConfigs(\n config,\n options.configPath,\n );\n\n if (options.logger && options.environment) {\n options.logger.warn(\n `--env flag specified but configuration is single-environment. Ignoring flag.`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n environment: 'default',\n isMultiEnvironment: false,\n };\n}\n\n// Legacy format support removed in v0.3.0\n// Migration: Convert old format { platform, sources, destinations, packages, code, output }\n// To new format: { flow: { platform, sources, destinations }, build: { packages, code, output } }\n// See docs/MIGRATION.md for details\n\n/**\n * Load all environments from a multi-environment configuration.\n *\n * @remarks\n * Used by the --all flag to build all environments.\n *\n * @param rawConfig - Raw configuration object\n * @param options - Loading options\n * @returns Array of loaded configurations for all environments\n */\nexport function loadAllEnvironments(\n rawConfig: unknown,\n options: Omit<LoadConfigOptions, 'environment'>,\n): LoadConfigResult[] {\n // Must be a multi-environment config\n if (!isMultiEnvConfig(rawConfig)) {\n throw new Error(\n `--all flag requires a multi-environment configuration (Setup format).\\n` +\n `Your configuration appears to be single-environment.`,\n );\n }\n\n const setup = rawConfig;\n const environments = Object.keys(setup.environments);\n\n if (options.logger) {\n options.logger.info(\n `š¦ Loading all ${environments.length} environments: ${environments.join(', ')}`,\n );\n }\n\n // Load each environment\n return environments.map((envName) =>\n loadMultiEnvironmentConfig(setup, {\n ...options,\n environment: envName,\n }),\n );\n}\n\n/**\n * Get list of available environments from configuration.\n *\n * @param rawConfig - Raw configuration object\n * @returns Array of environment names, or empty array for single-environment configs\n */\nexport function getAvailableEnvironments(rawConfig: unknown): string[] {\n if (isMultiEnvConfig(rawConfig)) {\n return Object.keys(rawConfig.environments);\n }\n\n return [];\n}\n","import esbuild from 'esbuild';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../../types/bundle';\nimport type { SourceDestinationItem } from '../../types/template';\nimport { downloadPackages } from './package-manager';\nimport { TemplateEngine } from './template-engine';\nimport type { Logger } from '../../core';\nimport { getTempDir } from '../../config';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string; size: number }[];\n buildTime: number;\n treeshakingEffective: boolean;\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n // Only generate a new temp dir if one isn't explicitly provided\n // This allows simulator to share its temp dir with the bundler\n // Ensure TEMP_DIR is always absolute (esbuild requirement)\n const TEMP_DIR = buildOptions.tempDir\n ? path.isAbsolute(buildOptions.tempDir)\n ? buildOptions.tempDir\n : path.resolve(buildOptions.tempDir)\n : getTempDir();\n\n try {\n // Step 1: Prepare temporary directory\n // Only clean if we created a new temp dir (don't clean shared simulator temp)\n if (!buildOptions.tempDir) {\n await fs.emptyDir(TEMP_DIR);\n }\n logger.debug('Cleaned temporary directory');\n\n // Step 2: Download packages\n logger.info('š„ Downloading packages...');\n // Convert packages object to array format expected by downloadPackages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version: packageConfig.version || 'latest',\n }),\n );\n // downloadPackages adds 'node_modules' subdirectory automatically\n const packagePaths = await downloadPackages(\n packagesArray,\n TEMP_DIR,\n logger,\n buildOptions.cache,\n );\n\n // Fix @walkeros packages to have proper ESM exports\n // This ensures Node resolves to .mjs files instead of .js (CJS)\n for (const [pkgName, pkgPath] of packagePaths.entries()) {\n if (pkgName.startsWith('@walkeros/')) {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n\n // Add exports field to force ESM resolution\n if (!pkgJson.exports && pkgJson.module) {\n pkgJson.exports = {\n '.': {\n import: pkgJson.module,\n require: pkgJson.main,\n },\n };\n await fs.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 });\n }\n }\n }\n\n // Step 3: Create package.json to enable ESM in temp directory\n // This ensures Node treats all .js files as ESM and resolves @walkeros packages correctly\n const packageJsonPath = path.join(TEMP_DIR, 'package.json');\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify({ type: 'module' }, null, 2),\n );\n\n // Step 4: Create entry point\n logger.info('š Creating entry point...');\n const entryContent = await createEntryPoint(\n flowConfig,\n buildOptions,\n packagePaths,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, entryContent);\n\n // Step 4: Bundle with esbuild\n logger.info('ā” Bundling with esbuild...');\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions = createEsbuildOptions(\n buildOptions,\n entryPath,\n outputPath,\n TEMP_DIR,\n packagePaths,\n logger,\n );\n\n try {\n await esbuild.build(esbuildOptions);\n } catch (buildError) {\n // Enhanced error handling for build failures\n throw createBuildError(buildError as EsbuildError, buildOptions.code);\n }\n\n logger.gray(`Output: ${outputPath}`);\n\n // Step 5: Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n entryContent,\n );\n }\n\n // Step 6: Cleanup\n // Only cleanup if we created our own temp dir (not shared with simulator)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR);\n logger.debug('Cleaned up temporary files');\n }\n\n return stats;\n } catch (error) {\n // Cleanup on error (only if we created our own temp dir)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR).catch(() => {});\n }\n throw error;\n }\n}\n\nasync function collectBundleStats(\n outputPath: string,\n packages: BuildOptions['packages'],\n startTime: number,\n entryContent: string,\n): Promise<BundleStats> {\n const stats = await fs.stat(outputPath);\n const totalSize = stats.size;\n const buildTime = Date.now() - startTime;\n\n // Estimate package sizes by analyzing imports in entry content\n const packageStats = Object.entries(packages).map(([name, pkg]) => {\n const importPattern = new RegExp(`from\\\\s+['\"]${name}['\"]`, 'g');\n const namedImportPattern = new RegExp(\n `import\\\\s+\\\\{[^}]*\\\\}\\\\s+from\\\\s+['\"]${name}['\"]`,\n 'g',\n );\n const hasImports =\n importPattern.test(entryContent) || namedImportPattern.test(entryContent);\n\n // Rough estimation: if package is imported, assign proportional size\n const packagesCount = Object.keys(packages).length;\n const estimatedSize = hasImports\n ? Math.floor(totalSize / packagesCount)\n : 0;\n\n return {\n name: `${name}@${pkg.version || 'latest'}`,\n size: estimatedSize,\n };\n });\n\n // Tree-shaking is effective if we use named imports (not wildcard imports)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(entryContent);\n const treeshakingEffective = !hasWildcardImports;\n\n return {\n totalSize,\n packages: packageStats,\n buildTime,\n treeshakingEffective,\n };\n}\n\nfunction createEsbuildOptions(\n buildOptions: BuildOptions,\n entryPath: string,\n outputPath: string,\n tempDir: string,\n packagePaths: Map<string, string>,\n logger: Logger,\n): esbuild.BuildOptions {\n // Don't use aliases - they cause esbuild to bundle even external packages\n // Instead, use absWorkingDir to point to temp directory where node_modules is\n const alias: Record<string, string> = {};\n\n const baseOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: buildOptions.format as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed\n baseOptions.external = buildOptions.external || [];\n } else if (buildOptions.platform === 'node') {\n // For Node.js bundles, mark Node built-ins as external\n const nodeBuiltins = [\n 'crypto',\n 'fs',\n 'path',\n 'os',\n 'util',\n 'stream',\n 'buffer',\n 'events',\n 'http',\n 'https',\n 'url',\n 'querystring',\n 'zlib',\n ];\n // Mark runtime dependencies as external\n // These packages are installed in the Docker container and should not be bundled\n // - express/cors: Runtime dependencies for server sources\n // Note: zod is bundled inline via @walkeros/core (not marked external)\n // Use wildcard patterns to match both ESM and CJS imports\n const npmPackages = ['express', 'express/*', 'cors', 'cors/*'];\n // All downloaded @walkeros packages will be bundled into the output\n // Only Node.js built-ins and runtime server packages (express/cors) are marked external\n baseOptions.external = buildOptions.external\n ? [...nodeBuiltins, ...npmPackages, ...buildOptions.external]\n : [...nodeBuiltins, ...npmPackages];\n }\n\n // Set target if specified\n if (buildOptions.target) {\n baseOptions.target = buildOptions.target;\n } else if (buildOptions.platform === 'node') {\n baseOptions.target = 'node18';\n } else {\n baseOptions.target = 'es2018';\n }\n\n // Set global name for IIFE format\n if (buildOptions.globalName && buildOptions.format === 'iife') {\n baseOptions.globalName = buildOptions.globalName;\n }\n\n return baseOptions;\n}\n\n// Helper function to convert package name to JS variable name\nfunction packageNameToVariable(packageName: string): string {\n return packageName\n .replace('@', '_')\n .replace(/[/-]/g, '_')\n .split('_')\n .map((part, i) =>\n i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n )\n .join('');\n}\n\nasync function createEntryPoint(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<string> {\n // Generate import statements from packages\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n\n // For simulation mode, automatically import examples from destination packages\n // This ensures examples are loaded in the SAME execution context as the bundle\n // preventing zod double-loading issues\n const destinationPackages = new Set<string>();\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string'\n ) {\n destinationPackages.add(destConfig.package);\n }\n // If no package field, skip auto-importing examples for this destination\n }\n }\n\n for (const [packageName, packageConfig] of Object.entries(\n buildOptions.packages,\n )) {\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n // Remove duplicates within the same package\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n const defaultImports: string[] = [];\n const namedImports: string[] = [];\n\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n defaultImports.push(imp.replace('default as ', ''));\n } else {\n namedImports.push(imp);\n }\n }\n\n // Generate import statements\n if (defaultImports.length > 0) {\n for (const defaultImport of defaultImports) {\n importStatements.push(\n `import ${defaultImport} from '${packageName}';`,\n );\n }\n }\n\n if (namedImports.length > 0) {\n const importList = namedImports.join(', ');\n importStatements.push(\n `import { ${importList} } from '${packageName}';`,\n );\n }\n\n // Check if this package imports examples and create mappings\n const examplesImport = uniqueImports.find((imp) =>\n imp.includes('examples as '),\n );\n if (examplesImport) {\n // Extract destination name and examples variable name\n // Format: \"examples as gtagExamples\" -> gtagExamples\n const examplesVarName = examplesImport.split(' as ')[1];\n // Get destination name from package (assumes @walkeros/web-destination-xxx format)\n const destinationMatch = packageName.match(\n /@walkeros\\/web-destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n examplesMappings.push(\n ` ${destinationName}: typeof ${examplesVarName} !== 'undefined' ? ${examplesVarName} : undefined`,\n );\n }\n }\n } else {\n // No imports specified - import as namespace with a warning comment\n // User should specify explicit imports for better tree-shaking\n const varName = packageNameToVariable(packageName);\n importStatements.push(\n `import * as ${varName} from '${packageName}'; // Consider specifying explicit imports`,\n );\n }\n\n // Auto-import examples for destination packages\n if (destinationPackages.has(packageName)) {\n const destinationMatch = packageName.match(\n /@walkeros\\/(?:(?:web|server)-)?destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n const examplesVarName = `${destinationName.replace(/-/g, '_')}_examples`;\n // Try importing from /examples subpath first (standard packages)\n // Fall back to importing { examples } from main module (demo packages)\n const isDemoPackage = packageName.includes('-demo');\n if (isDemoPackage) {\n importStatements.push(\n `import { examples as ${examplesVarName} } from '${packageName}';`,\n );\n } else {\n importStatements.push(\n `import * as ${examplesVarName} from '${packageName}/examples';`,\n );\n }\n examplesMappings.push(` ${destinationName}: ${examplesVarName}`);\n }\n }\n }\n\n // Create examples object if we have any mappings\n const examplesObject =\n examplesMappings.length > 0\n ? `const examples = {\\n${examplesMappings.join(',\\n')}\\n};\\n\\n`\n : '';\n\n // Separate imports from template processing\n const importsCode = importStatements.join('\\n');\n\n // Apply template if configured, otherwise just use code directly\n let templatedCode: string;\n if (buildOptions.template) {\n const templateEngine = new TemplateEngine();\n const flowWithProps = flowConfig as unknown as {\n sources?: Record<string, unknown>;\n destinations?: Record<string, unknown>;\n collector?: Record<string, unknown>;\n };\n templatedCode = await templateEngine.process(\n buildOptions.template,\n buildOptions.code, // Pass user code as parameter\n (flowWithProps.sources || {}) as unknown as Record<\n string,\n SourceDestinationItem\n >,\n (flowWithProps.destinations || {}) as unknown as Record<\n string,\n SourceDestinationItem\n >,\n (flowWithProps.collector || {}) as unknown as Record<string, unknown>,\n buildOptions as unknown as Record<string, unknown>, // Pass build config to template\n );\n } else {\n // No template - just use the code directly\n templatedCode = buildOptions.code;\n }\n\n // Apply module format wrapping if needed\n let wrappedCode = templatedCode;\n\n // Check if code already has any export statements (default, named, etc.)\n const hasExport = /^\\s*export\\s/m.test(templatedCode);\n\n if (!hasExport) {\n if (buildOptions.format === 'esm') {\n // Export as default for ESM\n wrappedCode = `export default ${templatedCode}`;\n } else if (buildOptions.platform === 'browser' && buildOptions.globalName) {\n // Assign to window for browser builds with globalName\n wrappedCode = `window['${buildOptions.globalName}'] = ${templatedCode}`;\n }\n }\n\n // Combine imports, examples object, and wrapped code\n let finalCode = importsCode\n ? `${importsCode}\\n\\n${examplesObject}${wrappedCode}`\n : `${examplesObject}${wrappedCode}`;\n\n // If we have examples, export them as a named export\n if (examplesObject && buildOptions.format === 'esm') {\n finalCode += `\\n\\nexport { examples };`;\n }\n\n return finalCode;\n}\n\ninterface EsbuildError {\n errors?: Array<{\n text: string;\n location?: {\n file: string;\n line: number;\n column: number;\n };\n }>;\n message?: string;\n}\n\nfunction createBuildError(buildError: EsbuildError, code: string): Error {\n if (!buildError.errors || buildError.errors.length === 0) {\n return new Error(`Build failed: ${buildError.message || buildError}`);\n }\n\n const firstError = buildError.errors[0];\n const location = firstError.location;\n\n if (location && location.file && location.file.includes('entry.js')) {\n // Error is in our generated entry point (code)\n const line = location.line;\n const column = location.column;\n const codeLines = code.split('\\n');\n const errorLine = codeLines[line - 1] || '';\n\n return new Error(\n `Code syntax error at line ${line}, column ${column}:\\n` +\n ` ${errorLine}\\n` +\n ` ${' '.repeat(column - 1)}^\\n` +\n `${firstError.text}`,\n );\n }\n\n // Error is in package code or other build issue\n return new Error(\n `Build error: ${firstError.text}\\n` +\n (location\n ? ` at ${location.file}:${location.line}:${location.column}`\n : ''),\n );\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { Logger } from '../../core';\n\nexport interface Package {\n name: string;\n version: string;\n}\n\n/**\n * Gets the proper node_modules directory path for a package.\n * Creates standard npm structure: node_modules/@scope/package or node_modules/package\n * Supports multiple versions by appending version to non-scoped packages if needed.\n *\n * @example\n * getPackageDirectory('node_modules', '@walkeros/core', '0.2.0')\n * // ā 'node_modules/@walkeros/core'\n *\n * getPackageDirectory('node_modules', 'lodash', '4.17.21')\n * // ā 'node_modules/lodash'\n */\nfunction getPackageDirectory(\n baseDir: string,\n packageName: string,\n version: string,\n): string {\n // For scoped packages like @walkeros/core, preserve the scope structure\n // This creates: node_modules/@walkeros/core (standard npm structure)\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nfunction getCachedPackagePath(pkg: Package, tempDir: string): string {\n const cacheDir = path.join('.tmp', 'cache', 'packages');\n // Use safe file system name for cache (replace / with -)\n const safeName = pkg.name.replace(/\\//g, '-').replace(/@/g, '');\n return path.join(cacheDir, `${safeName}-${pkg.version}`);\n}\n\nasync function isPackageCached(\n pkg: Package,\n tempDir: string,\n): Promise<boolean> {\n const cachedPath = getCachedPackagePath(pkg, tempDir);\n return fs.pathExists(cachedPath);\n}\n\nfunction validateNoDuplicatePackages(packages: Package[]): void {\n const packageMap = new Map<string, string[]>();\n\n // Group packages by name and collect their versions\n for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, []);\n }\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\n // Check for duplicate packages with different versions\n const conflicts: string[] = [];\n for (const [name, versions] of packageMap.entries()) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length > 1) {\n conflicts.push(`${name}: [${uniqueVersions.join(', ')}]`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(\n `Version conflicts detected:\\n${conflicts.map((c) => ` - ${c}`).join('\\n')}\\n\\n` +\n 'Each package must use the same version across all declarations. ' +\n 'Please update your configuration to use consistent versions.',\n );\n }\n}\n\n/**\n * Recursively resolve and download package dependencies\n */\nasync function resolveDependencies(\n pkg: Package,\n packageDir: string,\n logger: Logger,\n visited: Set<string> = new Set(),\n): Promise<Package[]> {\n const dependencies: Package[] = [];\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (visited.has(pkgKey)) {\n return dependencies;\n }\n visited.add(pkgKey);\n\n try {\n const packageJsonPath = path.join(packageDir, 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath);\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.peerDependencies,\n };\n\n for (const [name, versionSpec] of Object.entries(deps)) {\n if (typeof versionSpec === 'string') {\n // Use the version spec as-is (pacote will resolve it)\n // This respects the package.json dependency requirements\n dependencies.push({ name, version: versionSpec });\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to read dependencies for ${pkgKey}: ${error}`);\n }\n\n return dependencies;\n}\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger,\n useCache = true,\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n const downloadQueue: Package[] = [...packages];\n const processed = new Set<string>();\n\n // Validate no duplicate packages with different versions in initial list\n validateNoDuplicatePackages(packages);\n\n // Ensure target directory exists\n await fs.ensureDir(targetDir);\n\n while (downloadQueue.length > 0) {\n const pkg = downloadQueue.shift()!;\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (processed.has(pkgKey)) {\n continue;\n }\n processed.add(pkgKey);\n const packageSpec = `${pkg.name}@${pkg.version}`;\n // Use proper node_modules structure: node_modules/@scope/package\n const packageDir = getPackageDirectory(targetDir, pkg.name, pkg.version);\n const cachedPath = getCachedPackagePath(pkg, targetDir);\n\n if (useCache && (await isPackageCached(pkg, targetDir))) {\n logger.debug(`Using cached ${packageSpec}...`);\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies for cached package too\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n } catch (error) {\n logger.debug(\n `Failed to use cache for ${packageSpec}, downloading fresh: ${error}`,\n );\n }\n }\n\n logger.debug(`Downloading ${packageSpec}...`);\n\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n\n // Extract package to proper node_modules structure\n // Use environment variable for cache location (Docker-friendly)\n const cacheDir =\n process.env.NPM_CACHE_DIR || path.join(process.cwd(), '.npm-cache');\n await pacote.extract(packageSpec, packageDir, {\n // Force npm registry download, prevent workspace resolution\n registry: 'https://registry.npmjs.org',\n\n // Force online fetching from registry (don't use cached workspace packages)\n preferOnline: true,\n\n // Cache for performance\n cache: cacheDir,\n\n // Don't resolve relative to workspace context\n where: undefined,\n });\n\n // Cache the downloaded package for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n logger.debug(`Cached ${packageSpec} for future use`);\n } catch (cacheError) {\n logger.debug(`Failed to cache ${packageSpec}: ${cacheError}`);\n }\n }\n\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport Handlebars from 'handlebars';\nimport type { SourceDestinationItem } from '../../types/template';\nimport { processTemplateVariables } from './serializer';\n\nexport class TemplateEngine {\n private handlebars: typeof Handlebars;\n\n constructor() {\n // Create a new Handlebars instance\n this.handlebars = Handlebars.create();\n }\n\n /**\n * Load template content from file path\n */\n async loadTemplate(templatePath: string): Promise<string> {\n const resolvedPath = path.resolve(templatePath);\n\n if (!(await fs.pathExists(resolvedPath))) {\n throw new Error(`Template file not found: ${resolvedPath}`);\n }\n\n return await fs.readFile(resolvedPath, 'utf-8');\n }\n\n /**\n * Apply template with user code and variable substitution\n */\n applyTemplate(\n template: string,\n userCode: string,\n sources: Record<string, SourceDestinationItem>,\n destinations: Record<string, SourceDestinationItem>,\n collector: Record<string, unknown>,\n build?: Record<string, unknown>,\n ): string {\n // Process template variables to serialize config objects\n const processedVariables = processTemplateVariables({\n sources,\n destinations,\n collector,\n });\n\n // Prepare template data for Handlebars\n const templateData: Record<string, unknown> = {\n CODE: userCode,\n build: build || {},\n ...processedVariables,\n };\n\n // Compile and execute the template\n const compiledTemplate = this.handlebars.compile(template);\n return compiledTemplate(templateData);\n }\n\n /**\n * Process template with user code\n */\n async process(\n templatePath: string,\n userCode: string,\n sources: Record<string, SourceDestinationItem>,\n destinations: Record<string, SourceDestinationItem>,\n collector: Record<string, unknown>,\n build?: Record<string, unknown>,\n ): Promise<string> {\n const template = await this.loadTemplate(templatePath);\n return this.applyTemplate(\n template,\n userCode,\n sources,\n destinations,\n collector,\n build,\n );\n }\n}\n","/**\n * JSON to JavaScript serializer for config objects\n * Converts JSON objects to valid JavaScript code for use in templates\n */\n\nimport { isObject } from '../../config';\nimport type {\n TemplateSource,\n TemplateDestination,\n ProcessedTemplateVariables,\n} from '../../types/template';\n\nexport interface SerializerOptions {\n indent?: number;\n singleQuotes?: boolean;\n}\n\n/**\n * Serialize a value to JavaScript code\n */\nexport function serializeToJS(\n value: unknown,\n options: SerializerOptions = {},\n): string {\n const { indent = 2, singleQuotes = false } = options;\n const quote = singleQuotes ? \"'\" : '\"';\n\n function serialize(val: unknown, currentIndent = 0): string {\n if (val === null) return 'null';\n if (val === undefined) return 'undefined';\n\n if (typeof val === 'boolean' || typeof val === 'number') {\n return String(val);\n }\n\n if (typeof val === 'string') {\n // Check if string contains arrow function syntax\n if (val.includes('=>')) {\n // More comprehensive check for arrow function patterns\n const arrowPatterns = [\n /^\\s*\\([^)]*\\)\\s*=>/, // (param) => or () =>\n /^\\s*\\w+\\s*=>/, // param =>\n /^\\s*\\([^)]*\\)\\s*=>\\s*\\{/, // (param) => {\n /^\\s*\\w+\\s*=>\\s*\\{/, // param => {\n ];\n\n if (arrowPatterns.some((pattern) => pattern.test(val))) {\n // Likely a function - return as-is without quotes\n return val;\n }\n }\n // Regular string - escape and quote\n return (\n quote +\n val.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"') +\n quote\n );\n }\n\n if (Array.isArray(val)) {\n if (val.length === 0) return '[]';\n\n const nextIndent = currentIndent + indent;\n const spacing = ' '.repeat(nextIndent);\n const items = val\n .map((item) => spacing + serialize(item, nextIndent))\n .join(',\\n');\n\n return `[\\n${items}\\n${' '.repeat(currentIndent)}]`;\n }\n\n if (isObject(val)) {\n const entries = Object.entries(val);\n if (entries.length === 0) return '{}';\n\n const nextIndent = currentIndent + indent;\n const spacing = ' '.repeat(nextIndent);\n\n const props = entries\n .map(([key, value]) => {\n // Check if key needs quotes (contains special characters or starts with number)\n const needsQuotes = /[^a-zA-Z0-9_$]/.test(key) || /^[0-9]/.test(key);\n const keyStr = needsQuotes ? quote + key + quote : key;\n\n return spacing + keyStr + ': ' + serialize(value, nextIndent);\n })\n .join(',\\n');\n\n return `{\\n${props}\\n${' '.repeat(currentIndent)}}`;\n }\n\n // Fallback for other types\n return String(val);\n }\n\n return serialize(value);\n}\n\n/**\n * Serialize config object for template usage\n * Handles special cases for walkerOS configurations\n */\nexport function serializeConfig(config: Record<string, unknown>): string {\n // Handle empty config\n if (!config || Object.keys(config).length === 0) {\n return '{}';\n }\n\n return serializeToJS(config, { indent: 2, singleQuotes: true });\n}\n\n/**\n * Process template variables to serialize config objects\n */\nexport function processTemplateVariables(\n variables: Record<string, unknown>,\n): ProcessedTemplateVariables {\n const processed = { ...variables };\n\n // Process sources object\n if (isObject(processed.sources)) {\n const sourcesObj = processed.sources as Record<string, unknown>;\n const processedSources: Record<string, TemplateSource> = {};\n\n for (const [name, source] of Object.entries(sourcesObj)) {\n const typedSource = source as TemplateSource;\n const { env: _, ...sourceWithoutEnv } = typedSource;\n processedSources[name] = {\n ...sourceWithoutEnv,\n config: isObject(typedSource.config)\n ? serializeConfig(typedSource.config)\n : typedSource.config, // Pass through string configs unchanged\n ...(typedSource.env !== undefined && { env: typedSource.env }),\n };\n }\n\n processed.sources = processedSources;\n }\n\n // Process destinations object\n if (isObject(processed.destinations)) {\n const destinationsObj = processed.destinations as Record<string, unknown>;\n const processedDestinations: Record<string, TemplateDestination> = {};\n\n for (const [name, dest] of Object.entries(destinationsObj)) {\n const typedDest = dest as TemplateDestination;\n const { env: _, ...destWithoutEnv } = typedDest;\n processedDestinations[name] = {\n ...destWithoutEnv,\n config: isObject(typedDest.config)\n ? serializeConfig(typedDest.config)\n : typedDest.config,\n ...(typedDest.env !== undefined && { env: typedDest.env }),\n };\n }\n\n processed.destinations = processedDestinations;\n }\n\n // Process collector object (if present)\n if (isObject(processed.collector)) {\n processed.collector = serializeConfig(\n processed.collector as Record<string, unknown>,\n );\n }\n\n return processed;\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core';\nimport type { BundleStats } from './bundler';\nimport type { Logger } from '../../core';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(stats: BundleStats, logger: Logger): void {\n logger.info('\\nš Bundle Statistics');\n logger.info('ā'.repeat(50));\n\n // Total size\n const sizeKB = formatBytes(stats.totalSize);\n logger.info(`Total Size: ${sizeKB} KB`);\n\n // Build time\n const timeSeconds = (stats.buildTime / 1000).toFixed(2);\n logger.info(`Build Time: ${timeSeconds}s`);\n\n // Tree-shaking effectiveness\n const treeshakingStatus = stats.treeshakingEffective\n ? 'ā
Effective'\n : 'ā ļø Not optimal (consider using named imports)';\n logger.info(`Tree-shaking: ${treeshakingStatus}`);\n\n // Package breakdown\n if (stats.packages.length > 0) {\n logger.info(`\\nPackage Breakdown:`);\n stats.packages.forEach((pkg) => {\n if (pkg.size > 0) {\n const pkgSizeKB = formatBytes(pkg.size);\n logger.info(` ⢠${pkg.name}: ${pkgSizeKB} KB`);\n }\n });\n }\n\n logger.info('ā'.repeat(50));\n}\n\n/**\n * Create stats summary for JSON output\n */\nexport function createStatsSummary(stats: BundleStats) {\n return {\n totalSize: stats.totalSize,\n totalSizeFormatted: `${formatBytes(stats.totalSize)} KB`,\n buildTime: stats.buildTime,\n buildTimeFormatted: `${(stats.buildTime / 1000).toFixed(2)}s`,\n treeshakingEffective: stats.treeshakingEffective,\n packageCount: stats.packages.length,\n packages: stats.packages.map((pkg) => ({\n name: pkg.name,\n size: pkg.size,\n sizeFormatted: `${formatBytes(pkg.size)} KB`,\n })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { createLogger } from '../../core';\nimport {\n loadJsonConfig,\n getTempDir,\n isObject,\n parseBundleConfig,\n type BuildOptions,\n} from '../../config';\nimport { bundleCore } from '../bundle/bundler';\nimport { downloadPackages } from '../bundle/package-manager';\nimport { CallTracker } from './tracker';\nimport type { SimulateCommandOptions, SimulationResult } from './types';\n\n/**\n * Generate a unique ID for temp files\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n configPath: string,\n event: unknown,\n options: Pick<SimulateCommandOptions, 'json' | 'verbose' | 'silent'> = {},\n): Promise<SimulationResult> {\n const logger = createLogger({\n verbose: options.verbose || false,\n silent: options.silent || false,\n json: options.json || false,\n });\n\n try {\n logger.info('šÆ Starting walkerOS simulation...');\n\n // Load and validate configuration\n logger.info('š¦ Loading bundle configuration...');\n const fullConfigPath = path.resolve(configPath);\n const rawConfig = await loadJsonConfig(fullConfigPath);\n parseBundleConfig(rawConfig); // Validate config format\n\n // Execute simulation\n logger.info(`š Executing simulation with event: ${JSON.stringify(event)}`);\n const result = await executeSimulation(event, fullConfigPath);\n\n // Report results\n if (result.success) {\n logger.info(`ā
Simulation completed successfully`);\n } else {\n logger.error(`ā Simulation failed: ${result.error}`);\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`š„ Simulation error: ${errorMessage}`);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Parse event input - handles both strings and JSON objects\n */\nexport function parseEventInput(eventString: string = ''): unknown {\n if (!eventString) {\n return {};\n }\n\n // Try to parse as JSON first\n try {\n const parsed = JSON.parse(eventString);\n return isObject(parsed) ? parsed : {};\n } catch {\n // If JSON parsing fails, treat as event name string\n return { name: eventString };\n }\n}\n\n/**\n * Simple result formatting\n */\nexport function formatSimulationResult(\n result: SimulationResult,\n options: Pick<SimulateCommandOptions, 'json'> = {},\n): string {\n if (options.json) {\n const output = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n return JSON.stringify(output, null, 2);\n }\n\n if (result.success) {\n return 'ā
Simulation completed successfully';\n } else {\n return `ā Simulation failed: ${result.error}`;\n }\n}\n\n/**\n * Execute simulation using destination-provided mock environments\n */\nexport async function executeSimulation(\n event: unknown,\n configPath: string,\n): Promise<SimulationResult> {\n const startTime = Date.now();\n let bundlePath: string | undefined;\n const tempDir = getTempDir();\n\n try {\n // Ensure temp directory exists\n await fs.ensureDir(tempDir);\n\n // 1. Load config\n const rawConfig = await loadJsonConfig(configPath);\n const { flowConfig, buildOptions } = parseBundleConfig(rawConfig);\n\n // 2. Download packages to temp directory\n // This ensures we use clean npm packages, not workspace packages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version:\n (typeof packageConfig === 'object' &&\n packageConfig !== null &&\n 'version' in packageConfig &&\n typeof packageConfig.version === 'string'\n ? packageConfig.version\n : undefined) || 'latest',\n }),\n );\n const packagePaths = await downloadPackages(\n packagesArray,\n tempDir, // downloadPackages will add 'node_modules' subdirectory itself\n createLogger({ silent: true }),\n buildOptions.cache,\n );\n\n // 3. Create tracker\n const tracker = new CallTracker();\n\n // 4. Prepare env setup code to inject into bundle\n // The bundle will import examples, so we can reference them directly in the injected code\n const envSetupCode: string[] = [];\n\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n if (destinations) {\n for (const [key, dest] of Object.entries(destinations)) {\n // Generate code to wrap env using examples imported IN THE BUNDLE\n const destName = key.replace(/-/g, '_');\n envSetupCode.push(`\n // Inject tracked env for destination '${key}' using examples from bundle\n if (examples && examples['${key}'] && examples['${key}'].env) {\n const mockEnv = examples['${key}'].env.push;\n const trackPaths = examples['${key}'].env.simulation || [];\n if (mockEnv) {\n const wrappedPaths = trackPaths.map((p) => '${key}:' + p);\n const trackedEnv = __simulationTracker.wrapEnv(mockEnv, wrappedPaths);\n if (config.destinations && config.destinations['${key}']) {\n config.destinations['${key}'].env = trackedEnv;\n }\n }\n }\n`);\n }\n }\n\n // 5. Inject env setup code BEFORE startFlow\n // Note: __simulationTracker will be provided via factory function parameter\n const modifiedCode = `\n// Inject tracked envs into destination configs\n${envSetupCode.join('\\n')}\n\n${buildOptions.code || ''}\n`;\n\n // 7. Create temporary bundle with downloaded packages\n const tempOutput = path.join(\n tempDir,\n `simulation-bundle-${generateId()}.mjs`,\n );\n\n // Create modified build options for simulation\n const simulationBuildOptions: BuildOptions = {\n ...buildOptions,\n code: modifiedCode,\n output: tempOutput,\n tempDir, // Use same temp dir for bundle\n format: 'esm' as const,\n // Force node platform for simulation since we're running in Node.js\n platform: 'node' as const,\n };\n\n // 8. Bundle with downloaded packages (they're already in tempDir/node_modules)\n await bundleCore(\n flowConfig,\n simulationBuildOptions,\n createLogger({ silent: true }),\n false,\n );\n bundlePath = tempOutput;\n\n // 9. Inject minimal globals for Node simulation environment\n // This allows destinations to reference window/document without errors\n const globalWithSim = globalThis as Record<string, unknown>;\n if (!globalWithSim.window) {\n globalWithSim.window = {};\n }\n if (!globalWithSim.document) {\n globalWithSim.document = {};\n }\n\n // 10. Dynamic import the bundle\n const timestamp = Date.now();\n const moduleUrl = `file://${bundlePath}?t=${timestamp}`;\n const module = await import(moduleUrl);\n\n // 11. Populate globals with destination-specific mocks from examples\n // This happens AFTER import so we can access the exported examples\n const importedExamples = module.examples;\n const destinations2 = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n if (importedExamples && destinations2) {\n for (const [key, dest] of Object.entries(destinations2)) {\n const destEnv = importedExamples[key]?.env?.push;\n if (destEnv) {\n if (\n destEnv.window &&\n typeof globalWithSim.window === 'object' &&\n globalWithSim.window !== null\n ) {\n Object.assign(globalWithSim.window, destEnv.window);\n }\n if (\n destEnv.document &&\n typeof globalWithSim.document === 'object' &&\n globalWithSim.document !== null\n ) {\n Object.assign(globalWithSim.document, destEnv.document);\n }\n }\n }\n }\n\n // 12. Call bundle factory function with tracker\n const flowResult = await module.default({ tracker });\n if (!flowResult || typeof flowResult.elb !== 'function') {\n throw new Error(\n 'Bundle did not export valid flow object with elb function',\n );\n }\n\n const { elb } = flowResult;\n\n // 13. Execute the event\n const elbResult = await elb(event);\n\n // 14. Retrieve tracked calls from tracker instance\n const usage = tracker.getCalls();\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult,\n usage,\n duration,\n logs: [],\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n duration,\n };\n } finally {\n // Cleanup temp directory and all its contents\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors - temp dirs will be cleaned eventually\n });\n }\n\n // Cleanup injected globals\n const globalWithSim = globalThis as Record<string, unknown>;\n delete globalWithSim.window;\n delete globalWithSim.document;\n }\n}\n","/**\n * Call Tracker for Simulation\n *\n * Wraps mock environment functions to track API calls.\n * Used with destination-provided examples/env.ts mocks.\n */\n\nexport interface ApiCall {\n type: 'call';\n path: string;\n args: unknown[];\n timestamp: number;\n}\n\nexport class CallTracker {\n private calls: Map<string, ApiCall[]> = new Map();\n\n /**\n * Wrap a function to track its calls\n */\n wrapFunction(\n name: string,\n fn?: (...args: unknown[]) => unknown,\n ): (...args: unknown[]) => unknown {\n const self = this;\n const targetFn = fn || (() => {});\n\n return new Proxy(targetFn, {\n apply(_target, thisArg, args: unknown[]) {\n self.logCall(name, args);\n return targetFn.apply(thisArg, args);\n },\n });\n }\n\n /**\n * Wrap an environment object, tracking specified paths\n *\n * @param env - Environment object (from destination's examples/env.ts)\n * @param paths - Paths to track (e.g., ['gtag:window.gtag', 'gtag:window.dataLayer.push'])\n */\n wrapEnv<T extends Record<string, unknown>>(env: T, paths: string[]): T {\n const wrapped: Record<string, unknown> = {};\n\n // Deep clone the env object first\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'object' && value !== null) {\n wrapped[key] = Array.isArray(value)\n ? [...value]\n : { ...(value as Record<string, unknown>) };\n } else {\n wrapped[key] = value;\n }\n }\n\n // Wrap specified paths\n for (const fullPath of paths) {\n // Parse path: \"gtag:window.gtag\" ā destKey=\"gtag\", path=\"window.gtag\"\n const [destKey, ...pathParts] = fullPath.split(':');\n const path = pathParts.join(':');\n\n if (!path) continue;\n\n // Remove \"call:\" prefix if present (from simulation array)\n const cleanPath = path.replace(/^call:/, '');\n const parts = cleanPath.split('.');\n\n let current: Record<string, unknown> = wrapped;\n let source: Record<string, unknown> | undefined = env;\n\n // Navigate to parent object\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n if (!current[part]) {\n current[part] = {};\n }\n\n current = current[part] as Record<string, unknown>;\n source =\n source && typeof source[part] === 'object' && source[part] !== null\n ? (source[part] as Record<string, unknown>)\n : undefined;\n }\n\n // Wrap the final property\n const finalKey = parts[parts.length - 1];\n const originalFn = source?.[finalKey];\n\n // Wrap with full path for tracking\n current[finalKey] = this.wrapFunction(\n `${destKey}:${cleanPath}`,\n typeof originalFn === 'function'\n ? (originalFn as (...args: unknown[]) => unknown)\n : undefined,\n );\n }\n\n return wrapped as T;\n }\n\n private logCall(fullPath: string, args: unknown[]): void {\n // Parse \"destKey:api.path\" ā destKey and apiPath\n const [destKey, ...pathParts] = fullPath.split(':');\n const apiPath = pathParts.join(':');\n\n if (!this.calls.has(destKey)) {\n this.calls.set(destKey, []);\n }\n\n this.calls.get(destKey)!.push({\n type: 'call',\n path: apiPath,\n args,\n timestamp: Date.now(),\n });\n }\n\n getCalls(): Record<string, ApiCall[]> {\n return Object.fromEntries(this.calls);\n }\n\n reset(): void {\n this.calls.clear();\n }\n}\n","import {\n simulateCore,\n parseEventInput,\n formatSimulationResult,\n} from './simulator';\nimport { createLogger, executeCommand } from '../../core';\nimport type { SimulateCommandOptions } from './types';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n\n // Build Docker args - file path as first positional arg\n const dockerArgs = [options.config];\n if (options.event) dockerArgs.push('--event', options.event);\n if (options.json) dockerArgs.push('--json');\n if (options.verbose) dockerArgs.push('--verbose');\n if (options.silent) dockerArgs.push('--silent');\n\n await executeCommand(\n async () => {\n const startTime = Date.now();\n\n try {\n // Parse event input\n const event = parseEventInput(options.event);\n\n // Execute simulation\n const result = await simulateCore(options.config, event, {\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n\n // Add duration to result\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n };\n\n // Output results - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const output = formatSimulationResult(resultWithDuration, {\n json: options.json,\n });\n outputLogger.log('white', output);\n\n // Exit with error code if simulation failed\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n // JSON error output - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n },\n null,\n 2,\n );\n outputLogger.log('white', errorOutput);\n } else {\n // Error output - create error logger that always logs\n const errorLogger = createLogger({ silent: false, json: false });\n errorLogger.error(`ā Simulate command failed: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n },\n 'simulate',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level simulate function for programmatic usage.\n *\n * Handles configuration loading internally and returns structured results.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param event - Event object to simulate\n * @param options - Simulation options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Simulation result with success status, elb result, and usage data\n *\n * @example\n * ```typescript\n * // With config file\n * const result = await simulate('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n *\n * // With config object\n * const result = await simulate(\n * {\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * code: '...',\n * output: './bundle.js'\n * },\n * { name: 'page view' },\n * { silent: true }\n * );\n * ```\n */\nexport async function simulate(\n configOrPath: string | unknown,\n event: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n json?: boolean;\n } = {},\n): Promise<import('./types').SimulationResult> {\n // simulateCore currently only accepts file paths, so we need to handle that\n // For now, if configOrPath is not a string, throw an error with guidance\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'simulate() currently only supports config file paths. ' +\n 'Config object support will be added in a future version. ' +\n 'Please provide a path to a configuration file.',\n );\n }\n\n // Call core simulator\n return await simulateCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n });\n}\n\n// Re-export types and utilities for testing\nexport * from './types';\nexport * from './simulator';\n","/**\n * Run Command\n *\n * Runs walkerOS flows using @walkeros/docker as a library\n * No Docker daemon required - runs directly in Node.js\n */\n\nimport path from 'path';\nimport os from 'os';\nimport {\n runFlow,\n runServeMode,\n type RuntimeConfig,\n type ServeConfig,\n} from '@walkeros/docker';\nimport { bundle } from '../bundle';\nimport {\n createLogger,\n createTimer,\n getExecutionMode,\n executeRunInDocker,\n isDockerAvailable,\n} from '../../core';\nimport { loadJsonConfig } from '../../config';\nimport { validateMode, validateFlowFile, validatePort } from './validators';\nimport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './types';\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Command options\n */\nexport async function runCommand(\n mode: string,\n options: RunCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n\n try {\n // Step 1: Validate inputs\n validateMode(mode);\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt =\n configPath.endsWith('.mjs') ||\n configPath.endsWith('.js') ||\n configPath.endsWith('.cjs');\n\n let flowPath: string | null = null;\n\n if (mode === 'collect') {\n if (isPreBuilt) {\n // Use pre-built bundle directly\n flowPath = path.resolve(configPath);\n if (!options.json && !options.silent) {\n logger.info(`š¦ Using pre-built flow: ${path.basename(flowPath)}`);\n }\n } else {\n // Bundle JSON config first\n if (!options.json && !options.silent) {\n logger.info('šØ Building flow bundle...');\n }\n\n // Read config and modify output path\n const rawConfig = await loadJsonConfig(configPath);\n const tempPath = path.join(\n os.tmpdir(),\n `walkeros-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.mjs`,\n );\n\n // Ensure config has build.output set to temp path\n const existingBuild =\n typeof rawConfig === 'object' &&\n rawConfig !== null &&\n 'build' in rawConfig &&\n typeof (rawConfig as Record<string, unknown>).build === 'object'\n ? ((rawConfig as Record<string, unknown>).build as Record<\n string,\n unknown\n >)\n : {};\n\n const configWithOutput = {\n ...(rawConfig as Record<string, unknown>),\n build: {\n ...existingBuild,\n output: tempPath,\n },\n };\n\n await bundle(configWithOutput, {\n cache: true,\n verbose: options.verbose,\n silent: options.json || options.silent,\n });\n\n flowPath = tempPath;\n\n if (!options.json && !options.silent) {\n logger.success('ā
Bundle ready');\n }\n }\n }\n\n // Step 3: Execute based on mode\n const executionMode = getExecutionMode(options);\n\n if (executionMode === 'docker') {\n // Docker mode: Use production runtime image\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (!options.json && !options.silent) {\n logger.info('š³ Executing in production runtime container...');\n }\n\n await executeRunInDocker(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n silent: options.silent,\n });\n } else {\n // Local mode: Use library functions\n if (!options.json && !options.silent) {\n const modeLabel = mode === 'collect' ? 'Collector' : 'Server';\n logger.info(`š„ļø Starting ${modeLabel} locally...`);\n }\n\n switch (mode) {\n case 'collect': {\n if (!flowPath) {\n throw new Error('Flow path is required for collect mode');\n }\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config);\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n };\n await runServeMode(config);\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n }\n\n // Note: Both Docker and local modes run forever, so we won't reach here unless they fail\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n const output = {\n success: false,\n mode,\n error: errorMessage,\n duration,\n };\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(output, null, 2));\n } else {\n logger.error('ā Run failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n}\n\n/**\n * Programmatic run function\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run('collect', {\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run('collect', {\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(\n mode: RunMode,\n options: RunOptions,\n): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n // Validate inputs\n validateMode(mode);\n\n let flowFile: string;\n if (typeof options.config === 'string') {\n flowFile = validateFlowFile(options.config);\n } else {\n throw new Error('Programmatic run() requires config file path');\n }\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Determine if config is pre-built or needs bundling\n const isPreBuilt =\n flowFile.endsWith('.mjs') ||\n flowFile.endsWith('.js') ||\n flowFile.endsWith('.cjs');\n\n let flowPath: string;\n\n if (isPreBuilt) {\n flowPath = path.resolve(flowFile);\n } else {\n // Bundle JSON config\n const rawConfig = await loadJsonConfig(flowFile);\n const tempPath = path.join(\n os.tmpdir(),\n `walkeros-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.mjs`,\n );\n\n // Ensure config has build.output set to temp path\n const existingBuild =\n typeof rawConfig === 'object' &&\n rawConfig !== null &&\n 'build' in rawConfig &&\n typeof (rawConfig as Record<string, unknown>).build === 'object'\n ? ((rawConfig as Record<string, unknown>).build as Record<\n string,\n unknown\n >)\n : {};\n\n const configWithOutput = {\n ...(rawConfig as Record<string, unknown>),\n build: {\n ...existingBuild,\n output: tempPath,\n },\n };\n\n await bundle(configWithOutput, {\n cache: true,\n verbose: options.verbose,\n silent: true,\n });\n\n flowPath = tempPath;\n }\n\n // Run the flow using Docker package\n switch (mode) {\n case 'collect': {\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config);\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n };\n await runServeMode(config);\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n\n // Success (though runFlow runs forever, so we typically don't reach here)\n return {\n success: true,\n exitCode: 0,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Export types\nexport type { RunMode, RunCommandOptions, RunOptions, RunResult };\n","/**\n * Run Command Validators\n *\n * Validation logic for run command inputs\n */\n\nimport { existsSync } from 'fs';\nimport { resolve } from 'path';\nimport type { RunMode } from './types';\n\n/**\n * Valid run modes\n */\nconst VALID_MODES: RunMode[] = ['collect', 'serve'];\n\n/**\n * Validates run mode\n *\n * @param mode - Mode to validate\n * @throws Error if mode is invalid\n */\nexport function validateMode(mode: string): asserts mode is RunMode {\n if (!VALID_MODES.includes(mode as RunMode)) {\n throw new Error(\n `Invalid mode: \"${mode}\"\\n` +\n ` Valid modes: ${VALID_MODES.join(', ')}\\n` +\n ` Example: walkeros run collect ./flow.json`,\n );\n }\n}\n\n/**\n * Validates flow file exists\n *\n * @param filePath - Path to flow configuration file\n * @returns Absolute path to flow file\n * @throws Error if file doesn't exist\n */\nexport function validateFlowFile(filePath: string): string {\n const absolutePath = resolve(filePath);\n\n if (!existsSync(absolutePath)) {\n throw new Error(\n `Flow file not found: ${filePath}\\n` +\n ` Resolved path: ${absolutePath}\\n` +\n ` Make sure the file exists and the path is correct`,\n );\n }\n\n return absolutePath;\n}\n\n/**\n * Validates port number\n *\n * @param port - Port number to validate\n * @throws Error if port is invalid\n */\nexport function validatePort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(\n `Invalid port: ${port}\\n` +\n ` Port must be an integer between 1 and 65535\\n` +\n ` Example: --port 8080`,\n );\n }\n}\n"],"mappings":"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","names":["path","resolve","resolve","path","path","path","path","path","fs","path","fs","fs","path","value","path","fs","path","fs","path","path","fs","path","path","fs","path","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/bundle/index.ts","../src/core/logger.ts","../src/core/timer.ts","../src/core/output.ts","../src/core/docker.ts","../src/core/execution.ts","../src/config/validators.ts","../src/config/utils.ts","../src/config/defaults.ts","../src/config/parser.ts","../src/config/loader.ts","../src/commands/bundle/bundler.ts","../src/commands/bundle/package-manager.ts","../src/commands/bundle/template-engine.ts","../src/commands/bundle/serializer.ts","../src/commands/bundle/stats.ts","../src/commands/simulate/simulator.ts","../src/commands/simulate/tracker.ts","../src/commands/simulate/index.ts","../src/commands/run/index.ts","../src/commands/run/validators.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { bundleCommand } from './commands/bundle';\nimport { simulateCommand } from './commands/simulate';\nimport { runCommand } from './commands/run';\n\n// === CLI Commands ===\n// Export CLI command handlers\nexport { bundleCommand, simulateCommand, runCommand };\n\n// === Programmatic API ===\n// High-level functions for library usage\nexport { bundle } from './commands/bundle';\nexport { simulate } from './commands/simulate';\nexport { run } from './commands/run';\n\n// === Types ===\n// Export types for programmatic usage\nexport type { BuildOptions, EnvironmentConfig, Setup } from './types/bundle';\nexport type { BundleStats } from './commands/bundle/bundler';\nexport type { SimulationResult } from './commands/simulate/types';\nexport type {\n SourceDestinationItem,\n TemplateVariables,\n ProcessedTemplateVariables,\n TemplateSource,\n TemplateDestination,\n} from './types/template';\nexport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './commands/run';\nexport type { GlobalOptions } from './types/global';\n\nconst program = new Command();\n\nprogram\n .name('walkeros')\n .description('walkerOS CLI - Bundle and deploy walkerOS components')\n .version('0.1.0');\n\n// Bundle command\nprogram\n .command('bundle [file]')\n .description('Bundle NPM packages with custom code')\n .option(\n '-e, --env <name>',\n 'environment to build (for multi-environment configs)',\n )\n .option('--all', 'build all environments (for multi-environment configs)')\n .option('-s, --stats', 'show bundle statistics')\n .option('--json', 'output statistics in JSON format (implies --stats)')\n .option('--no-cache', 'disable package caching and download fresh packages')\n .option('-v, --verbose', 'verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await bundleCommand({\n config: file || 'bundle.config.json',\n env: options.env,\n all: options.all,\n stats: options.stats,\n json: options.json,\n cache: options.cache,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Simulate command\nprogram\n .command('simulate [file]')\n .description('Simulate event processing and capture API calls')\n .option('-e, --event <json>', 'Event to simulate (JSON string)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await simulateCommand({\n config: file || 'bundle.config.json',\n event: options.event,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run command with subcommands\nconst runCmd = program\n .command('run')\n .description('Run walkerOS flows in collect or serve mode');\n\n// Run collect subcommand\nrunCmd\n .command('collect <file>')\n .description('Run collector mode (event collection endpoint)')\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('collect', {\n config: file,\n port: options.port,\n host: options.host,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Run serve subcommand\nrunCmd\n .command('serve <file>')\n .description('Run serve mode (static file server for browser bundles)')\n .option('-p, --port <number>', 'Port to listen on (default: 8080)', parseInt)\n .option('-h, --host <address>', 'Host address (default: 0.0.0.0)')\n .option('--static-dir <dir>', 'Static directory for serve mode')\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Verbose output')\n .option('--local', 'execute in local Node.js instead of Docker')\n .option('--dry-run', 'preview command without executing')\n .option('--silent', 'suppress output')\n .action(async (file, options) => {\n await runCommand('serve', {\n config: file,\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n json: options.json,\n verbose: options.verbose,\n local: options.local,\n dryRun: options.dryRun,\n silent: options.silent,\n });\n });\n\n// Only run CLI if this file is executed directly (not imported as a module)\n// Check if the resolved file path matches the first CLI argument\nimport { fileURLToPath } from 'url';\nconst isMainModule =\n process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];\nif (isMainModule) {\n program.parse();\n}\n","/**\n * Bundle Command\n *\n * Supports both single-environment and multi-environment builds.\n */\n\nimport path from 'path';\nimport {\n createLogger,\n createTimer,\n createSuccessOutput,\n createErrorOutput,\n executeCommand,\n} from '../../core';\nimport {\n loadJsonConfig,\n loadBundleConfig,\n loadAllEnvironments,\n parseBundleConfig,\n type LoadConfigResult,\n} from '../../config';\nimport type { GlobalOptions } from '../../types';\nimport { bundleCore } from './bundler';\nimport { displayStats, createStatsSummary } from './stats';\n\nexport interface BundleCommandOptions extends GlobalOptions {\n config: string;\n env?: string;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n cache?: boolean;\n}\n\nexport async function bundleCommand(\n options: BundleCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n\n // Build Docker args - file path as first positional arg\n const dockerArgs = [options.config];\n if (options.env) dockerArgs.push('--env', options.env);\n if (options.all) dockerArgs.push('--all');\n if (options.stats) dockerArgs.push('--stats');\n if (options.json) dockerArgs.push('--json');\n if (options.cache === false) dockerArgs.push('--no-cache');\n if (options.verbose) dockerArgs.push('--verbose');\n if (options.silent) dockerArgs.push('--silent');\n\n await executeCommand(\n async () => {\n try {\n // Validate flag combination\n if (options.env && options.all) {\n throw new Error('Cannot use both --env and --all flags together');\n }\n\n // Step 1: Read configuration file\n logger.info('š¦ Reading configuration...');\n const configPath = path.resolve(options.config);\n const rawConfig = await loadJsonConfig(configPath);\n\n // Step 2: Load configuration(s) based on flags\n const configsToBundle: LoadConfigResult[] = options.all\n ? loadAllEnvironments(rawConfig, { configPath, logger })\n : [\n loadBundleConfig(rawConfig, {\n configPath,\n environment: options.env,\n logger,\n }),\n ];\n\n // Step 3: Bundle each configuration\n const results: Array<{\n environment: string;\n success: boolean;\n stats?: unknown;\n error?: string;\n }> = [];\n\n for (const {\n flowConfig,\n buildOptions,\n environment,\n isMultiEnvironment,\n } of configsToBundle) {\n try {\n // Override cache setting from CLI if provided\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // Log environment being built (for multi-environment setups)\n if (isMultiEnvironment || options.all) {\n logger.info(`\\nš§ Building environment: ${environment}`);\n } else {\n logger.info('š§ Starting bundle process...');\n }\n\n // Run bundler\n const shouldCollectStats = options.stats || options.json;\n const stats = await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n shouldCollectStats,\n );\n\n results.push({\n environment,\n success: true,\n stats,\n });\n\n // Show stats if requested (for non-JSON, non-multi builds)\n if (!options.json && !options.all && options.stats && stats) {\n displayStats(stats, logger);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n results.push({\n environment,\n success: false,\n error: errorMessage,\n });\n\n if (!options.all) {\n throw error; // Re-throw for single environment builds\n }\n }\n }\n\n // Step 4: Report results\n const duration = timer.end() / 1000;\n const successCount = results.filter((r) => r.success).length;\n const failureCount = results.filter((r) => !r.success).length;\n\n if (options.json) {\n // JSON output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output =\n failureCount === 0\n ? createSuccessOutput(\n {\n environments: results,\n summary: {\n total: results.length,\n success: successCount,\n failed: failureCount,\n },\n },\n duration,\n )\n : createErrorOutput(\n `${failureCount} environment(s) failed to build`,\n duration,\n );\n outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n if (options.all) {\n logger.info(`\\nš Build Summary:`);\n logger.info(` Total: ${results.length}`);\n logger.success(` ā
Success: ${successCount}`);\n if (failureCount > 0) {\n logger.error(` ā Failed: ${failureCount}`);\n }\n }\n\n if (failureCount === 0) {\n logger.success(\n `\\nā
Bundle created successfully in ${timer.format()}`,\n );\n } else {\n throw new Error(`${failureCount} environment(s) failed to build`);\n }\n }\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n // JSON error output for CI/CD\n const outputLogger = createLogger({ silent: false, json: false });\n const output = createErrorOutput(errorMessage, duration);\n outputLogger.log('white', JSON.stringify(output, null, 2));\n } else {\n logger.error('ā Bundle failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n },\n 'bundle',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level bundle function for programmatic usage.\n *\n * Handles configuration loading, parsing, and logger creation internally.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param options - Bundle options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.stats - Collect and return bundle statistics (default: false)\n * @param options.cache - Enable package caching (default: true)\n * @returns Bundle statistics if stats option is true, otherwise void\n *\n * @example\n * ```typescript\n * // With config object\n * await bundle({\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * sources: { browser: { code: 'sourceBrowser' } },\n * destinations: { api: { code: 'destinationApi' } },\n * code: 'export default startFlow({ sources, destinations })',\n * output: './dist/walker.js'\n * });\n *\n * // With config file\n * await bundle('./walker.config.json', { stats: true });\n * ```\n */\nexport async function bundle(\n configOrPath: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n stats?: boolean;\n cache?: boolean;\n } = {},\n): Promise<import('./bundler').BundleStats | void> {\n // 1. Load config if path provided\n let rawConfig: unknown;\n if (typeof configOrPath === 'string') {\n rawConfig = await loadJsonConfig(configOrPath);\n } else {\n rawConfig = configOrPath;\n }\n\n // 2. Parse and normalize config\n const { flowConfig, buildOptions } = parseBundleConfig(rawConfig);\n\n // 3. Handle cache option\n if (options.cache !== undefined) {\n buildOptions.cache = options.cache;\n }\n\n // 4. Create logger internally\n const logger = createLogger({\n silent: options.silent ?? false,\n verbose: options.verbose ?? false,\n });\n\n // 5. Call core bundler\n return await bundleCore(\n flowConfig,\n buildOptions,\n logger,\n options.stats ?? false,\n );\n}\n","/* eslint-disable no-console */\nimport chalk from 'chalk';\n\nexport interface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\nexport interface Logger {\n log: (color: string, ...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void; // Alias for warning\n error: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n gray: (...args: unknown[]) => void;\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, silent = false, json = false } = options;\n\n const shouldLog = !silent && !json;\n const shouldDebug = verbose && !silent && !json;\n\n return {\n log: (color: string, ...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n // Map color names to chalk functions\n const colorMap: Record<string, (text: string) => string> = {\n red: chalk.red,\n green: chalk.green,\n blue: chalk.blue,\n yellow: chalk.yellow,\n gray: chalk.gray,\n grey: chalk.gray,\n cyan: chalk.cyan,\n magenta: chalk.magenta,\n white: chalk.white,\n black: chalk.black,\n };\n const colorFn = colorMap[color];\n const coloredMessage = colorFn ? colorFn(message) : message;\n console.log(coloredMessage);\n }\n },\n\n info: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.blue(message));\n }\n },\n\n success: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.green(message));\n }\n },\n\n warning: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n warn: (...args: unknown[]) => {\n // Alias for warning\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.yellow(message));\n }\n },\n\n error: (...args: unknown[]) => {\n if (!json) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.error(chalk.red(message));\n }\n },\n\n debug: (...args: unknown[]) => {\n if (shouldDebug) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n\n gray: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.gray(message));\n }\n },\n };\n}\n","/**\n * Timer utilities for measuring execution time\n */\n\nexport interface Timer {\n start: () => void;\n end: () => number;\n getElapsed: () => number;\n format: () => string;\n}\n\n/**\n * Create a high-precision timer\n */\nexport function createTimer(): Timer {\n let startTime = 0;\n let endTime = 0;\n\n return {\n start() {\n startTime = Date.now();\n endTime = 0;\n },\n\n end() {\n endTime = Date.now();\n return endTime - startTime;\n },\n\n getElapsed() {\n const currentTime = endTime || Date.now();\n return currentTime - startTime;\n },\n\n format() {\n const elapsed = this.getElapsed();\n return (elapsed / 1000).toFixed(2) + 's';\n },\n };\n}\n","/**\n * Output formatting utilities for CLI commands\n */\n\nexport interface JsonOutput<T = Record<string, unknown>> {\n success: boolean;\n data?: T;\n error?: string;\n duration?: number;\n}\n\n/**\n * Create standardized JSON output for CLI commands\n */\nexport function createJsonOutput<T = Record<string, unknown>>(\n success: boolean,\n data?: T,\n error?: string,\n duration?: number,\n): JsonOutput<T> {\n return {\n success,\n ...(data && { data }),\n ...(error && { error }),\n ...(duration && { duration }),\n };\n}\n\n/**\n * Create success JSON output\n */\nexport function createSuccessOutput<T = Record<string, unknown>>(\n data?: T,\n duration?: number,\n): JsonOutput<T> {\n return createJsonOutput(true, data, undefined, duration);\n}\n\n/**\n * Create error JSON output\n */\nexport function createErrorOutput(\n error: string,\n duration?: number,\n): JsonOutput<never> {\n return createJsonOutput<never>(false, undefined, error, duration);\n}\n\n/**\n * Format bytes to KB with 2 decimal places\n */\nexport function formatBytes(bytes: number): string {\n return (bytes / 1024).toFixed(2);\n}\n\n/**\n * Format file size with appropriate unit\n */\nexport function formatFileSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)} ${units[unitIndex]}`;\n}\n","/**\n * Docker Execution Utilities\n *\n * Handles Docker container execution for CLI commands.\n */\n\nimport { spawn } from 'child_process';\nimport path from 'path';\nimport type { GlobalOptions } from '../types/global';\n\n/**\n * Docker image for CLI/build tools (bundle, simulate)\n */\nexport const CLI_DOCKER_IMAGE =\n process.env.WALKEROS_CLI_DOCKER_IMAGE || 'walkeros/cli:latest';\n\n/**\n * Docker image for production runtime (run command)\n */\nexport const RUNTIME_DOCKER_IMAGE =\n process.env.WALKEROS_RUNTIME_DOCKER_IMAGE || 'walkeros/docker:latest';\n\n/**\n * @deprecated Use CLI_DOCKER_IMAGE or RUNTIME_DOCKER_IMAGE instead\n */\nexport const DOCKER_IMAGE = CLI_DOCKER_IMAGE;\n\n/**\n * Build Docker command for executing CLI commands\n *\n * @param command - CLI command (bundle, simulate, run)\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Docker command array\n */\nexport function buildDockerCommand(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): string[] {\n const cwd = process.cwd();\n\n const cmd = ['docker', 'run', '--rm'];\n\n // Mount config file if provided\n if (configFile) {\n const configPath = path.resolve(cwd, configFile);\n\n // Mount config file at /config/flow.json (read-only, separate from workspace)\n cmd.push('-v', `${configPath}:/config/flow.json:ro`);\n\n // Update args to use container path - replace first occurrence of config file path\n args = args.map((arg) => (arg === configFile ? '/config/flow.json' : arg));\n }\n\n // Mount current directory for output files\n cmd.push('-v', `${cwd}:/workspace`);\n cmd.push('-w', '/workspace');\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Pass through environment variables\n if (options.verbose) {\n cmd.push('-e', 'VERBOSE=true');\n }\n if (options.silent) {\n cmd.push('-e', 'SILENT=true');\n }\n\n // Add the Docker image (CLI tools for bundle/simulate)\n cmd.push(CLI_DOCKER_IMAGE);\n\n // Add the command and arguments\n cmd.push(command, ...args);\n\n return cmd;\n}\n\n/**\n * Execute command in Docker container\n *\n * @param command - CLI command\n * @param args - Command arguments\n * @param options - Global options\n * @param configFile - Optional config file path to mount in Docker\n * @returns Promise that resolves when command completes\n */\nexport async function executeInDocker(\n command: string,\n args: string[],\n options: GlobalOptions = {},\n configFile?: string,\n): Promise<void> {\n // Force --local execution inside container to prevent nested Docker attempts\n // Architecture: Host CLI decides environment (Docker vs local),\n // Container CLI always executes locally (no Docker-in-Docker)\n const containerArgs = [...args, '--local'];\n\n const dockerCmd = buildDockerCommand(\n command,\n containerArgs,\n options,\n configFile,\n );\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Docker command exited with code ${code}`));\n }\n });\n });\n}\n\n/**\n * Check if Docker is available\n *\n * @returns Promise resolving to true if Docker is available\n */\nexport async function isDockerAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['--version'], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Check if Docker image exists locally\n *\n * @param image - Docker image name\n * @returns Promise resolving to true if image exists\n */\nexport async function imageExists(\n image: string = CLI_DOCKER_IMAGE,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('docker', ['image', 'inspect', image], {\n stdio: 'ignore',\n });\n\n proc.on('error', () => resolve(false));\n proc.on('exit', (code) => resolve(code === 0));\n });\n}\n\n/**\n * Build Docker command for run command (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode)\n * @param options - Runtime options\n * @returns Docker command array\n */\nexport function buildDockerRunCommand(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n staticDir?: string;\n } = {},\n): string[] {\n const cwd = process.cwd();\n const cmd = ['docker', 'run', '--rm'];\n\n // Set MODE environment variable\n cmd.push('-e', `MODE=${mode}`);\n\n // Mount flow bundle for collect mode\n if (mode === 'collect' && flowPath) {\n const absoluteFlowPath = path.resolve(cwd, flowPath);\n cmd.push('-v', `${absoluteFlowPath}:/app/flow.mjs:ro`);\n cmd.push('-e', 'FLOW=/app/flow.mjs');\n }\n\n // Port mapping\n if (options.port !== undefined) {\n cmd.push('-p', `${options.port}:${options.port}`);\n cmd.push('-e', `PORT=${options.port}`);\n }\n\n // Host\n if (options.host) {\n cmd.push('-e', `HOST=${options.host}`);\n }\n\n // Static directory for serve mode\n if (mode === 'serve' && options.staticDir) {\n const absoluteStaticDir = path.resolve(cwd, options.staticDir);\n cmd.push('-v', `${absoluteStaticDir}:/app/dist:ro`);\n cmd.push('-e', 'STATIC_DIR=/app/dist');\n }\n\n // Add user mapping on Linux/Mac to prevent permission issues\n if (process.platform !== 'win32') {\n try {\n const uid = process.getuid?.();\n const gid = process.getgid?.();\n if (uid !== undefined && gid !== undefined) {\n cmd.push('--user', `${uid}:${gid}`);\n }\n } catch {\n // Ignore if not available\n }\n }\n\n // Add the runtime Docker image\n cmd.push(RUNTIME_DOCKER_IMAGE);\n\n return cmd;\n}\n\n/**\n * Execute run command in Docker container (production runtime)\n *\n * @param mode - Run mode (collect | serve)\n * @param flowPath - Path to pre-built .mjs bundle (for collect mode)\n * @param options - Runtime and global options\n * @returns Promise that resolves when command completes\n */\nexport async function executeRunInDocker(\n mode: 'collect' | 'serve',\n flowPath: string | null,\n options: {\n port?: number;\n host?: string;\n staticDir?: string;\n silent?: boolean;\n } = {},\n): Promise<void> {\n const dockerCmd = buildDockerRunCommand(mode, flowPath, options);\n\n return new Promise((resolve, reject) => {\n const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {\n stdio: options.silent ? 'ignore' : 'inherit',\n shell: false,\n });\n\n proc.on('error', (error) => {\n reject(new Error(`Docker execution failed: ${error.message}`));\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Docker command exited with code ${code}`));\n }\n });\n });\n}\n","/**\n * Execution Mode Handler\n *\n * Determines whether to execute commands locally or in Docker.\n */\n\nimport type { GlobalOptions } from '../types/global';\nimport {\n executeInDocker,\n executeRunInDocker,\n isDockerAvailable,\n} from './docker';\nimport type { Logger } from './logger';\n\n/**\n * Execution mode\n */\nexport type ExecutionMode = 'local' | 'docker';\n\n/**\n * Get execution mode from options\n *\n * @param options - Global options\n * @returns Execution mode\n */\nexport function getExecutionMode(options: GlobalOptions): ExecutionMode {\n // Force local mode if:\n // 1. --local flag is provided, OR\n // 2. Running inside a Docker container (WALKEROS_CONTAINER env var)\n if (options.local || process.env.WALKEROS_CONTAINER === 'true') {\n return 'local';\n }\n return 'docker';\n}\n\n/**\n * Execute command handler type\n */\nexport type ExecuteHandler = () => Promise<void>;\n\n/**\n * Execute command based on mode\n *\n * @param localHandler - Function to execute locally\n * @param dockerCommand - Docker command name\n * @param dockerArgs - Docker command arguments\n * @param options - Global options\n * @param logger - Logger instance\n * @param configFile - Optional config file path to mount in Docker\n */\nexport async function executeCommand(\n localHandler: ExecuteHandler,\n dockerCommand: string,\n dockerArgs: string[],\n options: GlobalOptions,\n logger?: Logger,\n configFile?: string,\n): Promise<void> {\n const mode = getExecutionMode(options);\n\n // Handle dry-run\n if (options.dryRun) {\n if (mode === 'docker') {\n const cmd = `docker run walkeros/cli:latest ${dockerCommand} ${dockerArgs.join(' ')}`;\n logger?.info(`[DRY-RUN] Would execute: ${cmd}`);\n } else {\n logger?.info(\n `[DRY-RUN] Would execute locally: ${dockerCommand} ${dockerArgs.join(' ')}`,\n );\n }\n return;\n }\n\n // Execute based on mode\n if (mode === 'local') {\n if (logger && !options.silent) {\n logger.info('š„ļø Executing locally...');\n }\n await localHandler();\n } else {\n // Docker mode\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (logger && !options.silent) {\n logger.info('š³ Executing in Docker container...');\n }\n await executeInDocker(dockerCommand, dockerArgs, options, configFile);\n }\n}\n","/**\n * Configuration Type Guards and Validators\n *\n * Type checking utilities for configuration validation.\n */\n\nimport type { Setup, EnvironmentConfig } from '../types/bundle';\n\n/**\n * Type guard: Check if value is a plain object.\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Type guard: Validate platform value.\n */\nexport function validatePlatform(\n platform: unknown,\n): platform is 'web' | 'server' {\n return platform === 'web' || platform === 'server';\n}\n\n/**\n * Type guard: Check if config is multi-environment format.\n */\nexport function isMultiEnvConfig(data: unknown): data is Setup {\n return (\n isObject(data) &&\n 'version' in data &&\n data.version === 1 &&\n 'environments' in data &&\n isObject(data.environments)\n );\n}\n\n/**\n * Type guard: Check if config is single-environment format.\n */\nexport function isSingleEnvConfig(data: unknown): data is EnvironmentConfig {\n return (\n isObject(data) &&\n 'flow' in data &&\n 'build' in data &&\n isObject(data.flow) &&\n isObject(data.build) &&\n 'platform' in data.flow &&\n validatePlatform((data.flow as { platform: unknown }).platform)\n );\n}\n\n// Legacy format support removed in v0.3.0\n// See docs/MIGRATION.md for migration guide\n","/**\n * Configuration Utility Functions\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\n\n/**\n * Substitute environment variables in a string.\n *\n * @param value - String with ${VAR} placeholders\n * @returns String with environment variables substituted\n * @throws Error if environment variable is not found\n *\n * @example\n * ```typescript\n * substituteEnvVariables('${HOME}/config') // \"/Users/name/config\"\n * ```\n */\nexport function substituteEnvVariables(value: string): string {\n return value.replace(/\\${([^}]+)}/g, (_, envVar) => {\n const envValue = process.env[envVar];\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} not found`);\n }\n return envValue;\n });\n}\n\n/**\n * Load and parse JSON configuration file.\n *\n * @param configPath - Path to JSON file\n * @returns Parsed configuration object\n * @throws Error if file not found or invalid JSON\n */\nexport async function loadJsonConfig<T>(configPath: string): Promise<T> {\n const absolutePath = path.resolve(configPath);\n\n if (!(await fs.pathExists(absolutePath))) {\n throw new Error(`Configuration file not found: ${absolutePath}`);\n }\n\n try {\n const rawConfig = await fs.readJson(absolutePath);\n return rawConfig as T;\n } catch (error) {\n throw new Error(\n `Invalid JSON in config file: ${configPath}. ${error instanceof Error ? error.message : error}`,\n );\n }\n}\n\n/**\n * Generate a unique temporary directory path.\n *\n * @param tempDir - Base temporary directory (default: \".tmp\")\n * @returns Absolute path to unique temp directory\n *\n * @example\n * ```typescript\n * getTempDir() // \"/workspaces/project/.tmp/cli-1647261462000-abc123\"\n * getTempDir('/tmp') // \"/tmp/cli-1647261462000-abc123\"\n * ```\n */\nexport function getTempDir(tempDir = '.tmp'): string {\n const randomId = Math.random().toString(36).substring(2, 11);\n const basePath = path.isAbsolute(tempDir)\n ? tempDir\n : path.join(process.cwd(), tempDir);\n return path.join(basePath, `cli-${Date.now()}-${randomId}`);\n}\n","/**\n * Configuration Defaults\n *\n * Platform-specific default build options.\n */\n\nimport type { BuildOptions } from '../types/bundle';\n\n/**\n * Get default build configuration for platform.\n *\n * @param platform - Target platform ('web' or 'server')\n * @param code - User code to include (required for BuildOptions)\n * @param output - Output file path (optional, uses platform default)\n * @returns Platform-specific default build options\n *\n * @remarks\n * Provides sensible defaults for each platform:\n * - web: IIFE format for browser, ES2020 target\n * - server: ESM format for Node.js, Node18 target\n */\nexport function getDefaultBuildOptions(\n platform: 'web' | 'server',\n code: string,\n output?: string,\n): Partial<BuildOptions> {\n const common = {\n code,\n packages: {} as Record<string, { version?: string; imports?: string[] }>,\n minify: false,\n sourcemap: false,\n cache: true,\n };\n\n if (platform === 'web') {\n return {\n ...common,\n platform: 'browser',\n format: 'iife',\n target: 'es2020',\n output: output || './dist/walker.js',\n globalName: 'walkerOS',\n };\n }\n\n return {\n ...common,\n platform: 'node',\n format: 'esm',\n target: 'node18',\n output: output || './dist/bundle.js',\n };\n}\n\n/**\n * Ensure build options have all required fields.\n *\n * @param buildOptions - Build options (possibly incomplete)\n * @param flowPlatform - Platform from Flow.Config\n * @returns Complete build options with defaults filled in\n *\n * @remarks\n * Validates and fills in missing required fields using platform-specific defaults.\n * Throws error if critical fields (code, output) are missing.\n */\nexport function ensureBuildOptions(\n buildOptions: Partial<BuildOptions>,\n flowPlatform: 'web' | 'server',\n): BuildOptions {\n const defaults = getDefaultBuildOptions(\n flowPlatform,\n buildOptions.code || '',\n buildOptions.output,\n );\n\n // Validate required fields\n if (!buildOptions.code && !defaults.code) {\n throw new Error('BuildOptions.code is required');\n }\n if (!buildOptions.output && !defaults.output) {\n throw new Error('BuildOptions.output is required');\n }\n\n return {\n ...defaults,\n ...buildOptions,\n code: buildOptions.code || defaults.code!,\n output: buildOptions.output || defaults.output!,\n packages: buildOptions.packages || defaults.packages!,\n } as BuildOptions;\n}\n","/**\n * Configuration Parser\n *\n * Parsing and normalization logic for configurations.\n */\n\nimport path from 'path';\nimport type { Flow } from '@walkeros/core';\nimport type { BuildOptions, EnvironmentConfig } from '../types/bundle';\nimport { isObject, isSingleEnvConfig } from './validators';\nimport { ensureBuildOptions } from './defaults';\nimport { validatePlatform } from './validators';\n\n/**\n * Result of parsing bundle configuration.\n */\nexport interface ParsedConfig {\n flowConfig: Flow.Config;\n buildOptions: BuildOptions;\n}\n\n/**\n * Parse and normalize bundle configuration.\n *\n * @param data - Raw configuration data (EnvironmentConfig format: { flow, build })\n * @returns Normalized flowConfig and buildOptions with platform-specific defaults\n * @throws Error if validation fails\n *\n * @example\n * ```typescript\n * const { flowConfig, buildOptions } = parseBundleConfig({\n * flow: {\n * platform: 'web',\n * sources: { browser: {...} },\n * destinations: { gtag: {...} }\n * },\n * build: {\n * packages: { '@walkeros/core': {...} },\n * code: '...',\n * output: './dist/bundle.js'\n * }\n * });\n * ```\n */\nexport function parseBundleConfig(data: unknown): ParsedConfig {\n // Basic type checking\n if (!isObject(data)) {\n throw new Error(`Invalid config: expected object, got ${typeof data}`);\n }\n\n // Check for new format { flow, build }\n if (!('flow' in data) || !isObject(data.flow)) {\n throw new Error(\n `Invalid config: missing \"flow\" field. ` +\n `Expected format: { flow: { platform: \"web\" | \"server\", ... }, build: { ... } }`,\n );\n }\n\n if (!('build' in data) || !isObject(data.build)) {\n throw new Error(\n `Invalid config: missing \"build\" field. ` +\n `Expected format: { flow: { platform: \"web\" | \"server\", ... }, build: { ... } }`,\n );\n }\n\n const flowData = data.flow as Record<string, unknown>;\n if (\n !('platform' in flowData) ||\n (flowData.platform !== 'web' && flowData.platform !== 'server')\n ) {\n throw new Error(\n `Invalid config: flow.platform must be \"web\" or \"server\", got \"${flowData.platform}\"`,\n );\n }\n\n // Validate build.packages field\n const buildData = data.build as Record<string, unknown>;\n if ('packages' in buildData && !isObject(buildData.packages)) {\n throw new Error(\n `Invalid config: build.packages must be an object, got ${typeof buildData.packages}`,\n );\n }\n\n const config = data as unknown as EnvironmentConfig;\n return normalizeConfigs(config, '/unknown/path');\n}\n\n/**\n * Safely parse bundle configuration without throwing.\n *\n * @param data - Raw configuration data\n * @returns Success result with normalized configs or error result\n */\nexport function safeParseBundleConfig(data: unknown): {\n success: boolean;\n data?: ParsedConfig;\n error?: Error;\n} {\n try {\n const normalized = parseBundleConfig(data);\n return {\n success: true,\n data: normalized,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n/**\n * Normalize flow and build configurations with platform-specific defaults.\n *\n * @param config - Environment configuration or flow+build object\n * @param configPath - Path to config file (for relative template resolution)\n * @returns Normalized flow and build configurations\n */\nexport function normalizeConfigs(\n config:\n | EnvironmentConfig\n | { flow: Flow.Config; build: Partial<BuildOptions> },\n configPath?: string,\n): { flowConfig: Flow.Config; buildOptions: BuildOptions } {\n const flowConfig = config.flow;\n const platform = (flowConfig as unknown as { platform: 'web' | 'server' })\n .platform;\n\n if (!validatePlatform(platform)) {\n throw new Error(\n `Invalid platform \"${platform}\". Must be \"web\" or \"server\".`,\n );\n }\n\n // Apply platform-specific build defaults\n const buildDefaults: Partial<BuildOptions> =\n platform === 'web'\n ? {\n platform: 'browser',\n format: 'iife',\n target: 'es2020',\n minify: false,\n sourcemap: false,\n tempDir: '.tmp',\n cache: true,\n }\n : {\n platform: 'node',\n format: 'esm',\n target: 'node20',\n minify: false,\n sourcemap: false,\n tempDir: '.tmp',\n cache: true,\n };\n\n // Merge build config\n const buildConfig: Partial<BuildOptions> = {\n ...buildDefaults,\n ...config.build,\n };\n\n // Resolve template path relative to config file directory if it starts with ./ or ../\n if (\n configPath &&\n buildConfig.template &&\n !path.isAbsolute(buildConfig.template)\n ) {\n if (\n buildConfig.template.startsWith('./') ||\n buildConfig.template.startsWith('../')\n ) {\n const configDir = path.dirname(configPath);\n buildConfig.template = path.resolve(configDir, buildConfig.template);\n }\n }\n\n // Ensure all required build fields are present\n const buildOptions = ensureBuildOptions(buildConfig, platform);\n\n return {\n flowConfig,\n buildOptions,\n };\n}\n","/**\n * Configuration Loader\n *\n * Loads and parses configurations with support for:\n * - Single-environment configs\n * - Multi-environment setups\n * - Environment selection\n */\n\nimport type { Flow } from '@walkeros/core';\nimport type { BuildOptions, EnvironmentConfig, Setup } from '../types/bundle';\nimport {\n isMultiEnvConfig,\n isSingleEnvConfig,\n validatePlatform,\n isObject,\n} from './validators';\nimport { normalizeConfigs } from './parser';\n\n/**\n * Result of configuration loading.\n */\nexport interface LoadConfigResult {\n /** Runtime event processing configuration */\n flowConfig: Flow.Config;\n /** Build-time configuration */\n buildOptions: BuildOptions;\n /** Name of the selected environment (or 'default' for single configs) */\n environment: string;\n /** Whether this is a multi-environment setup */\n isMultiEnvironment: boolean;\n /** All available environment names (for multi-environment setups) */\n availableEnvironments?: string[];\n}\n\n/**\n * Options for loading configuration.\n */\nexport interface LoadConfigOptions {\n /** Path to config file */\n configPath: string;\n /** Environment name to load (for multi-environment configs) */\n environment?: string;\n /** Logger for warnings */\n logger?: {\n warn: (message: string) => void;\n info: (message: string) => void;\n };\n}\n\n/**\n * Load and parse bundle configuration.\n *\n * @remarks\n * Automatically detects whether the config is:\n * - New format: { flow: {...}, build: {...} }\n * - Multi-environment format: { version: 1, environments: {...} }\n * - Legacy format: { platform, sources, destinations, packages, ... } (with deprecation warning)\n *\n * For multi-environment configs, requires `environment` option.\n *\n * @param rawConfig - Raw configuration object from JSON file\n * @param options - Loading options\n * @returns Parsed configuration with flow and build separated\n */\nexport function loadBundleConfig(\n rawConfig: unknown,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Check if multi-environment format\n if (isMultiEnvConfig(rawConfig)) {\n return loadMultiEnvironmentConfig(rawConfig, options);\n }\n\n // Check if new single-environment format\n if (isSingleEnvConfig(rawConfig)) {\n return loadSingleEnvironmentConfig(rawConfig, options);\n }\n\n // Invalid format - provide helpful error\n const configType = isObject(rawConfig)\n ? 'platform' in rawConfig\n ? `invalid platform value: \"${(rawConfig as { platform: unknown }).platform}\"`\n : 'missing \"flow\" and \"build\" fields'\n : `not an object (got ${typeof rawConfig})`;\n\n throw new Error(\n `Invalid configuration format at ${options.configPath}.\\n` +\n `Configuration ${configType}.\\n\\n` +\n `Expected either:\\n` +\n ` 1. Multi-environment: { version: 1, environments: { prod: { flow: {...}, build: {...} } } }\\n` +\n ` 2. Single-environment: { flow: { platform: \"web\" | \"server\", ... }, build: { packages: {...}, ... } }`,\n );\n}\n\n/**\n * Load multi-environment configuration.\n */\nfunction loadMultiEnvironmentConfig(\n setup: Setup,\n options: LoadConfigOptions,\n): LoadConfigResult {\n const availableEnvironments = Object.keys(setup.environments);\n\n // Validate environment selection\n if (!options.environment) {\n throw new Error(\n `Multi-environment configuration detected. Please specify an environment using --env flag.\\n` +\n `Available environments: ${availableEnvironments.join(', ')}`,\n );\n }\n\n const selectedEnv = options.environment;\n\n if (!setup.environments[selectedEnv]) {\n throw new Error(\n `Environment \"${selectedEnv}\" not found in configuration.\\n` +\n `Available environments: ${availableEnvironments.join(', ')}`,\n );\n }\n\n // Get the environment config\n const envConfig = setup.environments[selectedEnv];\n\n // Normalize flow and build configs separately\n const { flowConfig, buildOptions } = normalizeConfigs(\n envConfig,\n options.configPath,\n );\n\n if (options.logger) {\n options.logger.info(\n `š¦ Using environment: ${selectedEnv} (${availableEnvironments.length} total)`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n environment: selectedEnv,\n isMultiEnvironment: true,\n availableEnvironments,\n };\n}\n\n/**\n * Load single-environment configuration.\n */\nfunction loadSingleEnvironmentConfig(\n config: EnvironmentConfig,\n options: LoadConfigOptions,\n): LoadConfigResult {\n // Normalize the configs\n const { flowConfig, buildOptions } = normalizeConfigs(\n config,\n options.configPath,\n );\n\n if (options.logger && options.environment) {\n options.logger.warn(\n `--env flag specified but configuration is single-environment. Ignoring flag.`,\n );\n }\n\n return {\n flowConfig,\n buildOptions,\n environment: 'default',\n isMultiEnvironment: false,\n };\n}\n\n// Legacy format support removed in v0.3.0\n// Migration: Convert old format { platform, sources, destinations, packages, code, output }\n// To new format: { flow: { platform, sources, destinations }, build: { packages, code, output } }\n// See docs/MIGRATION.md for details\n\n/**\n * Load all environments from a multi-environment configuration.\n *\n * @remarks\n * Used by the --all flag to build all environments.\n *\n * @param rawConfig - Raw configuration object\n * @param options - Loading options\n * @returns Array of loaded configurations for all environments\n */\nexport function loadAllEnvironments(\n rawConfig: unknown,\n options: Omit<LoadConfigOptions, 'environment'>,\n): LoadConfigResult[] {\n // Must be a multi-environment config\n if (!isMultiEnvConfig(rawConfig)) {\n throw new Error(\n `--all flag requires a multi-environment configuration (Setup format).\\n` +\n `Your configuration appears to be single-environment.`,\n );\n }\n\n const setup = rawConfig;\n const environments = Object.keys(setup.environments);\n\n if (options.logger) {\n options.logger.info(\n `š¦ Loading all ${environments.length} environments: ${environments.join(', ')}`,\n );\n }\n\n // Load each environment\n return environments.map((envName) =>\n loadMultiEnvironmentConfig(setup, {\n ...options,\n environment: envName,\n }),\n );\n}\n\n/**\n * Get list of available environments from configuration.\n *\n * @param rawConfig - Raw configuration object\n * @returns Array of environment names, or empty array for single-environment configs\n */\nexport function getAvailableEnvironments(rawConfig: unknown): string[] {\n if (isMultiEnvConfig(rawConfig)) {\n return Object.keys(rawConfig.environments);\n }\n\n return [];\n}\n","import esbuild from 'esbuild';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport type { BuildOptions } from '../../types/bundle';\nimport type { SourceDestinationItem } from '../../types/template';\nimport { downloadPackages } from './package-manager';\nimport { TemplateEngine } from './template-engine';\nimport type { Logger } from '../../core';\nimport { getTempDir } from '../../config';\n\nexport interface BundleStats {\n totalSize: number;\n packages: { name: string; size: number }[];\n buildTime: number;\n treeshakingEffective: boolean;\n}\n\nexport async function bundleCore(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n logger: Logger,\n showStats = false,\n): Promise<BundleStats | void> {\n const bundleStartTime = Date.now();\n // Only generate a new temp dir if one isn't explicitly provided\n // This allows simulator to share its temp dir with the bundler\n // Ensure TEMP_DIR is always absolute (esbuild requirement)\n const TEMP_DIR = buildOptions.tempDir\n ? path.isAbsolute(buildOptions.tempDir)\n ? buildOptions.tempDir\n : path.resolve(buildOptions.tempDir)\n : getTempDir();\n\n try {\n // Step 1: Prepare temporary directory\n // Only clean if we created a new temp dir (don't clean shared simulator temp)\n if (!buildOptions.tempDir) {\n await fs.emptyDir(TEMP_DIR);\n }\n logger.debug('Cleaned temporary directory');\n\n // Step 2: Download packages\n logger.info('š„ Downloading packages...');\n // Convert packages object to array format expected by downloadPackages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version: packageConfig.version || 'latest',\n }),\n );\n // downloadPackages adds 'node_modules' subdirectory automatically\n const packagePaths = await downloadPackages(\n packagesArray,\n TEMP_DIR,\n logger,\n buildOptions.cache,\n );\n\n // Fix @walkeros packages to have proper ESM exports\n // This ensures Node resolves to .mjs files instead of .js (CJS)\n for (const [pkgName, pkgPath] of packagePaths.entries()) {\n if (pkgName.startsWith('@walkeros/')) {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n const pkgJson = await fs.readJSON(pkgJsonPath);\n\n // Add exports field to force ESM resolution\n if (!pkgJson.exports && pkgJson.module) {\n pkgJson.exports = {\n '.': {\n import: pkgJson.module,\n require: pkgJson.main,\n },\n };\n await fs.writeJSON(pkgJsonPath, pkgJson, { spaces: 2 });\n }\n }\n }\n\n // Step 3: Create package.json to enable ESM in temp directory\n // This ensures Node treats all .js files as ESM and resolves @walkeros packages correctly\n const packageJsonPath = path.join(TEMP_DIR, 'package.json');\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify({ type: 'module' }, null, 2),\n );\n\n // Step 4: Create entry point\n logger.info('š Creating entry point...');\n const entryContent = await createEntryPoint(\n flowConfig,\n buildOptions,\n packagePaths,\n );\n const entryPath = path.join(TEMP_DIR, 'entry.js');\n await fs.writeFile(entryPath, entryContent);\n\n // Step 4: Bundle with esbuild\n logger.info('ā” Bundling with esbuild...');\n const outputPath = path.resolve(buildOptions.output);\n\n // Ensure output directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n const esbuildOptions = createEsbuildOptions(\n buildOptions,\n entryPath,\n outputPath,\n TEMP_DIR,\n packagePaths,\n logger,\n );\n\n try {\n await esbuild.build(esbuildOptions);\n } catch (buildError) {\n // Enhanced error handling for build failures\n throw createBuildError(buildError as EsbuildError, buildOptions.code);\n }\n\n logger.gray(`Output: ${outputPath}`);\n\n // Step 5: Collect stats if requested\n let stats: BundleStats | undefined;\n if (showStats) {\n stats = await collectBundleStats(\n outputPath,\n buildOptions.packages,\n bundleStartTime,\n entryContent,\n );\n }\n\n // Step 6: Cleanup\n // Only cleanup if we created our own temp dir (not shared with simulator)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR);\n logger.debug('Cleaned up temporary files');\n }\n\n return stats;\n } catch (error) {\n // Cleanup on error (only if we created our own temp dir)\n if (!buildOptions.tempDir) {\n await fs.remove(TEMP_DIR).catch(() => {});\n }\n throw error;\n }\n}\n\nasync function collectBundleStats(\n outputPath: string,\n packages: BuildOptions['packages'],\n startTime: number,\n entryContent: string,\n): Promise<BundleStats> {\n const stats = await fs.stat(outputPath);\n const totalSize = stats.size;\n const buildTime = Date.now() - startTime;\n\n // Estimate package sizes by analyzing imports in entry content\n const packageStats = Object.entries(packages).map(([name, pkg]) => {\n const importPattern = new RegExp(`from\\\\s+['\"]${name}['\"]`, 'g');\n const namedImportPattern = new RegExp(\n `import\\\\s+\\\\{[^}]*\\\\}\\\\s+from\\\\s+['\"]${name}['\"]`,\n 'g',\n );\n const hasImports =\n importPattern.test(entryContent) || namedImportPattern.test(entryContent);\n\n // Rough estimation: if package is imported, assign proportional size\n const packagesCount = Object.keys(packages).length;\n const estimatedSize = hasImports\n ? Math.floor(totalSize / packagesCount)\n : 0;\n\n return {\n name: `${name}@${pkg.version || 'latest'}`,\n size: estimatedSize,\n };\n });\n\n // Tree-shaking is effective if we use named imports (not wildcard imports)\n const hasWildcardImports = /import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(entryContent);\n const treeshakingEffective = !hasWildcardImports;\n\n return {\n totalSize,\n packages: packageStats,\n buildTime,\n treeshakingEffective,\n };\n}\n\nfunction createEsbuildOptions(\n buildOptions: BuildOptions,\n entryPath: string,\n outputPath: string,\n tempDir: string,\n packagePaths: Map<string, string>,\n logger: Logger,\n): esbuild.BuildOptions {\n // Don't use aliases - they cause esbuild to bundle even external packages\n // Instead, use absWorkingDir to point to temp directory where node_modules is\n const alias: Record<string, string> = {};\n\n const baseOptions: esbuild.BuildOptions = {\n entryPoints: [entryPath],\n bundle: true,\n format: buildOptions.format as esbuild.Format,\n platform: buildOptions.platform as esbuild.Platform,\n outfile: outputPath,\n absWorkingDir: tempDir, // Resolve modules from temp directory\n // alias removed - not needed with absWorkingDir\n mainFields: ['module', 'main'], // Prefer ESM over CJS\n treeShaking: true,\n logLevel: 'error',\n minify: buildOptions.minify,\n sourcemap: buildOptions.sourcemap,\n resolveExtensions: ['.mjs', '.js', '.ts', '.json'], // Prefer .mjs\n\n // Enhanced minification options when minify is enabled\n ...(buildOptions.minify && {\n minifyWhitespace: buildOptions.minifyOptions?.whitespace ?? true,\n minifyIdentifiers: buildOptions.minifyOptions?.identifiers ?? true,\n minifySyntax: buildOptions.minifyOptions?.syntax ?? true,\n legalComments: buildOptions.minifyOptions?.legalComments ?? 'none',\n keepNames: buildOptions.minifyOptions?.keepNames ?? false,\n charset: 'utf8',\n }),\n };\n\n // Platform-specific configurations\n if (buildOptions.platform === 'browser') {\n baseOptions.define = {\n 'process.env.NODE_ENV': '\"production\"',\n global: 'globalThis',\n };\n // For browser bundles, let users handle Node.js built-ins as needed\n baseOptions.external = buildOptions.external || [];\n } else if (buildOptions.platform === 'node') {\n // For Node.js bundles, mark Node built-ins as external\n const nodeBuiltins = [\n 'crypto',\n 'fs',\n 'path',\n 'os',\n 'util',\n 'stream',\n 'buffer',\n 'events',\n 'http',\n 'https',\n 'url',\n 'querystring',\n 'zlib',\n ];\n // Mark runtime dependencies as external\n // These packages are installed in the Docker container and should not be bundled\n // - express/cors: Runtime dependencies for server sources\n // Note: zod is bundled inline via @walkeros/core (not marked external)\n // Use wildcard patterns to match both ESM and CJS imports\n const npmPackages = ['express', 'express/*', 'cors', 'cors/*'];\n // All downloaded @walkeros packages will be bundled into the output\n // Only Node.js built-ins and runtime server packages (express/cors) are marked external\n baseOptions.external = buildOptions.external\n ? [...nodeBuiltins, ...npmPackages, ...buildOptions.external]\n : [...nodeBuiltins, ...npmPackages];\n }\n\n // Set target if specified\n if (buildOptions.target) {\n baseOptions.target = buildOptions.target;\n } else if (buildOptions.platform === 'node') {\n baseOptions.target = 'node18';\n } else {\n baseOptions.target = 'es2018';\n }\n\n // Set global name for IIFE format\n if (buildOptions.globalName && buildOptions.format === 'iife') {\n baseOptions.globalName = buildOptions.globalName;\n }\n\n return baseOptions;\n}\n\n// Helper function to convert package name to JS variable name\nfunction packageNameToVariable(packageName: string): string {\n return packageName\n .replace('@', '_')\n .replace(/[/-]/g, '_')\n .split('_')\n .map((part, i) =>\n i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n )\n .join('');\n}\n\nasync function createEntryPoint(\n flowConfig: Flow.Config,\n buildOptions: BuildOptions,\n packagePaths: Map<string, string>,\n): Promise<string> {\n // Generate import statements from packages\n const importStatements: string[] = [];\n const examplesMappings: string[] = [];\n\n // For simulation mode, automatically import examples from destination packages\n // This ensures examples are loaded in the SAME execution context as the bundle\n // preventing zod double-loading issues\n const destinationPackages = new Set<string>();\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n if (destinations) {\n for (const [destKey, destConfig] of Object.entries(destinations)) {\n // Require explicit package field - no inference for any packages\n if (\n typeof destConfig === 'object' &&\n destConfig !== null &&\n 'package' in destConfig &&\n typeof destConfig.package === 'string'\n ) {\n destinationPackages.add(destConfig.package);\n }\n // If no package field, skip auto-importing examples for this destination\n }\n }\n\n for (const [packageName, packageConfig] of Object.entries(\n buildOptions.packages,\n )) {\n if (packageConfig.imports && packageConfig.imports.length > 0) {\n // Remove duplicates within the same package\n const uniqueImports = [...new Set(packageConfig.imports)];\n\n // Handle special \"default as X\" syntax\n const defaultImports: string[] = [];\n const namedImports: string[] = [];\n\n for (const imp of uniqueImports) {\n if (imp.startsWith('default as ')) {\n defaultImports.push(imp.replace('default as ', ''));\n } else {\n namedImports.push(imp);\n }\n }\n\n // Generate import statements\n if (defaultImports.length > 0) {\n for (const defaultImport of defaultImports) {\n importStatements.push(\n `import ${defaultImport} from '${packageName}';`,\n );\n }\n }\n\n if (namedImports.length > 0) {\n const importList = namedImports.join(', ');\n importStatements.push(\n `import { ${importList} } from '${packageName}';`,\n );\n }\n\n // Check if this package imports examples and create mappings\n const examplesImport = uniqueImports.find((imp) =>\n imp.includes('examples as '),\n );\n if (examplesImport) {\n // Extract destination name and examples variable name\n // Format: \"examples as gtagExamples\" -> gtagExamples\n const examplesVarName = examplesImport.split(' as ')[1];\n // Get destination name from package (assumes @walkeros/web-destination-xxx format)\n const destinationMatch = packageName.match(\n /@walkeros\\/web-destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n examplesMappings.push(\n ` ${destinationName}: typeof ${examplesVarName} !== 'undefined' ? ${examplesVarName} : undefined`,\n );\n }\n }\n } else {\n // No imports specified - import as namespace with a warning comment\n // User should specify explicit imports for better tree-shaking\n const varName = packageNameToVariable(packageName);\n importStatements.push(\n `import * as ${varName} from '${packageName}'; // Consider specifying explicit imports`,\n );\n }\n\n // Auto-import examples for destination packages\n if (destinationPackages.has(packageName)) {\n const destinationMatch = packageName.match(\n /@walkeros\\/(?:(?:web|server)-)?destination-(.+)$/,\n );\n if (destinationMatch) {\n const destinationName = destinationMatch[1];\n const examplesVarName = `${destinationName.replace(/-/g, '_')}_examples`;\n // Try importing from /examples subpath first (standard packages)\n // Fall back to importing { examples } from main module (demo packages)\n const isDemoPackage = packageName.includes('-demo');\n if (isDemoPackage) {\n importStatements.push(\n `import { examples as ${examplesVarName} } from '${packageName}';`,\n );\n } else {\n importStatements.push(\n `import * as ${examplesVarName} from '${packageName}/examples';`,\n );\n }\n examplesMappings.push(` ${destinationName}: ${examplesVarName}`);\n }\n }\n }\n\n // Create examples object if we have any mappings\n const examplesObject =\n examplesMappings.length > 0\n ? `const examples = {\\n${examplesMappings.join(',\\n')}\\n};\\n\\n`\n : '';\n\n // Separate imports from template processing\n const importsCode = importStatements.join('\\n');\n\n // Apply template if configured, otherwise just use code directly\n let templatedCode: string;\n if (buildOptions.template) {\n const templateEngine = new TemplateEngine();\n const flowWithProps = flowConfig as unknown as {\n sources?: Record<string, unknown>;\n destinations?: Record<string, unknown>;\n collector?: Record<string, unknown>;\n };\n templatedCode = await templateEngine.process(\n buildOptions.template,\n buildOptions.code, // Pass user code as parameter\n (flowWithProps.sources || {}) as unknown as Record<\n string,\n SourceDestinationItem\n >,\n (flowWithProps.destinations || {}) as unknown as Record<\n string,\n SourceDestinationItem\n >,\n (flowWithProps.collector || {}) as unknown as Record<string, unknown>,\n buildOptions as unknown as Record<string, unknown>, // Pass build config to template\n );\n } else {\n // No template - just use the code directly\n templatedCode = buildOptions.code;\n }\n\n // Apply module format wrapping if needed\n let wrappedCode = templatedCode;\n\n // Check if code already has any export statements (default, named, etc.)\n const hasExport = /^\\s*export\\s/m.test(templatedCode);\n\n if (!hasExport) {\n if (buildOptions.format === 'esm') {\n // Export as default for ESM\n wrappedCode = `export default ${templatedCode}`;\n } else if (buildOptions.platform === 'browser' && buildOptions.globalName) {\n // Assign to window for browser builds with globalName\n wrappedCode = `window['${buildOptions.globalName}'] = ${templatedCode}`;\n }\n }\n\n // Combine imports, examples object, and wrapped code\n let finalCode = importsCode\n ? `${importsCode}\\n\\n${examplesObject}${wrappedCode}`\n : `${examplesObject}${wrappedCode}`;\n\n // If we have examples, export them as a named export\n if (examplesObject && buildOptions.format === 'esm') {\n finalCode += `\\n\\nexport { examples };`;\n }\n\n return finalCode;\n}\n\ninterface EsbuildError {\n errors?: Array<{\n text: string;\n location?: {\n file: string;\n line: number;\n column: number;\n };\n }>;\n message?: string;\n}\n\nfunction createBuildError(buildError: EsbuildError, code: string): Error {\n if (!buildError.errors || buildError.errors.length === 0) {\n return new Error(`Build failed: ${buildError.message || buildError}`);\n }\n\n const firstError = buildError.errors[0];\n const location = firstError.location;\n\n if (location && location.file && location.file.includes('entry.js')) {\n // Error is in our generated entry point (code)\n const line = location.line;\n const column = location.column;\n const codeLines = code.split('\\n');\n const errorLine = codeLines[line - 1] || '';\n\n return new Error(\n `Code syntax error at line ${line}, column ${column}:\\n` +\n ` ${errorLine}\\n` +\n ` ${' '.repeat(column - 1)}^\\n` +\n `${firstError.text}`,\n );\n }\n\n // Error is in package code or other build issue\n return new Error(\n `Build error: ${firstError.text}\\n` +\n (location\n ? ` at ${location.file}:${location.line}:${location.column}`\n : ''),\n );\n}\n","import pacote from 'pacote';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { Logger } from '../../core';\n\nexport interface Package {\n name: string;\n version: string;\n}\n\n/**\n * Gets the proper node_modules directory path for a package.\n * Creates standard npm structure: node_modules/@scope/package or node_modules/package\n * Supports multiple versions by appending version to non-scoped packages if needed.\n *\n * @example\n * getPackageDirectory('node_modules', '@walkeros/core', '0.2.0')\n * // ā 'node_modules/@walkeros/core'\n *\n * getPackageDirectory('node_modules', 'lodash', '4.17.21')\n * // ā 'node_modules/lodash'\n */\nfunction getPackageDirectory(\n baseDir: string,\n packageName: string,\n version: string,\n): string {\n // For scoped packages like @walkeros/core, preserve the scope structure\n // This creates: node_modules/@walkeros/core (standard npm structure)\n return path.join(baseDir, 'node_modules', packageName);\n}\n\nfunction getCachedPackagePath(pkg: Package, tempDir: string): string {\n const cacheDir = path.join('.tmp', 'cache', 'packages');\n // Use safe file system name for cache (replace / with -)\n const safeName = pkg.name.replace(/\\//g, '-').replace(/@/g, '');\n return path.join(cacheDir, `${safeName}-${pkg.version}`);\n}\n\nasync function isPackageCached(\n pkg: Package,\n tempDir: string,\n): Promise<boolean> {\n const cachedPath = getCachedPackagePath(pkg, tempDir);\n return fs.pathExists(cachedPath);\n}\n\nfunction validateNoDuplicatePackages(packages: Package[]): void {\n const packageMap = new Map<string, string[]>();\n\n // Group packages by name and collect their versions\n for (const pkg of packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, []);\n }\n packageMap.get(pkg.name)!.push(pkg.version);\n }\n\n // Check for duplicate packages with different versions\n const conflicts: string[] = [];\n for (const [name, versions] of packageMap.entries()) {\n const uniqueVersions = [...new Set(versions)];\n if (uniqueVersions.length > 1) {\n conflicts.push(`${name}: [${uniqueVersions.join(', ')}]`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(\n `Version conflicts detected:\\n${conflicts.map((c) => ` - ${c}`).join('\\n')}\\n\\n` +\n 'Each package must use the same version across all declarations. ' +\n 'Please update your configuration to use consistent versions.',\n );\n }\n}\n\n/**\n * Recursively resolve and download package dependencies\n */\nasync function resolveDependencies(\n pkg: Package,\n packageDir: string,\n logger: Logger,\n visited: Set<string> = new Set(),\n): Promise<Package[]> {\n const dependencies: Package[] = [];\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (visited.has(pkgKey)) {\n return dependencies;\n }\n visited.add(pkgKey);\n\n try {\n const packageJsonPath = path.join(packageDir, 'package.json');\n if (await fs.pathExists(packageJsonPath)) {\n const packageJson = await fs.readJson(packageJsonPath);\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.peerDependencies,\n };\n\n for (const [name, versionSpec] of Object.entries(deps)) {\n if (typeof versionSpec === 'string') {\n // Use the version spec as-is (pacote will resolve it)\n // This respects the package.json dependency requirements\n dependencies.push({ name, version: versionSpec });\n }\n }\n }\n } catch (error) {\n logger.debug(`Failed to read dependencies for ${pkgKey}: ${error}`);\n }\n\n return dependencies;\n}\n\nexport async function downloadPackages(\n packages: Package[],\n targetDir: string,\n logger: Logger,\n useCache = true,\n): Promise<Map<string, string>> {\n const packagePaths = new Map<string, string>();\n const downloadQueue: Package[] = [...packages];\n const processed = new Set<string>();\n\n // Validate no duplicate packages with different versions in initial list\n validateNoDuplicatePackages(packages);\n\n // Ensure target directory exists\n await fs.ensureDir(targetDir);\n\n while (downloadQueue.length > 0) {\n const pkg = downloadQueue.shift()!;\n const pkgKey = `${pkg.name}@${pkg.version}`;\n\n if (processed.has(pkgKey)) {\n continue;\n }\n processed.add(pkgKey);\n const packageSpec = `${pkg.name}@${pkg.version}`;\n // Use proper node_modules structure: node_modules/@scope/package\n const packageDir = getPackageDirectory(targetDir, pkg.name, pkg.version);\n const cachedPath = getCachedPackagePath(pkg, targetDir);\n\n if (useCache && (await isPackageCached(pkg, targetDir))) {\n logger.debug(`Using cached ${packageSpec}...`);\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n await fs.copy(cachedPath, packageDir);\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies for cached package too\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n continue;\n } catch (error) {\n logger.debug(\n `Failed to use cache for ${packageSpec}, downloading fresh: ${error}`,\n );\n }\n }\n\n logger.debug(`Downloading ${packageSpec}...`);\n\n try {\n // Ensure parent directories exist for scoped packages (@scope/package)\n await fs.ensureDir(path.dirname(packageDir));\n\n // Extract package to proper node_modules structure\n // Use environment variable for cache location (Docker-friendly)\n const cacheDir =\n process.env.NPM_CACHE_DIR || path.join(process.cwd(), '.npm-cache');\n await pacote.extract(packageSpec, packageDir, {\n // Force npm registry download, prevent workspace resolution\n registry: 'https://registry.npmjs.org',\n\n // Force online fetching from registry (don't use cached workspace packages)\n preferOnline: true,\n\n // Cache for performance\n cache: cacheDir,\n\n // Don't resolve relative to workspace context\n where: undefined,\n });\n\n // Cache the downloaded package for future use\n if (useCache) {\n try {\n await fs.ensureDir(path.dirname(cachedPath));\n await fs.copy(packageDir, cachedPath);\n logger.debug(`Cached ${packageSpec} for future use`);\n } catch (cacheError) {\n logger.debug(`Failed to cache ${packageSpec}: ${cacheError}`);\n }\n }\n\n packagePaths.set(pkg.name, packageDir);\n\n // Resolve and queue dependencies\n const deps = await resolveDependencies(pkg, packageDir, logger);\n for (const dep of deps) {\n const depKey = `${dep.name}@${dep.version}`;\n if (!processed.has(depKey)) {\n downloadQueue.push(dep);\n }\n }\n } catch (error) {\n throw new Error(`Failed to download ${packageSpec}: ${error}`);\n }\n }\n\n return packagePaths;\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport Handlebars from 'handlebars';\nimport type { SourceDestinationItem } from '../../types/template';\nimport { processTemplateVariables } from './serializer';\n\nexport class TemplateEngine {\n private handlebars: typeof Handlebars;\n\n constructor() {\n // Create a new Handlebars instance\n this.handlebars = Handlebars.create();\n }\n\n /**\n * Load template content from file path\n */\n async loadTemplate(templatePath: string): Promise<string> {\n const resolvedPath = path.resolve(templatePath);\n\n if (!(await fs.pathExists(resolvedPath))) {\n throw new Error(`Template file not found: ${resolvedPath}`);\n }\n\n return await fs.readFile(resolvedPath, 'utf-8');\n }\n\n /**\n * Apply template with user code and variable substitution\n */\n applyTemplate(\n template: string,\n userCode: string,\n sources: Record<string, SourceDestinationItem>,\n destinations: Record<string, SourceDestinationItem>,\n collector: Record<string, unknown>,\n build?: Record<string, unknown>,\n ): string {\n // Process template variables to serialize config objects\n const processedVariables = processTemplateVariables({\n sources,\n destinations,\n collector,\n });\n\n // Prepare template data for Handlebars\n const templateData: Record<string, unknown> = {\n CODE: userCode,\n build: build || {},\n ...processedVariables,\n };\n\n // Compile and execute the template\n const compiledTemplate = this.handlebars.compile(template);\n return compiledTemplate(templateData);\n }\n\n /**\n * Process template with user code\n */\n async process(\n templatePath: string,\n userCode: string,\n sources: Record<string, SourceDestinationItem>,\n destinations: Record<string, SourceDestinationItem>,\n collector: Record<string, unknown>,\n build?: Record<string, unknown>,\n ): Promise<string> {\n const template = await this.loadTemplate(templatePath);\n return this.applyTemplate(\n template,\n userCode,\n sources,\n destinations,\n collector,\n build,\n );\n }\n}\n","/**\n * JSON to JavaScript serializer for config objects\n * Converts JSON objects to valid JavaScript code for use in templates\n */\n\nimport { isObject } from '../../config';\nimport type {\n TemplateSource,\n TemplateDestination,\n ProcessedTemplateVariables,\n} from '../../types/template';\n\nexport interface SerializerOptions {\n indent?: number;\n singleQuotes?: boolean;\n}\n\n/**\n * Serialize a value to JavaScript code\n */\nexport function serializeToJS(\n value: unknown,\n options: SerializerOptions = {},\n): string {\n const { indent = 2, singleQuotes = false } = options;\n const quote = singleQuotes ? \"'\" : '\"';\n\n function serialize(val: unknown, currentIndent = 0): string {\n if (val === null) return 'null';\n if (val === undefined) return 'undefined';\n\n if (typeof val === 'boolean' || typeof val === 'number') {\n return String(val);\n }\n\n if (typeof val === 'string') {\n // Check if string contains arrow function syntax\n if (val.includes('=>')) {\n // More comprehensive check for arrow function patterns\n const arrowPatterns = [\n /^\\s*\\([^)]*\\)\\s*=>/, // (param) => or () =>\n /^\\s*\\w+\\s*=>/, // param =>\n /^\\s*\\([^)]*\\)\\s*=>\\s*\\{/, // (param) => {\n /^\\s*\\w+\\s*=>\\s*\\{/, // param => {\n ];\n\n if (arrowPatterns.some((pattern) => pattern.test(val))) {\n // Likely a function - return as-is without quotes\n return val;\n }\n }\n // Regular string - escape and quote\n return (\n quote +\n val.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"') +\n quote\n );\n }\n\n if (Array.isArray(val)) {\n if (val.length === 0) return '[]';\n\n const nextIndent = currentIndent + indent;\n const spacing = ' '.repeat(nextIndent);\n const items = val\n .map((item) => spacing + serialize(item, nextIndent))\n .join(',\\n');\n\n return `[\\n${items}\\n${' '.repeat(currentIndent)}]`;\n }\n\n if (isObject(val)) {\n const entries = Object.entries(val);\n if (entries.length === 0) return '{}';\n\n const nextIndent = currentIndent + indent;\n const spacing = ' '.repeat(nextIndent);\n\n const props = entries\n .map(([key, value]) => {\n // Check if key needs quotes (contains special characters or starts with number)\n const needsQuotes = /[^a-zA-Z0-9_$]/.test(key) || /^[0-9]/.test(key);\n const keyStr = needsQuotes ? quote + key + quote : key;\n\n return spacing + keyStr + ': ' + serialize(value, nextIndent);\n })\n .join(',\\n');\n\n return `{\\n${props}\\n${' '.repeat(currentIndent)}}`;\n }\n\n // Fallback for other types\n return String(val);\n }\n\n return serialize(value);\n}\n\n/**\n * Serialize config object for template usage\n * Handles special cases for walkerOS configurations\n */\nexport function serializeConfig(config: Record<string, unknown>): string {\n // Handle empty config\n if (!config || Object.keys(config).length === 0) {\n return '{}';\n }\n\n return serializeToJS(config, { indent: 2, singleQuotes: true });\n}\n\n/**\n * Process template variables to serialize config objects\n */\nexport function processTemplateVariables(\n variables: Record<string, unknown>,\n): ProcessedTemplateVariables {\n const processed = { ...variables };\n\n // Process sources object\n if (isObject(processed.sources)) {\n const sourcesObj = processed.sources as Record<string, unknown>;\n const processedSources: Record<string, TemplateSource> = {};\n\n for (const [name, source] of Object.entries(sourcesObj)) {\n const typedSource = source as TemplateSource;\n const { env: _, ...sourceWithoutEnv } = typedSource;\n processedSources[name] = {\n ...sourceWithoutEnv,\n config: isObject(typedSource.config)\n ? serializeConfig(typedSource.config)\n : typedSource.config, // Pass through string configs unchanged\n ...(typedSource.env !== undefined && { env: typedSource.env }),\n };\n }\n\n processed.sources = processedSources;\n }\n\n // Process destinations object\n if (isObject(processed.destinations)) {\n const destinationsObj = processed.destinations as Record<string, unknown>;\n const processedDestinations: Record<string, TemplateDestination> = {};\n\n for (const [name, dest] of Object.entries(destinationsObj)) {\n const typedDest = dest as TemplateDestination;\n const { env: _, ...destWithoutEnv } = typedDest;\n processedDestinations[name] = {\n ...destWithoutEnv,\n config: isObject(typedDest.config)\n ? serializeConfig(typedDest.config)\n : typedDest.config,\n ...(typedDest.env !== undefined && { env: typedDest.env }),\n };\n }\n\n processed.destinations = processedDestinations;\n }\n\n // Process collector object (if present)\n if (isObject(processed.collector)) {\n processed.collector = serializeConfig(\n processed.collector as Record<string, unknown>,\n );\n }\n\n return processed;\n}\n","/**\n * Bundle statistics display utilities\n */\nimport { formatBytes } from '../../core';\nimport type { BundleStats } from './bundler';\nimport type { Logger } from '../../core';\n\n/**\n * Display detailed bundle statistics to console\n */\nexport function displayStats(stats: BundleStats, logger: Logger): void {\n logger.info('\\nš Bundle Statistics');\n logger.info('ā'.repeat(50));\n\n // Total size\n const sizeKB = formatBytes(stats.totalSize);\n logger.info(`Total Size: ${sizeKB} KB`);\n\n // Build time\n const timeSeconds = (stats.buildTime / 1000).toFixed(2);\n logger.info(`Build Time: ${timeSeconds}s`);\n\n // Tree-shaking effectiveness\n const treeshakingStatus = stats.treeshakingEffective\n ? 'ā
Effective'\n : 'ā ļø Not optimal (consider using named imports)';\n logger.info(`Tree-shaking: ${treeshakingStatus}`);\n\n // Package breakdown\n if (stats.packages.length > 0) {\n logger.info(`\\nPackage Breakdown:`);\n stats.packages.forEach((pkg) => {\n if (pkg.size > 0) {\n const pkgSizeKB = formatBytes(pkg.size);\n logger.info(` ⢠${pkg.name}: ${pkgSizeKB} KB`);\n }\n });\n }\n\n logger.info('ā'.repeat(50));\n}\n\n/**\n * Create stats summary for JSON output\n */\nexport function createStatsSummary(stats: BundleStats) {\n return {\n totalSize: stats.totalSize,\n totalSizeFormatted: `${formatBytes(stats.totalSize)} KB`,\n buildTime: stats.buildTime,\n buildTimeFormatted: `${(stats.buildTime / 1000).toFixed(2)}s`,\n treeshakingEffective: stats.treeshakingEffective,\n packageCount: stats.packages.length,\n packages: stats.packages.map((pkg) => ({\n name: pkg.name,\n size: pkg.size,\n sizeFormatted: `${formatBytes(pkg.size)} KB`,\n })),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { Flow } from '@walkeros/core';\nimport { createLogger } from '../../core';\nimport {\n loadJsonConfig,\n getTempDir,\n isObject,\n parseBundleConfig,\n type BuildOptions,\n} from '../../config';\nimport { bundleCore } from '../bundle/bundler';\nimport { downloadPackages } from '../bundle/package-manager';\nimport { CallTracker } from './tracker';\nimport type { SimulateCommandOptions, SimulationResult } from './types';\n\n/**\n * Generate a unique ID for temp files\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Main simulation orchestrator\n */\nexport async function simulateCore(\n configPath: string,\n event: unknown,\n options: Pick<SimulateCommandOptions, 'json' | 'verbose' | 'silent'> = {},\n): Promise<SimulationResult> {\n const logger = createLogger({\n verbose: options.verbose || false,\n silent: options.silent || false,\n json: options.json || false,\n });\n\n try {\n logger.info('šÆ Starting walkerOS simulation...');\n\n // Load and validate configuration\n logger.info('š¦ Loading bundle configuration...');\n const fullConfigPath = path.resolve(configPath);\n const rawConfig = await loadJsonConfig(fullConfigPath);\n parseBundleConfig(rawConfig); // Validate config format\n\n // Execute simulation\n logger.info(`š Executing simulation with event: ${JSON.stringify(event)}`);\n const result = await executeSimulation(event, fullConfigPath);\n\n // Report results\n if (result.success) {\n logger.info(`ā
Simulation completed successfully`);\n } else {\n logger.error(`ā Simulation failed: ${result.error}`);\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`š„ Simulation error: ${errorMessage}`);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n}\n\n/**\n * Parse event input - handles both strings and JSON objects\n */\nexport function parseEventInput(eventString: string = ''): unknown {\n if (!eventString) {\n return {};\n }\n\n // Try to parse as JSON first\n try {\n const parsed = JSON.parse(eventString);\n return isObject(parsed) ? parsed : {};\n } catch {\n // If JSON parsing fails, treat as event name string\n return { name: eventString };\n }\n}\n\n/**\n * Simple result formatting\n */\nexport function formatSimulationResult(\n result: SimulationResult,\n options: Pick<SimulateCommandOptions, 'json'> = {},\n): string {\n if (options.json) {\n const output = {\n result: result.elbResult,\n usage: result.usage,\n duration: result.duration,\n };\n return JSON.stringify(output, null, 2);\n }\n\n if (result.success) {\n return 'ā
Simulation completed successfully';\n } else {\n return `ā Simulation failed: ${result.error}`;\n }\n}\n\n/**\n * Execute simulation using destination-provided mock environments\n */\nexport async function executeSimulation(\n event: unknown,\n configPath: string,\n): Promise<SimulationResult> {\n const startTime = Date.now();\n let bundlePath: string | undefined;\n const tempDir = getTempDir();\n\n try {\n // Ensure temp directory exists\n await fs.ensureDir(tempDir);\n\n // 1. Load config\n const rawConfig = await loadJsonConfig(configPath);\n const { flowConfig, buildOptions } = parseBundleConfig(rawConfig);\n\n // 2. Download packages to temp directory\n // This ensures we use clean npm packages, not workspace packages\n const packagesArray = Object.entries(buildOptions.packages).map(\n ([name, packageConfig]) => ({\n name,\n version:\n (typeof packageConfig === 'object' &&\n packageConfig !== null &&\n 'version' in packageConfig &&\n typeof packageConfig.version === 'string'\n ? packageConfig.version\n : undefined) || 'latest',\n }),\n );\n const packagePaths = await downloadPackages(\n packagesArray,\n tempDir, // downloadPackages will add 'node_modules' subdirectory itself\n createLogger({ silent: true }),\n buildOptions.cache,\n );\n\n // 3. Create tracker\n const tracker = new CallTracker();\n\n // 4. Prepare env setup code to inject into bundle\n // The bundle will import examples, so we can reference them directly in the injected code\n const envSetupCode: string[] = [];\n\n const destinations = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n if (destinations) {\n for (const [key, dest] of Object.entries(destinations)) {\n // Generate code to wrap env using examples imported IN THE BUNDLE\n const destName = key.replace(/-/g, '_');\n envSetupCode.push(`\n // Inject tracked env for destination '${key}' using examples from bundle\n if (examples && examples['${key}'] && examples['${key}'].env) {\n const mockEnv = examples['${key}'].env.push;\n const trackPaths = examples['${key}'].env.simulation || [];\n if (mockEnv) {\n const wrappedPaths = trackPaths.map((p) => '${key}:' + p);\n const trackedEnv = __simulationTracker.wrapEnv(mockEnv, wrappedPaths);\n if (config.destinations && config.destinations['${key}']) {\n config.destinations['${key}'].env = trackedEnv;\n }\n }\n }\n`);\n }\n }\n\n // 5. Inject env setup code BEFORE startFlow\n // Note: __simulationTracker will be provided via factory function parameter\n const modifiedCode = `\n// Inject tracked envs into destination configs\n${envSetupCode.join('\\n')}\n\n${buildOptions.code || ''}\n`;\n\n // 7. Create temporary bundle with downloaded packages\n const tempOutput = path.join(\n tempDir,\n `simulation-bundle-${generateId()}.mjs`,\n );\n\n // Create modified build options for simulation\n const simulationBuildOptions: BuildOptions = {\n ...buildOptions,\n code: modifiedCode,\n output: tempOutput,\n tempDir, // Use same temp dir for bundle\n format: 'esm' as const,\n // Force node platform for simulation since we're running in Node.js\n platform: 'node' as const,\n };\n\n // 8. Bundle with downloaded packages (they're already in tempDir/node_modules)\n await bundleCore(\n flowConfig,\n simulationBuildOptions,\n createLogger({ silent: true }),\n false,\n );\n bundlePath = tempOutput;\n\n // 9. Inject minimal globals for Node simulation environment\n // This allows destinations to reference window/document without errors\n const globalWithSim = globalThis as Record<string, unknown>;\n if (!globalWithSim.window) {\n globalWithSim.window = {};\n }\n if (!globalWithSim.document) {\n globalWithSim.document = {};\n }\n\n // 10. Dynamic import the bundle\n const timestamp = Date.now();\n const moduleUrl = `file://${bundlePath}?t=${timestamp}`;\n const module = await import(moduleUrl);\n\n // 11. Populate globals with destination-specific mocks from examples\n // This happens AFTER import so we can access the exported examples\n const importedExamples = module.examples;\n const destinations2 = (\n flowConfig as unknown as { destinations?: Record<string, unknown> }\n ).destinations;\n if (importedExamples && destinations2) {\n for (const [key, dest] of Object.entries(destinations2)) {\n const destEnv = importedExamples[key]?.env?.push;\n if (destEnv) {\n if (\n destEnv.window &&\n typeof globalWithSim.window === 'object' &&\n globalWithSim.window !== null\n ) {\n Object.assign(globalWithSim.window, destEnv.window);\n }\n if (\n destEnv.document &&\n typeof globalWithSim.document === 'object' &&\n globalWithSim.document !== null\n ) {\n Object.assign(globalWithSim.document, destEnv.document);\n }\n }\n }\n }\n\n // 12. Call bundle factory function with tracker\n const flowResult = await module.default({ tracker });\n if (!flowResult || typeof flowResult.elb !== 'function') {\n throw new Error(\n 'Bundle did not export valid flow object with elb function',\n );\n }\n\n const { elb } = flowResult;\n\n // 13. Execute the event\n const elbResult = await elb(event);\n\n // 14. Retrieve tracked calls from tracker instance\n const usage = tracker.getCalls();\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n elbResult,\n usage,\n duration,\n logs: [],\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n duration,\n };\n } finally {\n // Cleanup temp directory and all its contents\n if (tempDir) {\n await fs.remove(tempDir).catch(() => {\n // Ignore cleanup errors - temp dirs will be cleaned eventually\n });\n }\n\n // Cleanup injected globals\n const globalWithSim = globalThis as Record<string, unknown>;\n delete globalWithSim.window;\n delete globalWithSim.document;\n }\n}\n","/**\n * Call Tracker for Simulation\n *\n * Wraps mock environment functions to track API calls.\n * Used with destination-provided examples/env.ts mocks.\n */\n\nexport interface ApiCall {\n type: 'call';\n path: string;\n args: unknown[];\n timestamp: number;\n}\n\nexport class CallTracker {\n private calls: Map<string, ApiCall[]> = new Map();\n\n /**\n * Wrap a function to track its calls\n */\n wrapFunction(\n name: string,\n fn?: (...args: unknown[]) => unknown,\n ): (...args: unknown[]) => unknown {\n const self = this;\n const targetFn = fn || (() => {});\n\n return new Proxy(targetFn, {\n apply(_target, thisArg, args: unknown[]) {\n self.logCall(name, args);\n return targetFn.apply(thisArg, args);\n },\n });\n }\n\n /**\n * Wrap an environment object, tracking specified paths\n *\n * @param env - Environment object (from destination's examples/env.ts)\n * @param paths - Paths to track (e.g., ['gtag:window.gtag', 'gtag:window.dataLayer.push'])\n */\n wrapEnv<T extends Record<string, unknown>>(env: T, paths: string[]): T {\n const wrapped: Record<string, unknown> = {};\n\n // Deep clone the env object first\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'object' && value !== null) {\n wrapped[key] = Array.isArray(value)\n ? [...value]\n : { ...(value as Record<string, unknown>) };\n } else {\n wrapped[key] = value;\n }\n }\n\n // Wrap specified paths\n for (const fullPath of paths) {\n // Parse path: \"gtag:window.gtag\" ā destKey=\"gtag\", path=\"window.gtag\"\n const [destKey, ...pathParts] = fullPath.split(':');\n const path = pathParts.join(':');\n\n if (!path) continue;\n\n // Remove \"call:\" prefix if present (from simulation array)\n const cleanPath = path.replace(/^call:/, '');\n const parts = cleanPath.split('.');\n\n let current: Record<string, unknown> = wrapped;\n let source: Record<string, unknown> | undefined = env;\n\n // Navigate to parent object\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n\n if (!current[part]) {\n current[part] = {};\n }\n\n current = current[part] as Record<string, unknown>;\n source =\n source && typeof source[part] === 'object' && source[part] !== null\n ? (source[part] as Record<string, unknown>)\n : undefined;\n }\n\n // Wrap the final property\n const finalKey = parts[parts.length - 1];\n const originalFn = source?.[finalKey];\n\n // Wrap with full path for tracking\n current[finalKey] = this.wrapFunction(\n `${destKey}:${cleanPath}`,\n typeof originalFn === 'function'\n ? (originalFn as (...args: unknown[]) => unknown)\n : undefined,\n );\n }\n\n return wrapped as T;\n }\n\n private logCall(fullPath: string, args: unknown[]): void {\n // Parse \"destKey:api.path\" ā destKey and apiPath\n const [destKey, ...pathParts] = fullPath.split(':');\n const apiPath = pathParts.join(':');\n\n if (!this.calls.has(destKey)) {\n this.calls.set(destKey, []);\n }\n\n this.calls.get(destKey)!.push({\n type: 'call',\n path: apiPath,\n args,\n timestamp: Date.now(),\n });\n }\n\n getCalls(): Record<string, ApiCall[]> {\n return Object.fromEntries(this.calls);\n }\n\n reset(): void {\n this.calls.clear();\n }\n}\n","import {\n simulateCore,\n parseEventInput,\n formatSimulationResult,\n} from './simulator';\nimport { createLogger, executeCommand } from '../../core';\nimport type { SimulateCommandOptions } from './types';\n\n/**\n * CLI command handler for simulate command\n */\nexport async function simulateCommand(\n options: SimulateCommandOptions,\n): Promise<void> {\n const logger = createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n\n // Build Docker args - file path as first positional arg\n const dockerArgs = [options.config];\n if (options.event) dockerArgs.push('--event', options.event);\n if (options.json) dockerArgs.push('--json');\n if (options.verbose) dockerArgs.push('--verbose');\n if (options.silent) dockerArgs.push('--silent');\n\n await executeCommand(\n async () => {\n const startTime = Date.now();\n\n try {\n // Parse event input\n const event = parseEventInput(options.event);\n\n // Execute simulation\n const result = await simulateCore(options.config, event, {\n json: options.json,\n verbose: options.verbose,\n silent: options.silent,\n });\n\n // Add duration to result\n const resultWithDuration = {\n ...result,\n duration: (Date.now() - startTime) / 1000,\n };\n\n // Output results - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const output = formatSimulationResult(resultWithDuration, {\n json: options.json,\n });\n outputLogger.log('white', output);\n\n // Exit with error code if simulation failed\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n // JSON error output - create output logger that always logs\n const outputLogger = createLogger({ silent: false, json: false });\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: errorMessage,\n duration: (Date.now() - startTime) / 1000,\n },\n null,\n 2,\n );\n outputLogger.log('white', errorOutput);\n } else {\n // Error output - create error logger that always logs\n const errorLogger = createLogger({ silent: false, json: false });\n errorLogger.error(`ā Simulate command failed: ${errorMessage}`);\n }\n\n process.exit(1);\n }\n },\n 'simulate',\n dockerArgs,\n options,\n logger,\n options.config,\n );\n}\n\n/**\n * High-level simulate function for programmatic usage.\n *\n * Handles configuration loading internally and returns structured results.\n *\n * @param configOrPath - Bundle configuration object or path to config file\n * @param event - Event object to simulate\n * @param options - Simulation options\n * @param options.silent - Suppress all output (default: false)\n * @param options.verbose - Enable verbose logging (default: false)\n * @param options.json - Format output as JSON (default: false)\n * @returns Simulation result with success status, elb result, and usage data\n *\n * @example\n * ```typescript\n * // With config file\n * const result = await simulate('./walker.config.json', {\n * name: 'page view',\n * data: { title: 'Home Page', path: '/', url: 'https://example.com' }\n * });\n *\n * // With config object\n * const result = await simulate(\n * {\n * platform: 'web',\n * packages: { '@walkeros/collector': { imports: ['startFlow'] } },\n * code: '...',\n * output: './bundle.js'\n * },\n * { name: 'page view' },\n * { silent: true }\n * );\n * ```\n */\nexport async function simulate(\n configOrPath: string | unknown,\n event: unknown,\n options: {\n silent?: boolean;\n verbose?: boolean;\n json?: boolean;\n } = {},\n): Promise<import('./types').SimulationResult> {\n // simulateCore currently only accepts file paths, so we need to handle that\n // For now, if configOrPath is not a string, throw an error with guidance\n if (typeof configOrPath !== 'string') {\n throw new Error(\n 'simulate() currently only supports config file paths. ' +\n 'Config object support will be added in a future version. ' +\n 'Please provide a path to a configuration file.',\n );\n }\n\n // Call core simulator\n return await simulateCore(configOrPath, event, {\n json: options.json ?? false,\n verbose: options.verbose ?? false,\n });\n}\n\n// Re-export types and utilities for testing\nexport * from './types';\nexport * from './simulator';\n","/**\n * Run Command\n *\n * Runs walkerOS flows using @walkeros/docker as a library\n * No Docker daemon required - runs directly in Node.js\n */\n\nimport path from 'path';\nimport os from 'os';\nimport {\n runFlow,\n runServeMode,\n type RuntimeConfig,\n type ServeConfig,\n} from '@walkeros/docker';\nimport { bundle } from '../bundle';\nimport {\n createLogger,\n createTimer,\n getExecutionMode,\n executeRunInDocker,\n isDockerAvailable,\n} from '../../core';\nimport { loadJsonConfig } from '../../config';\nimport { validateMode, validateFlowFile, validatePort } from './validators';\nimport type {\n RunMode,\n RunCommandOptions,\n RunOptions,\n RunResult,\n} from './types';\n\n/**\n * CLI command function for `walkeros run`\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Command options\n */\nexport async function runCommand(\n mode: string,\n options: RunCommandOptions,\n): Promise<void> {\n const timer = createTimer();\n timer.start();\n\n const logger = createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n\n try {\n // Step 1: Validate inputs\n validateMode(mode);\n const configPath = validateFlowFile(options.config);\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Step 2: Determine if config is pre-built or needs bundling\n const isPreBuilt =\n configPath.endsWith('.mjs') ||\n configPath.endsWith('.js') ||\n configPath.endsWith('.cjs');\n\n let flowPath: string | null = null;\n\n if (mode === 'collect') {\n if (isPreBuilt) {\n // Use pre-built bundle directly\n flowPath = path.resolve(configPath);\n if (!options.json && !options.silent) {\n logger.info(`š¦ Using pre-built flow: ${path.basename(flowPath)}`);\n }\n } else {\n // Bundle JSON config first\n if (!options.json && !options.silent) {\n logger.info('šØ Building flow bundle...');\n }\n\n // Read config and modify output path\n const rawConfig = await loadJsonConfig(configPath);\n const tempPath = path.join(\n os.tmpdir(),\n `walkeros-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.mjs`,\n );\n\n // Ensure config has build.output set to temp path\n const existingBuild =\n typeof rawConfig === 'object' &&\n rawConfig !== null &&\n 'build' in rawConfig &&\n typeof (rawConfig as Record<string, unknown>).build === 'object'\n ? ((rawConfig as Record<string, unknown>).build as Record<\n string,\n unknown\n >)\n : {};\n\n const configWithOutput = {\n ...(rawConfig as Record<string, unknown>),\n build: {\n ...existingBuild,\n output: tempPath,\n },\n };\n\n await bundle(configWithOutput, {\n cache: true,\n verbose: options.verbose,\n silent: options.json || options.silent,\n });\n\n flowPath = tempPath;\n\n if (!options.json && !options.silent) {\n logger.success('ā
Bundle ready');\n }\n }\n }\n\n // Step 3: Execute based on mode\n const executionMode = getExecutionMode(options);\n\n if (executionMode === 'docker') {\n // Docker mode: Use production runtime image\n const dockerAvailable = await isDockerAvailable();\n if (!dockerAvailable) {\n throw new Error(\n 'Docker is not available. Please install Docker or use --local flag to execute locally.',\n );\n }\n\n if (!options.json && !options.silent) {\n logger.info('š³ Executing in production runtime container...');\n }\n\n await executeRunInDocker(mode as 'collect' | 'serve', flowPath, {\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n silent: options.silent,\n });\n } else {\n // Local mode: Use library functions\n if (!options.json && !options.silent) {\n const modeLabel = mode === 'collect' ? 'Collector' : 'Server';\n logger.info(`š„ļø Starting ${modeLabel} locally...`);\n }\n\n switch (mode) {\n case 'collect': {\n if (!flowPath) {\n throw new Error('Flow path is required for collect mode');\n }\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config);\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n };\n await runServeMode(config);\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n }\n\n // Note: Both Docker and local modes run forever, so we won't reach here unless they fail\n } catch (error) {\n const duration = timer.getElapsed() / 1000;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (options.json) {\n const output = {\n success: false,\n mode,\n error: errorMessage,\n duration,\n };\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(output, null, 2));\n } else {\n logger.error('ā Run failed:');\n logger.error(errorMessage);\n }\n process.exit(1);\n }\n}\n\n/**\n * Programmatic run function\n *\n * @param mode - Run mode (collect | serve)\n * @param options - Run options\n * @returns Run result\n *\n * @example\n * ```typescript\n * // Run with JSON config (bundles automatically)\n * await run('collect', {\n * config: './flow.json',\n * port: 8080\n * });\n *\n * // Run with pre-built bundle\n * await run('collect', {\n * config: './flow.mjs',\n * port: 8080\n * });\n * ```\n */\nexport async function run(\n mode: RunMode,\n options: RunOptions,\n): Promise<RunResult> {\n const startTime = Date.now();\n\n try {\n // Validate inputs\n validateMode(mode);\n\n let flowFile: string;\n if (typeof options.config === 'string') {\n flowFile = validateFlowFile(options.config);\n } else {\n throw new Error('Programmatic run() requires config file path');\n }\n\n if (options.port !== undefined) {\n validatePort(options.port);\n }\n\n // Determine if config is pre-built or needs bundling\n const isPreBuilt =\n flowFile.endsWith('.mjs') ||\n flowFile.endsWith('.js') ||\n flowFile.endsWith('.cjs');\n\n let flowPath: string;\n\n if (isPreBuilt) {\n flowPath = path.resolve(flowFile);\n } else {\n // Bundle JSON config\n const rawConfig = await loadJsonConfig(flowFile);\n const tempPath = path.join(\n os.tmpdir(),\n `walkeros-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.mjs`,\n );\n\n // Ensure config has build.output set to temp path\n const existingBuild =\n typeof rawConfig === 'object' &&\n rawConfig !== null &&\n 'build' in rawConfig &&\n typeof (rawConfig as Record<string, unknown>).build === 'object'\n ? ((rawConfig as Record<string, unknown>).build as Record<\n string,\n unknown\n >)\n : {};\n\n const configWithOutput = {\n ...(rawConfig as Record<string, unknown>),\n build: {\n ...existingBuild,\n output: tempPath,\n },\n };\n\n await bundle(configWithOutput, {\n cache: true,\n verbose: options.verbose,\n silent: true,\n });\n\n flowPath = tempPath;\n }\n\n // Run the flow using Docker package\n switch (mode) {\n case 'collect': {\n const config: RuntimeConfig = {\n port: options.port,\n host: options.host,\n };\n await runFlow(flowPath, config);\n break;\n }\n\n case 'serve': {\n const config: ServeConfig = {\n port: options.port,\n host: options.host,\n staticDir: options.staticDir,\n };\n await runServeMode(config);\n break;\n }\n\n default:\n throw new Error(`Unknown mode: ${mode}`);\n }\n\n // Success (though runFlow runs forever, so we typically don't reach here)\n return {\n success: true,\n exitCode: 0,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Export types\nexport type { RunMode, RunCommandOptions, RunOptions, RunResult };\n","/**\n * Run Command Validators\n *\n * Validation logic for run command inputs\n */\n\nimport { existsSync } from 'fs';\nimport { resolve } from 'path';\nimport type { RunMode } from './types';\n\n/**\n * Valid run modes\n */\nconst VALID_MODES: RunMode[] = ['collect', 'serve'];\n\n/**\n * Validates run mode\n *\n * @param mode - Mode to validate\n * @throws Error if mode is invalid\n */\nexport function validateMode(mode: string): asserts mode is RunMode {\n if (!VALID_MODES.includes(mode as RunMode)) {\n throw new Error(\n `Invalid mode: \"${mode}\"\\n` +\n ` Valid modes: ${VALID_MODES.join(', ')}\\n` +\n ` Example: walkeros run collect ./flow.json`,\n );\n }\n}\n\n/**\n * Validates flow file exists\n *\n * @param filePath - Path to flow configuration file\n * @returns Absolute path to flow file\n * @throws Error if file doesn't exist\n */\nexport function validateFlowFile(filePath: string): string {\n const absolutePath = resolve(filePath);\n\n if (!existsSync(absolutePath)) {\n throw new Error(\n `Flow file not found: ${filePath}\\n` +\n ` Resolved path: ${absolutePath}\\n` +\n ` Make sure the file exists and the path is correct`,\n );\n }\n\n return absolutePath;\n}\n\n/**\n * Validates port number\n *\n * @param port - Port number to validate\n * @throws Error if port is invalid\n */\nexport function validatePort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(\n `Invalid port: ${port}\\n` +\n ` Port must be an integer between 1 and 65535\\n` +\n ` Example: --port 8080`,\n );\n }\n}\n"],"mappings":"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","names":["path","resolve","resolve","path","path","path","path","path","fs","path","fs","fs","path","value","path","fs","path","fs","path","path","fs","path","path","fs","path","path"]}
|