@testdino/playwright 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/config-loader.ts","../../src/cli/config-detector.ts","../../src/cli/config-merger.ts","../../src/cli/arg-filter.ts","../../src/cli/temp-config.ts","../../src/cli/playwright-spawner.ts","../../src/cli/commands/test.ts","../../src/cli/index.ts"],"names":["join","existsSync","statSync","dirname","jiti","fileURLToPath","randomUUID","writeFileSync","unlinkSync","tmpdir","execa","__filename","__dirname","readFileSync","chalk","Command"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Config file loader for TestDino CLI\n * Searches for testdino.config.[ts|js] up the directory tree\n */\n\nimport { existsSync, statSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport jiti from 'jiti';\nimport type { ConfigFileContent } from './types.js';\n\nconst CONFIG_FILENAMES = ['testdino.config.ts', 'testdino.config.js'];\n\n/**\n * Result of config loading\n */\nexport interface ConfigLoadResult {\n config: ConfigFileContent;\n configPath?: string;\n}\n\n/**\n * Config loader class\n */\nexport class ConfigLoader {\n private cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = cwd;\n }\n\n /**\n * Load config file from current directory or parent directories\n */\n async load(): Promise<ConfigLoadResult> {\n const configPath = this.findConfigFile();\n\n if (!configPath) {\n return { config: {} };\n }\n\n try {\n const config = this.loadConfigFile(configPath);\n return { config, configPath };\n } catch (error) {\n throw new Error(\n `Failed to load config file: ${configPath}\\n${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Find config file by searching up directory tree\n * Stops at .git directory\n */\n private findConfigFile(): string | undefined {\n let currentDir = this.cwd;\n\n while (true) {\n // Check for config files in current directory\n for (const filename of CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n // Check if we've reached .git directory\n const gitDir = join(currentDir, '.git');\n if (existsSync(gitDir) && statSync(gitDir).isDirectory()) {\n // Check one more time in the git root directory\n for (const filename of CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n // Stop at git root\n break;\n }\n\n // Move to parent directory\n const parentDir = dirname(currentDir);\n\n // Stop if we've reached the root\n if (parentDir === currentDir) {\n break;\n }\n\n currentDir = parentDir;\n }\n\n return undefined;\n }\n\n /**\n * Load and parse config file using jiti\n */\n private loadConfigFile(configPath: string): ConfigFileContent {\n const jitiLoader = jiti(dirname(configPath), {\n interopDefault: true,\n cache: false,\n extensions: ['.ts', '.js'],\n });\n\n let loaded: unknown;\n try {\n // Use jiti's esmResolve to handle both ESM and CommonJS\n const resolved = jitiLoader.esmResolve(configPath, { try: true });\n if (!resolved) {\n throw new Error(`Could not resolve config file: ${configPath}`);\n }\n\n const resolvedPath = typeof resolved === 'string' ? resolved : fileURLToPath(resolved);\n loaded = jitiLoader(resolvedPath);\n } catch (error) {\n throw new Error(`Syntax error in config file:\\n${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Extract config from default export or direct export\n // Handle __esModule pattern from jiti\n let config: unknown;\n if (loaded && typeof loaded === 'object' && '__esModule' in loaded) {\n config = (loaded as Record<string, unknown>).default;\n } else if (loaded && typeof loaded === 'object' && 'default' in loaded) {\n // Handle case where jiti returns { default: value } without __esModule\n config = (loaded as Record<string, unknown>).default;\n } else {\n config = loaded;\n }\n\n // Handle null/undefined from default export\n if (config === null || config === undefined) {\n return {};\n }\n\n // Handle function configs\n if (typeof config === 'function') {\n try {\n config = config();\n } catch (error) {\n throw new Error(`Error executing config function:\\n${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Don't support async configs\n if (config instanceof Promise) {\n throw new Error('Async config functions are not supported');\n }\n\n // Handle null/undefined from function\n if (config === null || config === undefined) {\n return {};\n }\n }\n\n // Validate config structure\n if (config && typeof config !== 'object') {\n throw new Error('Config must be an object');\n }\n\n return config ?? {};\n }\n}\n","/**\n * Config detector for TestDino CLI\n * Detects and extracts TestdinoReporter configuration from playwright.config.[ts|js]\n */\n\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport jiti from 'jiti';\nimport type { TestdinoConfig } from '../types/index.js';\n\nconst PLAYWRIGHT_CONFIG_FILENAMES = ['playwright.config.ts', 'playwright.config.js'];\nconst TESTDINO_REPORTER_NAMES = ['@testdino/playwright', 'testdino-playwright', 'TestdinoReporter'];\n\n/**\n * Result of config detection\n */\nexport interface ConfigDetectionResult {\n hasReporter: boolean;\n options?: TestdinoConfig;\n configPath?: string;\n}\n\n/**\n * Playwright config structure (simplified)\n */\ninterface PlaywrightConfig {\n reporter?: ReporterConfig;\n [key: string]: unknown;\n}\n\n/**\n * Reporter configuration can be:\n * - string: 'html'\n * - [string]: ['html']\n * - [string, options]: ['html', { outputDir: 'report' }]\n * - Array of above\n */\ntype ReporterConfig = string | [string, Record<string, unknown>?] | Array<string | [string, Record<string, unknown>?]>;\n\n/**\n * Config detector class\n */\nexport class ConfigDetector {\n private cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = cwd;\n }\n\n /**\n * Detect TestdinoReporter in Playwright config\n */\n async detect(): Promise<ConfigDetectionResult> {\n const configPath = this.findPlaywrightConfig();\n\n if (!configPath) {\n return { hasReporter: false };\n }\n\n try {\n const config = this.loadPlaywrightConfig(configPath);\n const result = this.extractTestdinoReporter(config);\n\n return {\n ...result,\n configPath,\n };\n } catch (error) {\n throw new Error(\n `Failed to load Playwright config: ${configPath}\\n${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Find playwright.config.[ts|js] in current directory\n */\n private findPlaywrightConfig(): string | undefined {\n for (const filename of PLAYWRIGHT_CONFIG_FILENAMES) {\n const configPath = join(this.cwd, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n return undefined;\n }\n\n /**\n * Load and parse Playwright config using jiti\n */\n private loadPlaywrightConfig(configPath: string): PlaywrightConfig {\n const jitiLoader = jiti(dirname(configPath), {\n interopDefault: true,\n cache: false,\n extensions: ['.ts', '.js'],\n });\n\n let loaded: unknown;\n try {\n const resolved = jitiLoader.esmResolve(configPath, { try: true });\n if (!resolved) {\n throw new Error(`Could not resolve Playwright config: ${configPath}`);\n }\n\n const resolvedPath = typeof resolved === 'string' ? resolved : fileURLToPath(resolved);\n loaded = jitiLoader(resolvedPath);\n } catch (error) {\n throw new Error(`Syntax error in Playwright config:\\n${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Extract config from default export or direct export\n let config: unknown;\n if (loaded && typeof loaded === 'object' && '__esModule' in loaded) {\n config = (loaded as Record<string, unknown>).default;\n } else if (loaded && typeof loaded === 'object' && 'default' in loaded) {\n config = (loaded as Record<string, unknown>).default;\n } else {\n config = loaded;\n }\n\n // Handle function configs (Playwright supports this)\n if (typeof config === 'function') {\n try {\n config = config();\n } catch (error) {\n throw new Error(\n `Error executing Playwright config function:\\n${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n // Validate config structure\n if (!config || typeof config !== 'object') {\n throw new Error('Playwright config must be an object');\n }\n\n return config as PlaywrightConfig;\n }\n\n /**\n * Extract TestdinoReporter configuration from Playwright config\n */\n private extractTestdinoReporter(config: PlaywrightConfig): Omit<ConfigDetectionResult, 'configPath'> {\n const { reporter } = config;\n\n if (!reporter) {\n return { hasReporter: false };\n }\n\n // Handle single reporter as string\n if (typeof reporter === 'string') {\n if (this.isTestdinoReporter(reporter)) {\n return { hasReporter: true, options: {} };\n }\n return { hasReporter: false };\n }\n\n // Handle single reporter as tuple [name, options]\n if (Array.isArray(reporter) && reporter.length > 0) {\n // Check if it's a single reporter tuple: ['reporter-name', { options }]\n if (typeof reporter[0] === 'string') {\n const [name, options] = reporter as [string, Record<string, unknown>?];\n if (this.isTestdinoReporter(name)) {\n return {\n hasReporter: true,\n options: this.extractOptions(options),\n };\n }\n // If first element is string but not TestDino, might be array of reporters\n // Fall through to array handling\n }\n\n // Handle array of reporters\n for (const item of reporter) {\n if (typeof item === 'string') {\n if (this.isTestdinoReporter(item)) {\n return { hasReporter: true, options: {} };\n }\n } else if (Array.isArray(item) && item.length > 0) {\n const [name, options] = item as [string, Record<string, unknown>?];\n if (this.isTestdinoReporter(name)) {\n return {\n hasReporter: true,\n options: this.extractOptions(options),\n };\n }\n }\n }\n }\n\n return { hasReporter: false };\n }\n\n /**\n * Check if reporter name matches TestdinoReporter\n */\n private isTestdinoReporter(name: string): boolean {\n return TESTDINO_REPORTER_NAMES.some((testdinoName) => name === testdinoName || name.includes(testdinoName));\n }\n\n /**\n * Extract and validate TestdinoConfig options\n */\n private extractOptions(options?: Record<string, unknown>): TestdinoConfig {\n if (!options || typeof options !== 'object') {\n return {};\n }\n\n const config: TestdinoConfig = {};\n\n if ('token' in options && typeof options.token === 'string') {\n config.token = options.token;\n }\n\n if ('serverUrl' in options && typeof options.serverUrl === 'string') {\n config.serverUrl = options.serverUrl;\n }\n\n if ('ciBuildId' in options && typeof options.ciBuildId === 'string') {\n config.ciBuildId = options.ciBuildId;\n }\n\n if ('debug' in options && typeof options.debug === 'boolean') {\n config.debug = options.debug;\n }\n\n return config;\n }\n}\n","/**\n * Config merger for TestDino CLI\n * Merges configuration from multiple sources with proper precedence\n */\n\nimport { randomUUID } from 'crypto';\nimport type { CliOptions, MergedConfig, ConfigFileContent } from './types.js';\nimport type { TestdinoConfig } from '../types/index.js';\n\n/**\n * Config sources for merging\n */\nexport interface ConfigSources {\n env?: Partial<TestdinoConfig>;\n playwrightConfig?: TestdinoConfig;\n testdinoConfig?: ConfigFileContent;\n cliOptions?: CliOptions;\n}\n\n/**\n * Validation error\n */\nexport class ConfigValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * Config merger class\n * Merges configs with priority: CLI > testdino.config > playwright.config > env vars\n */\nexport class ConfigMerger {\n private static readonly DEFAULT_SERVER_URL = 'https://api.testdino.com';\n\n /**\n * Merge configurations from all sources\n * Priority (highest to lowest):\n * 1. CLI flags\n * 2. testdino.config.[ts|js]\n * 3. playwright.config reporter options\n * 4. Environment variables\n */\n merge(sources: ConfigSources): MergedConfig {\n const { env = {}, playwrightConfig = {}, testdinoConfig = {}, cliOptions = {} } = sources;\n\n // Merge token (required field)\n const token = this.selectValue(cliOptions.token, testdinoConfig.token, playwrightConfig.token, env.token);\n\n // Merge serverUrl with default fallback\n const serverUrl =\n this.selectValue(cliOptions.serverUrl, testdinoConfig.serverUrl, playwrightConfig.serverUrl, env.serverUrl) ||\n ConfigMerger.DEFAULT_SERVER_URL;\n\n // Merge ciRunId (auto-generate if not provided)\n const ciRunId =\n this.selectValue(cliOptions.ciRunId, testdinoConfig.ciRunId, playwrightConfig.ciBuildId) ||\n this.generateCiRunId();\n\n // Merge debug flag (default to false)\n const debug = this.selectValue(cliOptions.debug, testdinoConfig.debug, playwrightConfig.debug, env.debug) ?? false;\n\n // Merge artifacts flag (default to true)\n // CLI --no-artifacts sets noArtifacts=true, which means artifacts=false\n const artifacts =\n cliOptions.noArtifacts === true\n ? false\n : (this.selectValue(testdinoConfig.artifacts, playwrightConfig.artifacts) ?? true);\n\n const mergedConfig: MergedConfig = {\n token,\n serverUrl,\n ciRunId,\n debug,\n artifacts,\n };\n\n // Validate the merged config\n this.validate(mergedConfig);\n\n return mergedConfig;\n }\n\n /**\n * Select first non-undefined value from arguments\n */\n private selectValue<T>(...values: (T | undefined)[]): T | undefined {\n return values.find((value) => value !== undefined && value !== null);\n }\n\n /**\n * Generate a unique CI run ID\n */\n private generateCiRunId(): string {\n return `run-${randomUUID()}`;\n }\n\n /**\n * Validate merged configuration\n */\n private validate(config: MergedConfig): void {\n const errors: string[] = [];\n\n // Token is required\n if (!config.token || typeof config.token !== 'string' || config.token.trim().length === 0) {\n errors.push('Token is required and must be a non-empty string');\n }\n\n // ServerUrl must be valid if provided\n if (config.serverUrl) {\n if (typeof config.serverUrl !== 'string') {\n errors.push('Server URL must be a string');\n } else if (!this.isValidUrl(config.serverUrl)) {\n errors.push('Server URL must be a valid HTTP/HTTPS URL');\n }\n }\n\n // CiRunId must be string if provided\n if (config.ciRunId && typeof config.ciRunId !== 'string') {\n errors.push('CI run ID must be a string');\n }\n\n // Debug must be boolean if provided\n if (config.debug !== undefined && typeof config.debug !== 'boolean') {\n errors.push('Debug flag must be a boolean');\n }\n\n if (errors.length > 0) {\n throw new ConfigValidationError(`Configuration validation failed:\\n${errors.map((e) => ` - ${e}`).join('\\n')}`);\n }\n }\n\n /**\n * Check if string is a valid URL\n */\n private isValidUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n }\n\n /**\n * Get environment variables as config\n */\n static getEnvConfig(): Partial<TestdinoConfig> {\n const config: Partial<TestdinoConfig> = {};\n\n if (process.env.TESTDINO_TOKEN) {\n config.token = process.env.TESTDINO_TOKEN;\n }\n\n if (process.env.TESTDINO_SERVER_URL) {\n config.serverUrl = process.env.TESTDINO_SERVER_URL;\n }\n\n if (process.env.TESTDINO_DEBUG) {\n config.debug = process.env.TESTDINO_DEBUG === 'true' || process.env.TESTDINO_DEBUG === '1';\n }\n\n return config;\n }\n}\n","/**\n * Argument filter for TestDino CLI\n * Filters out TestDino-specific flags from arguments before passing to Playwright\n */\n\n/**\n * TestDino-specific flags that should be removed before passing to Playwright\n */\nconst TESTDINO_FLAGS = ['--token', '-t', '--ci-run-id', '--server-url', '--debug', '--no-artifacts'];\n\n/**\n * Flags that take a value (not boolean flags)\n */\nconst FLAGS_WITH_VALUES = ['--token', '-t', '--ci-run-id', '--server-url'];\n\n/**\n * Argument filter class\n */\nexport class ArgFilter {\n /**\n * Filter TestDino-specific arguments from the argument list\n * Removes both flags and their values\n *\n * @param args - Raw command line arguments\n * @returns Filtered arguments safe to pass to Playwright\n */\n filter(args: string[]): string[] {\n const result: string[] = [];\n let skipNext = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n // Skip this arg if previous flag indicated we should\n if (skipNext) {\n skipNext = false;\n continue;\n }\n\n // Check if this is a TestDino flag\n if (this.isTestdinoFlag(arg)) {\n // Check if it's a flag with value (not using = syntax)\n if (this.isFlagWithValue(arg) && !arg.includes('=')) {\n // Skip the next argument (the value)\n skipNext = true;\n }\n // Skip this flag\n continue;\n }\n\n // Check if this is a TestDino flag with = syntax (e.g., --token=value)\n if (this.isTestdinoFlagWithEquals(arg)) {\n // Skip this entire argument\n continue;\n }\n\n // Keep this argument\n result.push(arg);\n }\n\n return result;\n }\n\n /**\n * Check if argument is a TestDino flag\n */\n private isTestdinoFlag(arg: string): boolean {\n // Extract flag name (before = if present)\n const flagName = arg.split('=')[0];\n return TESTDINO_FLAGS.includes(flagName);\n }\n\n /**\n * Check if argument is a TestDino flag with = syntax\n */\n private isTestdinoFlagWithEquals(arg: string): boolean {\n if (!arg.includes('=')) {\n return false;\n }\n const flagName = arg.split('=')[0];\n return TESTDINO_FLAGS.includes(flagName);\n }\n\n /**\n * Check if flag takes a value\n */\n private isFlagWithValue(arg: string): boolean {\n const flagName = arg.split('=')[0];\n return FLAGS_WITH_VALUES.includes(flagName);\n }\n\n /**\n * Get list of TestDino flags (for reference/testing)\n */\n static getTestdinoFlags(): string[] {\n return [...TESTDINO_FLAGS];\n }\n}\n","/**\n * Temp config file manager for TestDino CLI\n * Creates and manages temporary configuration files\n */\n\nimport { writeFileSync, unlinkSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { randomUUID } from 'crypto';\nimport type { MergedConfig, TempConfigInfo } from './types.js';\n\n/**\n * Temp config manager class\n */\nexport class TempConfigManager {\n private tempFiles: Set<string> = new Set();\n private cleanupHandlersRegistered = false;\n private exitHandler?: () => void;\n private sigintHandler?: () => void;\n private sigtermHandler?: () => void;\n private uncaughtExceptionHandler?: (error: Error) => void;\n private unhandledRejectionHandler?: (reason: unknown) => void;\n\n /**\n * Create a temporary config file with the merged configuration\n * @param config - Merged configuration to write\n * @returns Temp config info with path and config\n */\n create(config: MergedConfig): TempConfigInfo {\n const tempPath = this.generateTempPath();\n\n try {\n // Write config as JSON to temp file\n const configJson = JSON.stringify(config, null, 2);\n writeFileSync(tempPath, configJson, 'utf-8');\n\n // Track this file for cleanup\n this.tempFiles.add(tempPath);\n\n // Register cleanup handlers on first file creation\n if (!this.cleanupHandlersRegistered) {\n this.registerCleanupHandlers();\n this.cleanupHandlersRegistered = true;\n }\n\n return {\n path: tempPath,\n config,\n };\n } catch (error) {\n throw new Error(\n `Failed to create temp config file: ${tempPath}\\n${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Clean up a specific temp config file\n * @param tempPath - Path to temp file to clean up\n */\n cleanup(tempPath: string): void {\n try {\n if (existsSync(tempPath)) {\n unlinkSync(tempPath);\n }\n this.tempFiles.delete(tempPath);\n } catch {\n // Log error but don't throw - cleanup should be best-effort\n console.warn(`⚠️ TestDino: Failed to cleanup temp file: ${tempPath}`);\n }\n }\n\n /**\n * Clean up all tracked temp files\n */\n cleanupAll(): void {\n for (const tempPath of this.tempFiles) {\n this.cleanup(tempPath);\n }\n this.tempFiles.clear();\n }\n\n /**\n * Remove all event handlers (for testing)\n */\n removeHandlers(): void {\n if (this.exitHandler) {\n process.removeListener('exit', this.exitHandler);\n }\n if (this.sigintHandler) {\n process.removeListener('SIGINT', this.sigintHandler);\n }\n if (this.sigtermHandler) {\n process.removeListener('SIGTERM', this.sigtermHandler);\n }\n if (this.uncaughtExceptionHandler) {\n process.removeListener('uncaughtException', this.uncaughtExceptionHandler);\n }\n if (this.unhandledRejectionHandler) {\n process.removeListener('unhandledRejection', this.unhandledRejectionHandler);\n }\n this.cleanupHandlersRegistered = false;\n }\n\n /**\n * Generate unique temp file path\n */\n private generateTempPath(): string {\n const filename = `testdino-config-${randomUUID()}.json`;\n return join(tmpdir(), filename);\n }\n\n /**\n * Register cleanup handlers for process exit and signals\n */\n private registerCleanupHandlers(): void {\n // Normal exit\n this.exitHandler = () => {\n this.cleanupAll();\n };\n process.on('exit', this.exitHandler);\n\n // SIGINT (Ctrl+C)\n this.sigintHandler = () => {\n this.cleanupAll();\n process.exit(130); // Standard exit code for SIGINT\n };\n process.on('SIGINT', this.sigintHandler);\n\n // SIGTERM\n this.sigtermHandler = () => {\n this.cleanupAll();\n process.exit(143); // Standard exit code for SIGTERM\n };\n process.on('SIGTERM', this.sigtermHandler);\n\n // Uncaught exceptions\n this.uncaughtExceptionHandler = (error: Error) => {\n console.error('Uncaught exception:', error);\n this.cleanupAll();\n process.exit(1);\n };\n process.on('uncaughtException', this.uncaughtExceptionHandler);\n\n // Unhandled promise rejections\n this.unhandledRejectionHandler = (reason: unknown) => {\n console.error('Unhandled rejection:', reason);\n this.cleanupAll();\n process.exit(1);\n };\n process.on('unhandledRejection', this.unhandledRejectionHandler);\n }\n\n /**\n * Get list of tracked temp files (for testing)\n */\n getTempFiles(): string[] {\n return Array.from(this.tempFiles);\n }\n}\n","/**\n * Playwright spawner for TestDino CLI\n * Spawns Playwright test process with TestDino configuration\n */\n\nimport { execa, type ExecaError } from 'execa';\nimport type { MergedConfig } from './types.js';\n\n/**\n * Spawn options\n */\nexport interface SpawnOptions {\n args: string[];\n tempConfigPath: string;\n config: MergedConfig;\n cwd?: string;\n}\n\n/**\n * Spawn result\n */\nexport interface SpawnResult {\n exitCode: number;\n success: boolean;\n}\n\n/**\n * Playwright spawner class\n */\nexport class PlaywrightSpawner {\n /**\n * Spawn Playwright test process\n * @param options - Spawn options\n * @returns Spawn result with exit code\n */\n async spawn(options: SpawnOptions): Promise<SpawnResult> {\n const { args, tempConfigPath, config, cwd = process.cwd() } = options;\n\n try {\n // Build environment variables\n const env = {\n ...process.env,\n TESTDINO_CLI_CONFIG_PATH: tempConfigPath,\n TESTDINO_TOKEN: config.token,\n TESTDINO_SERVER_URL: config.serverUrl,\n TESTDINO_CI_RUN_ID: config.ciRunId,\n TESTDINO_DEBUG: config.debug ? 'true' : 'false',\n };\n\n // Build Playwright arguments with injected reporter\n const playwrightArgs = ['playwright', 'test', '--reporter', '@testdino/playwright', ...args];\n\n // Spawn Playwright with execa\n const result = await execa('npx', playwrightArgs, {\n stdio: 'inherit', // Forward stdout/stderr in real-time\n cwd,\n env,\n reject: false, // Don't throw on non-zero exit codes\n });\n\n const exitCode = result.exitCode ?? 0;\n\n return {\n exitCode,\n success: exitCode === 0,\n };\n } catch (error) {\n // Handle spawn errors (e.g., Playwright not installed, npx not found)\n return this.handleSpawnError(error);\n }\n }\n\n /**\n * Handle spawn errors\n */\n private handleSpawnError(error: unknown): SpawnResult {\n const execaError = error as ExecaError;\n\n // Check if it's a command not found error\n if (execaError.code === 'ENOENT') {\n console.error('❌ TestDino: Failed to spawn Playwright');\n console.error('');\n console.error('Playwright is not installed or npx is not available.');\n console.error('');\n console.error('To install Playwright:');\n console.error(' npm install -D @playwright/test');\n console.error(' npx playwright install');\n console.error('');\n return {\n exitCode: 1,\n success: false,\n };\n }\n\n // Check if it's a permission error\n if (execaError.code === 'EACCES') {\n console.error('❌ TestDino: Permission denied when trying to spawn Playwright');\n console.error('');\n console.error('Please check file permissions and try again.');\n console.error('');\n return {\n exitCode: 1,\n success: false,\n };\n }\n\n // Generic error\n console.error('❌ TestDino: Failed to spawn Playwright');\n console.error('');\n console.error('Error:', execaError.message || String(error));\n console.error('');\n return {\n exitCode: 1,\n success: false,\n };\n }\n}\n","/**\n * Test command for TestDino CLI\n * Orchestrates all CLI components to run Playwright tests with TestDino reporter\n */\n\nimport { ConfigLoader } from '../config-loader.js';\nimport { ConfigDetector } from '../config-detector.js';\nimport { ConfigMerger } from '../config-merger.js';\nimport { ArgFilter } from '../arg-filter.js';\nimport { TempConfigManager } from '../temp-config.js';\nimport { PlaywrightSpawner } from '../playwright-spawner.js';\nimport type { CliOptions } from '../types.js';\nimport type { SpawnResult } from '../playwright-spawner.js';\n\n/**\n * Test command class\n * Orchestrates the full flow of running Playwright tests with TestDino\n */\nexport class TestCommand {\n private configLoader: ConfigLoader;\n private configDetector: ConfigDetector;\n private configMerger: ConfigMerger;\n private argFilter: ArgFilter;\n private tempConfigManager: TempConfigManager;\n private playwrightSpawner: PlaywrightSpawner;\n\n constructor(\n configLoader?: ConfigLoader,\n configDetector?: ConfigDetector,\n configMerger?: ConfigMerger,\n argFilter?: ArgFilter,\n tempConfigManager?: TempConfigManager,\n playwrightSpawner?: PlaywrightSpawner\n ) {\n this.configLoader = configLoader || new ConfigLoader();\n this.configDetector = configDetector || new ConfigDetector();\n this.configMerger = configMerger || new ConfigMerger();\n this.argFilter = argFilter || new ArgFilter();\n this.tempConfigManager = tempConfigManager || new TempConfigManager();\n this.playwrightSpawner = playwrightSpawner || new PlaywrightSpawner();\n }\n\n /**\n * Execute the test command\n * @param options - CLI options from commander\n * @param args - Remaining arguments to pass to Playwright\n * @returns Spawn result with exit code\n */\n async execute(options: CliOptions, args: string[]): Promise<SpawnResult> {\n let tempConfigPath: string | undefined;\n\n try {\n // 1. Load testdino.config.[ts|js]\n const testdinoConfigResult = await this.configLoader.load();\n\n // 2. Detect playwright.config.[ts|js] and TestdinoReporter\n const playwrightConfigResult = await this.configDetector.detect();\n\n // 3. Get environment variables\n const envConfig = ConfigMerger.getEnvConfig();\n\n // 4. Merge all configs with proper priority\n const mergedConfig = this.configMerger.merge({\n env: envConfig,\n playwrightConfig: playwrightConfigResult.options,\n testdinoConfig: testdinoConfigResult.config,\n cliOptions: options,\n });\n\n // 5. Create temp config file\n const tempConfigInfo = this.tempConfigManager.create(mergedConfig);\n tempConfigPath = tempConfigInfo.path;\n\n // 6. Filter TestDino-specific arguments\n const filteredArgs = this.argFilter.filter(args);\n\n // 7. Spawn Playwright with filtered args and config\n const result = await this.playwrightSpawner.spawn({\n args: filteredArgs,\n tempConfigPath,\n config: mergedConfig,\n });\n\n return result;\n } finally {\n // 8. Always cleanup temp config file\n if (tempConfigPath) {\n this.tempConfigManager.cleanup(tempConfigPath);\n }\n }\n }\n}\n","#!/usr/bin/env node\n\n/**\n * TestDino Playwright CLI\n * Main entry point for the tdpw command\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { TestCommand } from './commands/test.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get package version\n */\nfunction getVersion(): string {\n try {\n // In built dist, package.json is two levels up\n const packagePath = join(__dirname, '../../package.json');\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\n return packageJson.version;\n } catch {\n return '0.0.0';\n }\n}\n\n/**\n * Print CLI banner\n */\nfunction printBanner(): void {\n const version = getVersion();\n console.log(\n chalk.cyan(`\n╔═══════════════════════════════════════════════════════════╗\n║ ║\n║ ${chalk.bold('TestDino Playwright')} v${version.padEnd(36)}║\n║ ${chalk.dim('https://testdino.com')} ║\n║ ║\n╚═══════════════════════════════════════════════════════════╝\n`)\n );\n}\n\n/**\n * Build the CLI program\n */\nfunction buildProgram(): Command {\n const program = new Command()\n .name('tdpw')\n .description('Run Playwright tests with TestDino reporting')\n .version(getVersion(), '-v, --version', 'Output the current version')\n .helpOption('-h, --help', 'Display help for command');\n\n // Test command\n program\n .command('test')\n .description('Run Playwright tests with TestDino reporter')\n .option('-t, --token <token>', 'TestDino authentication token')\n .option('--ci-run-id <id>', 'CI run ID for grouping test runs')\n .option('--server-url <url>', 'TestDino server URL')\n .option('--debug', 'Enable debug logging')\n .option('--no-artifacts', 'Disable artifact uploads (screenshots, videos, traces)')\n .allowUnknownOption()\n .allowExcessArguments()\n .action(async (options, command) => {\n try {\n // Get remaining arguments (everything after 'test')\n const args = command.args || [];\n\n // Create and execute test command\n const testCommand = new TestCommand();\n const result = await testCommand.execute(options, args);\n\n // Exit with Playwright's exit code\n process.exit(result.exitCode);\n } catch (error) {\n console.error(chalk.red('\\n✖ Unexpected error:'), error instanceof Error ? error.message : String(error));\n\n if (options.debug) {\n console.error(chalk.dim('\\nStack trace:'));\n console.error(error);\n }\n\n process.exit(1);\n }\n });\n\n return program;\n}\n\n/**\n * Main CLI entry point\n */\nasync function main(): Promise<void> {\n try {\n printBanner();\n\n const program = buildProgram();\n await program.parseAsync(process.argv);\n } catch (error) {\n console.error(chalk.red('\\n✖ Error:'), error instanceof Error ? error.message : String(error));\n\n if (process.env.DEBUG || process.env.TESTDINO_DEBUG) {\n console.error(chalk.dim('\\nStack trace:'));\n console.error(error);\n }\n\n process.exit(1);\n }\n}\n\n// Run CLI\nmain().catch((error) => {\n console.error(chalk.red('Unexpected error:'), error);\n process.exit(1);\n});\n"]}