117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import type { ITapSettings, ISettingsManager } from './tapbundle.interfaces.js';
 | |
| 
 | |
| export class SettingsManager implements ISettingsManager {
 | |
|   private globalSettings: ITapSettings = {};
 | |
|   private fileSettings: ITapSettings = {};
 | |
|   private testSettings: Map<string, ITapSettings> = new Map();
 | |
|   
 | |
|   // Default settings
 | |
|   private defaultSettings: ITapSettings = {
 | |
|     timeout: undefined, // No timeout by default
 | |
|     slowThreshold: 1000, // 1 second
 | |
|     bail: false,
 | |
|     retries: 0,
 | |
|     retryDelay: 0,
 | |
|     suppressConsole: false,
 | |
|     verboseErrors: true,
 | |
|     showTestDuration: true,
 | |
|     maxConcurrency: 5,
 | |
|     isolateTests: false,
 | |
|     enableSnapshots: true,
 | |
|     snapshotDirectory: '.snapshots',
 | |
|     updateSnapshots: false,
 | |
|   };
 | |
| 
 | |
|   /**
 | |
|    * Get merged settings for current context
 | |
|    */
 | |
|   public getSettings(): ITapSettings {
 | |
|     return this.mergeSettings(
 | |
|       this.defaultSettings,
 | |
|       this.globalSettings,
 | |
|       this.fileSettings
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Set global settings (from 00init.ts or tap.settings())
 | |
|    */
 | |
|   public setGlobalSettings(settings: ITapSettings): void {
 | |
|     this.globalSettings = { ...this.globalSettings, ...settings };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Set file-level settings
 | |
|    */
 | |
|   public setFileSettings(settings: ITapSettings): void {
 | |
|     this.fileSettings = { ...this.fileSettings, ...settings };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Set test-specific settings
 | |
|    */
 | |
|   public setTestSettings(testId: string, settings: ITapSettings): void {
 | |
|     const existingSettings = this.testSettings.get(testId) || {};
 | |
|     this.testSettings.set(testId, { ...existingSettings, ...settings });
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Get settings for specific test
 | |
|    */
 | |
|   public getTestSettings(testId: string): ITapSettings {
 | |
|     const testSpecificSettings = this.testSettings.get(testId) || {};
 | |
|     return this.mergeSettings(
 | |
|       this.defaultSettings,
 | |
|       this.globalSettings,
 | |
|       this.fileSettings,
 | |
|       testSpecificSettings
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Merge settings with proper inheritance
 | |
|    * Later settings override earlier ones
 | |
|    */
 | |
|   private mergeSettings(...settingsArray: ITapSettings[]): ITapSettings {
 | |
|     const result: ITapSettings = {};
 | |
| 
 | |
|     for (const settings of settingsArray) {
 | |
|       // Simple properties - later values override
 | |
|       if (settings.timeout !== undefined) result.timeout = settings.timeout;
 | |
|       if (settings.slowThreshold !== undefined) result.slowThreshold = settings.slowThreshold;
 | |
|       if (settings.bail !== undefined) result.bail = settings.bail;
 | |
|       if (settings.retries !== undefined) result.retries = settings.retries;
 | |
|       if (settings.retryDelay !== undefined) result.retryDelay = settings.retryDelay;
 | |
|       if (settings.suppressConsole !== undefined) result.suppressConsole = settings.suppressConsole;
 | |
|       if (settings.verboseErrors !== undefined) result.verboseErrors = settings.verboseErrors;
 | |
|       if (settings.showTestDuration !== undefined) result.showTestDuration = settings.showTestDuration;
 | |
|       if (settings.maxConcurrency !== undefined) result.maxConcurrency = settings.maxConcurrency;
 | |
|       if (settings.isolateTests !== undefined) result.isolateTests = settings.isolateTests;
 | |
|       if (settings.enableSnapshots !== undefined) result.enableSnapshots = settings.enableSnapshots;
 | |
|       if (settings.snapshotDirectory !== undefined) result.snapshotDirectory = settings.snapshotDirectory;
 | |
|       if (settings.updateSnapshots !== undefined) result.updateSnapshots = settings.updateSnapshots;
 | |
| 
 | |
|       // Lifecycle hooks - later ones override
 | |
|       if (settings.beforeAll !== undefined) result.beforeAll = settings.beforeAll;
 | |
|       if (settings.afterAll !== undefined) result.afterAll = settings.afterAll;
 | |
|       if (settings.beforeEach !== undefined) result.beforeEach = settings.beforeEach;
 | |
|       if (settings.afterEach !== undefined) result.afterEach = settings.afterEach;
 | |
| 
 | |
|       // Environment variables - merge
 | |
|       if (settings.env) {
 | |
|         result.env = { ...result.env, ...settings.env };
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Clear all settings (useful for testing)
 | |
|    */
 | |
|   public clearSettings(): void {
 | |
|     this.globalSettings = {};
 | |
|     this.fileSettings = {};
 | |
|     this.testSettings.clear();
 | |
|   }
 | |
| } |