UNPKG

ui-coverage-scenario-tool-js

Version:

**UI Coverage Scenario Tool** is an innovative, no-overhead solution for tracking and visualizing UI test coverage — directly on your actual application, not static snapshots. The tool collects coverage during UI test execution and generates an interactiv

1 lines 44 kB
{"version":3,"sources":["../src/cli.ts","../src/tools/logger.ts","../src/tracker/storage.ts","../src/tools/files.ts","../src/tracker/models/pages.ts","../src/tracker/models/elements.ts","../src/tracker/models/scenarios.ts","../src/tracker/models/transitions.ts","../src/history/storage.ts","../src/tools/json.ts","../src/tools/actions.ts","../src/coverage/builder.ts","../src/history/builder.ts","../src/reports/storage.ts","../src/config/builders.ts","../src/config/core.ts","../src/commands/save-report.ts","../src/commands/print-config.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { saveReport } from './commands/save-report';\nimport { printConfig } from './commands/print-config';\n\nconst program = new Command();\n\nprogram.name('ui-coverage-scenario-tool').description('UI Coverage Scenario CLI Tool').version('0.13.0');\n\nprogram\n .command('save-report')\n .description('Generate a coverage report based on collected result files.')\n .action(saveReport);\n\nprogram.command('print-config').description('Print the resolved configuration to the console.').action(printConfig);\n\nprogram.parse(process.argv);\n","export const getLogger = (name: string) => ({\n info: (msg: string) => console.info(`[${name}] ${msg}`),\n debug: (msg: string) => console.debug(`[${name}] ${msg}`),\n error: (msg: string) => console.error(`[${name}] ${msg}`),\n warning: (msg: string) => console.warn(`[${name}] ${msg}`)\n});\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getLogger } from '../tools/logger';\nimport { Settings } from '../config/models';\nimport { isPathExists } from '../tools/files';\nimport { CoveragePageResult, CoveragePageResultList } from './models/pages';\nimport { CoverageElementResult, CoverageElementResultList } from './models/elements';\nimport { CoverageScenarioResult, CoverageScenarioResultList } from './models/scenarios';\nimport { CoverageTransitionResult, CoverageTransitionResultList } from './models/transitions';\n\nconst logger = getLogger('UI_COVERAGE_TRACKER_STORAGE');\n\ntype ResultListInterface<Result> = {\n new ({ results }: { results: Result[] });\n};\n\ntype LoadProps<Result> = {\n context: string;\n resultList: ResultListInterface<Result>;\n};\n\ntype SaveProps<Result> = {\n result: Result;\n context: string;\n};\n\nexport class UICoverageTrackerStorage {\n private settings: Settings;\n\n constructor({ settings }: { settings: Settings }) {\n this.settings = settings;\n }\n\n async load<Result, ResultList extends ResultListInterface<Result>>(\n props: LoadProps<Result>\n ): Promise<InstanceType<ResultList>> {\n const { context, resultList } = props;\n const resultsDir = this.settings.resultsDir;\n\n logger.info(`Loading coverage results from directory: ${resultsDir}`);\n\n if (!(await isPathExists(resultsDir))) {\n logger.warning(`Results directory does not exist: ${resultsDir}`);\n return new resultList({ results: [] });\n }\n\n const results: Result[] = [];\n for (const fileName of await fs.readdir(resultsDir)) {\n const file = path.join(resultsDir, fileName);\n const fileStats = await fs.stat(file);\n\n if (fileStats.isFile() && fileName.endsWith(`-${context}.json`)) {\n try {\n const json = await fs.readFile(file, 'utf-8');\n results.push(JSON.parse(json));\n } catch (error) {\n logger.warning(`Failed to parse file ${fileName}: ${error}`);\n }\n }\n }\n\n logger.info(`Loaded ${results.length} coverage files from directory: ${resultsDir}`);\n return new resultList({ results });\n }\n\n async save<Result>({ result, context }: SaveProps<Result>) {\n const resultsDir = this.settings.resultsDir;\n\n if (!(await isPathExists(resultsDir))) {\n logger.info(`Results directory does not exist, creating: ${resultsDir}`);\n await fs.mkdir(resultsDir, { recursive: true });\n }\n\n const file = path.join(resultsDir, `${uuidv4()}-${context}.json`);\n\n try {\n await fs.writeFile(file, JSON.stringify(result), 'utf-8');\n } catch (error) {\n logger.error(`Error saving coverage data to file ${file}: ${error}`);\n }\n }\n\n async savePageResult(result: CoveragePageResult): Promise<void> {\n await this.save({ context: 'page', result });\n }\n\n async saveElementResult(result: CoverageElementResult) {\n await this.save({ context: 'element', result });\n }\n\n async saveScenarioResult(result: CoverageScenarioResult) {\n await this.save({ context: 'scenario', result });\n }\n\n async saveTransitionResult(result: CoverageTransitionResult) {\n await this.save({ context: 'transition', result });\n }\n\n async loadPageResults(): Promise<CoveragePageResultList> {\n return await this.load({ context: 'page', resultList: CoveragePageResultList });\n }\n\n async loadElementResults(): Promise<CoverageElementResultList> {\n return await this.load({ context: 'element', resultList: CoverageElementResultList });\n }\n\n async loadScenarioResults(): Promise<CoverageScenarioResultList> {\n return await this.load({ context: 'scenario', resultList: CoverageScenarioResultList });\n }\n\n async loadTransitionResults(): Promise<CoverageTransitionResultList> {\n return await this.load({ context: 'transition', resultList: CoverageTransitionResultList });\n }\n}\n","import fs from 'fs';\nimport yaml from 'js-yaml';\nimport fsAsync from 'fs/promises';\nimport { getLogger } from './logger';\n\nconst logger = getLogger('FILES');\n\nexport const isPathExists = async (path: string): Promise<boolean> => {\n try {\n await fsAsync.access(path);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nexport const loadFromJson = <T>(file: string): Partial<T> => {\n try {\n if (!fs.existsSync(file)) return {};\n\n const raw = fs.readFileSync(file, 'utf-8');\n return JSON.parse(raw);\n } catch (error) {\n logger.warning(`Failed to load JSON config ${file}: ${error}`);\n return {};\n }\n};\n\nexport const loadFromYaml = <T>(file: string): Partial<T> => {\n try {\n if (!fs.existsSync(file)) return {};\n\n const raw = fs.readFileSync(file, 'utf-8');\n return yaml.load(raw) as Partial<T>;\n } catch (error) {\n logger.warning(`Failed to load YAML config ${file}: ${error}`);\n return {};\n }\n};\n","import { AppKey, Page, PagePriority, ScenarioName } from '../../tools/types';\n\nexport interface CoveragePageResult {\n app: AppKey;\n url: string;\n page: Page;\n priority: PagePriority;\n scenario: ScenarioName;\n}\n\nexport class CoveragePageResultList {\n readonly results: CoveragePageResult[];\n\n constructor({ results }: { results: CoveragePageResult[] }) {\n this.results = results;\n }\n\n filter({ app }: { app?: AppKey }): CoveragePageResultList {\n const filtered = this.results.filter((result) => !app || result.app.toLowerCase() === app.toLowerCase());\n return new CoveragePageResultList({ results: filtered });\n }\n\n unique(): CoveragePageResultList {\n const map = new Map<string, CoveragePageResult>();\n for (const result of this.results) {\n const key = result.page;\n if (!map.has(key)) {\n map.set(key, result);\n }\n }\n\n return new CoveragePageResultList({ results: Array.from(map.values()) });\n }\n\n findScenarios({ page }: { page: Page }): ScenarioName[] {\n const scenarios = this.results.filter((result) => result.page === page).map((result) => result.scenario);\n return Array.from(new Set(scenarios));\n }\n}\n","import { AppKey, ScenarioName, Selector } from '../../tools/types';\nimport { ActionType } from '../../tools/actions';\nimport { SelectorType } from '../../tools/selector';\n\nexport interface CoverageElementResult {\n app: AppKey;\n selector: Selector;\n scenario: ScenarioName;\n timestamp: number;\n actionType: ActionType;\n selectorType: SelectorType;\n}\n\nexport class CoverageElementResultList {\n readonly results: CoverageElementResult[];\n\n constructor({ results }: { results: CoverageElementResult[] }) {\n this.results = results;\n }\n\n filter({ app, scenario }: { app?: AppKey; scenario?: ScenarioName }): CoverageElementResultList {\n const filtered = this.results.filter(\n (result) =>\n (!app || result.app.toLowerCase() === app.toLowerCase()) &&\n (!scenario || result.scenario.toLowerCase() === scenario.toLowerCase())\n );\n return new CoverageElementResultList({ results: filtered });\n }\n\n get groupedByAction(): Map<ActionType, CoverageElementResultList> {\n return this.groupBy((r) => r.actionType);\n }\n\n get groupedBySelector(): Map<string, CoverageElementResultList> {\n return this.groupBy((r) => `${encodeURIComponent(r.selector)}|${r.selectorType}`);\n }\n\n get totalActions(): number {\n return this.results.length;\n }\n\n get totalSelectors(): number {\n return this.groupedBySelector.size;\n }\n\n countAction(actionType: ActionType): number {\n return this.results.filter((r) => r.actionType === actionType).length;\n }\n\n private groupBy<K>(keyGetter: (r: CoverageElementResult) => K): Map<K, CoverageElementResultList> {\n const map = new Map<K, CoverageElementResult[]>();\n for (const result of this.results) {\n const key = keyGetter(result);\n const results = map.get(key) || [];\n results.push(result);\n map.set(key, results);\n }\n\n const resultMap = new Map<K, CoverageElementResultList>();\n for (const [key, results] of map.entries()) {\n resultMap.set(key, new CoverageElementResultList({ results }));\n }\n\n return resultMap;\n }\n}\n","import { AppKey, ScenarioName } from '../../tools/types';\n\nexport interface CoverageScenarioResult {\n app: AppKey;\n url: string | null;\n name: ScenarioName;\n}\n\nexport class CoverageScenarioResultList {\n readonly results: CoverageScenarioResult[];\n\n constructor({ results }: { results: CoverageScenarioResult[] }) {\n this.results = results;\n }\n\n filter({ app }: { app?: AppKey }): CoverageScenarioResultList {\n const filtered = this.results.filter((result) => !app || result.app.toLowerCase() === app.toLowerCase());\n return new CoverageScenarioResultList({ results: filtered });\n }\n}\n","import { AppKey, Page, ScenarioName } from '../../tools/types';\n\nexport interface CoverageTransitionResult {\n app: AppKey;\n toPage: Page;\n scenario: ScenarioName;\n fromPage: Page;\n}\n\nexport class CoverageTransitionResultList {\n readonly results: CoverageTransitionResult[];\n\n constructor({ results }: { results: CoverageTransitionResult[] }) {\n this.results = results;\n }\n\n filter({ app }: { app?: AppKey }): CoverageTransitionResultList {\n const filtered = this.results.filter((result) => !app || result.app.toLowerCase() === app.toLowerCase());\n return new CoverageTransitionResultList({ results: filtered });\n }\n\n unique(): CoverageTransitionResultList {\n const map = new Map<string, CoverageTransitionResult>();\n for (const result of this.results) {\n const key = `${result.fromPage}→${result.toPage}`;\n if (!map.has(key)) {\n map.set(key, result);\n }\n }\n\n return new CoverageTransitionResultList({ results: Array.from(map.values()) });\n }\n\n findScenarios({ toPage, fromPage }: { toPage: Page; fromPage: Page }): ScenarioName[] {\n const scenarios = this.results\n .filter((result) => result.toPage === toPage && result.fromPage === fromPage)\n .map((result) => result.scenario);\n\n return Array.from(new Set(scenarios));\n }\n\n countTransitions({ toPage, fromPage }: { toPage: Page; fromPage: Page }): number {\n return this.results.filter((result) => result.toPage === toPage && result.fromPage === fromPage).length;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { AppHistoryState, CoverageHistoryState } from './models';\nimport { getLogger } from '../tools/logger';\nimport { loadJson } from '../tools/json';\nimport { CoverageReportState } from '../reports/models';\nimport { Settings } from '../config/models';\nimport { isPathExists } from '../tools/files';\n\nconst logger = getLogger('UI_COVERAGE_HISTORY_STORAGE');\n\nexport class UICoverageHistoryStorage {\n private settings: Settings;\n\n constructor({ settings }: { settings: Settings }) {\n this.settings = settings;\n }\n\n async load(): Promise<CoverageHistoryState> {\n const historyFile = this.settings.historyFile;\n\n if (!historyFile) {\n logger.debug('No history file path provided, returning empty history state');\n return { apps: {} };\n }\n\n if (!(await isPathExists(historyFile))) {\n logger.error(`History file not found: ${historyFile}, returning empty history state`);\n return { apps: {} };\n }\n\n try {\n logger.info(`Loading history from file: ${historyFile}`);\n const content = await fs.readFile(historyFile, 'utf-8');\n return loadJson<CoverageHistoryState>({ content, fallback: { apps: {} } });\n } catch (error) {\n logger.error(`Error loading history from file ${historyFile}: ${error}`);\n return { apps: {} };\n }\n }\n\n async save(state: CoverageHistoryState): Promise<void> {\n const historyFile = this.settings.historyFile;\n\n if (!historyFile) {\n logger.debug('History file path is not defined, skipping history save');\n return;\n }\n\n try {\n await fs.mkdir(path.dirname(historyFile), { recursive: true });\n await fs.writeFile(historyFile, JSON.stringify(state), 'utf-8');\n logger.info(`History state saved to file: ${historyFile}`);\n } catch (error) {\n logger.error(`Error saving history to file ${historyFile}: ${error}`);\n }\n }\n\n async saveFromReport(report: CoverageReportState): Promise<void> {\n const state: CoverageHistoryState = { apps: {} };\n\n for (const app of this.settings.apps) {\n const coverage = report.appsCoverage[app.key];\n if (!coverage) continue;\n\n const appState: AppHistoryState = { total: coverage.history, scenarios: {} };\n\n for (const scenario of coverage.scenarios) {\n appState.scenarios[scenario.name] = scenario.history;\n }\n\n state.apps[app.key] = appState;\n }\n\n await this.save(state);\n }\n}\n","import { getLogger } from './logger';\n\nconst logger = getLogger('JSON');\n\ntype LoadJsonProps<T> = {\n content: string;\n fallback: T;\n};\n\nexport const loadJson = <T>({ content, fallback }: LoadJsonProps<T>): T => {\n try {\n return JSON.parse(content, (key, value) => {\n switch (key) {\n case 'createdAt':\n return new Date(value);\n default:\n return value;\n }\n });\n } catch (error) {\n logger.warning(`Failed to parse JSON: ${error}`);\n return fallback;\n }\n};\n","export enum ActionType {\n // input\n Fill = 'FILL',\n Type = 'TYPE',\n Select = 'SELECT',\n\n // action\n Click = 'CLICK',\n Hover = 'HOVER',\n\n // assert\n Text = 'TEXT',\n Value = 'VALUE',\n Hidden = 'HIDDEN',\n Visible = 'VISIBLE',\n Checked = 'CHECKED',\n Enabled = 'ENABLED',\n Disabled = 'DISABLED',\n Unchecked = 'UNCHECKED'\n}\n\nexport interface ActionCoverage {\n count: number;\n actionType: ActionType;\n}\n","import { ActionCoverage, ActionType } from '../tools/actions';\nimport {\n AppCoverage,\n PageCoverageEdge,\n PageCoverageNode,\n PagesCoverage,\n ScenarioCoverage,\n ScenarioCoverageStep\n} from './models';\nimport { UICoverageHistoryBuilder } from '../history/builder';\nimport { ActionHistory } from '../history/models';\nimport { CoveragePageResultList } from '../tracker/models/pages';\nimport { CoverageTransitionResultList } from '../tracker/models/transitions';\nimport { CoverageElementResultList } from '../tracker/models/elements';\nimport { CoverageScenarioResult, CoverageScenarioResultList } from '../tracker/models/scenarios';\n\ntype UICoverageBuilderProps = {\n historyBuilder: UICoverageHistoryBuilder;\n pageResultList: CoveragePageResultList;\n elementResultList: CoverageElementResultList;\n scenarioResultList: CoverageScenarioResultList;\n transitionResultList: CoverageTransitionResultList;\n};\n\ntype BuildScenarioCoverageProps = {\n scenario: CoverageScenarioResult;\n};\n\nexport class UICoverageBuilder {\n private historyBuilder: UICoverageHistoryBuilder;\n private pageResultList: CoveragePageResultList;\n private elementResultList: CoverageElementResultList;\n private scenarioResultList: CoverageScenarioResultList;\n private transitionResultList: CoverageTransitionResultList;\n\n constructor({\n historyBuilder,\n pageResultList,\n elementResultList,\n scenarioResultList,\n transitionResultList\n }: UICoverageBuilderProps) {\n this.historyBuilder = historyBuilder;\n this.pageResultList = pageResultList;\n this.elementResultList = elementResultList;\n this.scenarioResultList = scenarioResultList;\n this.transitionResultList = transitionResultList;\n }\n\n private buildPagesCoverage(): PagesCoverage {\n const nodes: PageCoverageNode[] = this.pageResultList.unique().results.map((result) => ({\n url: result.url,\n page: result.page,\n priority: result.priority,\n scenarios: this.pageResultList.findScenarios({ page: result.page })\n }));\n\n const edges: PageCoverageEdge[] = this.transitionResultList.unique().results.map((result) => ({\n count: this.transitionResultList.countTransitions(result),\n toPage: result.toPage,\n fromPage: result.fromPage,\n scenarios: this.transitionResultList.findScenarios(result)\n }));\n\n return { nodes, edges };\n }\n\n private buildScenarioCoverage({ scenario }: BuildScenarioCoverageProps): ScenarioCoverage {\n const elements = this.elementResultList.filter({ scenario: scenario.name });\n\n const steps: ScenarioCoverageStep[] = elements.results.map((element) => ({\n selector: element.selector,\n timestamp: element.timestamp,\n actionType: element.actionType,\n selectorType: element.selectorType\n }));\n\n const actions: ActionCoverage[] = Object.values(ActionType)\n .map((actionType) => ({ actionType, count: elements.countAction(actionType) }))\n .filter((a) => a.count > 0);\n\n const history = this.historyBuilder.getScenarioHistory({ name: scenario.name, actions });\n\n return { url: scenario.url, name: scenario.name, steps, actions, history };\n }\n\n build(): AppCoverage {\n const pages = this.buildPagesCoverage();\n\n const actions: ActionHistory[] = [];\n for (const [action, results] of this.elementResultList.groupedByAction.entries()) {\n if (results.totalActions > 0) {\n actions.push({ actionType: action, count: results.totalActions });\n }\n }\n\n const scenarios: ScenarioCoverage[] = this.scenarioResultList.results.map((scenario) =>\n this.buildScenarioCoverage({ scenario })\n );\n\n const history = this.historyBuilder.getAppHistory({\n actions,\n totalActions: this.elementResultList.totalActions,\n totalElements: this.elementResultList.totalSelectors\n });\n\n return { pages, history, scenarios };\n }\n}\n","import { ActionHistory, AppHistory, AppHistoryState, ScenarioHistory } from './models';\nimport { ScenarioName } from '../tools/types';\nimport { Settings } from '../config/models';\n\ntype UICoverageHistoryBuilderProps = {\n history: AppHistoryState;\n settings: Settings;\n};\n\ntype GetScenarioHistoryProps = {\n name: ScenarioName;\n actions: ActionHistory[];\n};\n\ntype BuildAppHistoryProps = {\n actions: ActionHistory[];\n totalActions: number;\n totalElements: number;\n};\n\ntype BuildScenarioHistoryProps = {\n actions: ActionHistory[];\n};\n\ntype BaseHistory = { actions: ActionHistory[]; createdAt: Date };\n\ntype AppendHistoryProps<T extends BaseHistory> = {\n history: T[];\n buildFunc: () => T;\n};\n\nexport class UICoverageHistoryBuilder {\n private history: AppHistoryState;\n private settings: Settings;\n private createdAt: Date;\n\n constructor({ history, settings }: UICoverageHistoryBuilderProps) {\n this.history = history;\n this.settings = settings;\n this.createdAt = new Date();\n }\n\n buildAppHistory({ actions, totalActions, totalElements }: BuildAppHistoryProps): AppHistory {\n return { actions, createdAt: this.createdAt, totalActions, totalElements };\n }\n\n buildScenarioHistory({ actions }: BuildScenarioHistoryProps): ScenarioHistory {\n return { actions, createdAt: this.createdAt };\n }\n\n private appendHistory<T extends BaseHistory>({ history, buildFunc }: AppendHistoryProps<T>): T[] {\n if (!this.settings.historyFile) {\n return [];\n }\n\n const newItem = buildFunc();\n if (!newItem.actions || newItem.actions.length === 0) {\n return history;\n }\n\n const combined = [...history, newItem].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n\n return combined.slice(-this.settings.historyRetentionLimit);\n }\n\n getAppHistory(props: BuildAppHistoryProps): AppHistory[] {\n return this.appendHistory({\n history: this.history.total,\n buildFunc: () => this.buildAppHistory(props)\n });\n }\n\n getScenarioHistory({ name, actions }: GetScenarioHistoryProps): ScenarioHistory[] {\n const history = this.history.scenarios[name] || [];\n return this.appendHistory({\n history,\n buildFunc: () => this.buildScenarioHistory({ actions })\n });\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { CoverageReportState } from './models';\nimport { getLogger } from '../tools/logger';\nimport { Settings } from '../config/models';\nimport { isPathExists } from '../tools/files';\n\nconst logger = getLogger('UI_REPORTS_STORAGE');\n\nexport class UIReportsStorage {\n private settings: Settings;\n\n constructor({ settings }: { settings: Settings }) {\n this.settings = settings;\n }\n\n private async injectStateIntoHtml(state: CoverageReportState): Promise<string> {\n const stateJson = JSON.stringify(state);\n const templateFile = this.settings.htmlReportTemplateFile;\n\n if (!templateFile || !(await isPathExists(templateFile))) {\n logger.error('Template HTML report file not found.');\n return '';\n }\n\n const html = await fs.readFile(templateFile, 'utf-8');\n\n const scriptRegex = /<script id=\"state\" type=\"application\\/json\">[\\s\\S]*?<\\/script>/gi;\n const scriptTag = `<script id=\"state\" type=\"application/json\">${stateJson}</script>`;\n\n return html.replace(scriptRegex, scriptTag);\n }\n\n async saveJsonReport(state: CoverageReportState): Promise<void> {\n const file = this.settings.jsonReportFile;\n\n if (!file) {\n logger.info('JSON report file is not configured — skipping JSON report generation.');\n return;\n }\n\n try {\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, JSON.stringify(state, null, 2));\n logger.info(`JSON report saved to ${file}`);\n } catch (error) {\n logger.error(`Failed to write JSON report: ${error}`);\n }\n }\n\n async saveHtmlReport(state: CoverageReportState): Promise<void> {\n const file = this.settings.htmlReportFile;\n\n if (!file) {\n logger.info('HTML report file is not configured — skipping HTML report generation.');\n return;\n }\n\n try {\n const content = await this.injectStateIntoHtml(state);\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content, 'utf-8');\n logger.info(`HTML report saved to ${file}`);\n } catch (error) {\n logger.error(`Failed to write HTML report: ${error}`);\n }\n }\n}\n","import { AppConfig, Settings } from './models';\nimport { loadJson } from '../tools/json';\nimport { loadFromJson, loadFromYaml } from '../tools/files';\nimport path from 'path';\nimport url from 'url';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\nconst cwd = process.cwd();\n\nconst cleanUndefined = <T>(input: Partial<T>): Partial<T> => {\n return Object.fromEntries(Object.entries(input).filter(([_, v]) => v !== undefined)) as Partial<T>;\n};\n\nexport const buildEnvSettings = (): Partial<Settings> => {\n return cleanUndefined({\n apps: loadJson<AppConfig[]>({ content: process.env.UI_COVERAGE_SCENARIO_APPS || '', fallback: [] }),\n resultsDir: process.env.UI_COVERAGE_SCENARIO_RESULTS_DIR || undefined,\n historyFile: process.env.UI_COVERAGE_SCENARIO_HISTORY_FILE || undefined,\n historyRetentionLimit: parseInt(process.env.UI_COVERAGE_SCENARIO_HISTORY_RETENTION_LIMIT || '', 10) || undefined,\n htmlReportFile: process.env.UI_COVERAGE_SCENARIO_HTML_REPORT_FILE || undefined,\n jsonReportFile: process.env.UI_COVERAGE_SCENARIO_JSON_REPORT_FILE || undefined\n });\n};\n\nexport const buildJsonSettings = () => {\n return cleanUndefined(loadFromJson<Settings>(path.join(cwd, 'ui-coverage-scenario.config.json')));\n};\n\nexport const buildYamlSettings = () => {\n return cleanUndefined(loadFromYaml<Settings>(path.join(cwd, 'ui-coverage-scenario.config.yaml')));\n};\n\nexport const buildDefaultSettings = (): Settings => {\n let htmlReportTemplateFile: string;\n try {\n htmlReportTemplateFile = path.join(\n path.dirname(url.fileURLToPath(import.meta.url)),\n 'reports/templates/index.html'\n );\n } catch {\n htmlReportTemplateFile = path.join(cwd, 'src/reports/templates/index.html');\n }\n\n return {\n apps: [],\n resultsDir: path.join(cwd, 'coverage-results'),\n historyFile: path.join(cwd, 'coverage-history.json'),\n historyRetentionLimit: 30,\n htmlReportFile: path.join(cwd, 'index.html'),\n jsonReportFile: path.join(cwd, 'coverage-report.json'),\n htmlReportTemplateFile\n };\n};\n","import { Settings } from './models';\nimport { buildDefaultSettings, buildEnvSettings, buildJsonSettings, buildYamlSettings } from './builders';\n\nexport const getSettings = (): Settings => {\n const defaultSettings = buildDefaultSettings();\n\n return {\n ...defaultSettings,\n ...buildYamlSettings(),\n ...buildJsonSettings(),\n ...buildEnvSettings(),\n htmlReportTemplateFile: defaultSettings.htmlReportTemplateFile\n };\n};\n","import { getLogger } from '../tools/logger';\nimport { UICoverageTrackerStorage } from '../tracker/storage';\nimport { UICoverageHistoryStorage } from '../history/storage';\nimport { CoverageReportState } from '../reports/models';\nimport { UICoverageBuilder } from '../coverage/builder';\nimport { UICoverageHistoryBuilder } from '../history/builder';\nimport { UIReportsStorage } from '../reports/storage';\nimport { getSettings } from '../config/core';\n\nconst logger = getLogger('SAVE_REPORT');\n\nexport const saveReport = async () => {\n logger.info('Starting to save the report');\n\n const settings = getSettings();\n\n const reportsStorage = new UIReportsStorage({ settings });\n const trackerStorage = new UICoverageTrackerStorage({ settings });\n const historyStorage = new UICoverageHistoryStorage({ settings });\n\n const reportState: CoverageReportState = {\n config: { apps: settings.apps },\n createdAt: new Date(),\n appsCoverage: {}\n };\n const historyState = await historyStorage.load();\n const pageResults = await trackerStorage.loadPageResults();\n const elementResults = await trackerStorage.loadElementResults();\n const scenarioResults = await trackerStorage.loadScenarioResults();\n const transitionResults = await trackerStorage.loadTransitionResults();\n for (const app of settings.apps) {\n const pageResultList = pageResults.filter({ app: app.key });\n const elementResultList = elementResults.filter({ app: app.key });\n const scenarioResultList = scenarioResults.filter({ app: app.key });\n const transitionResultList = transitionResults.filter({ app: app.key });\n\n const history = historyState.apps[app.key] || { total: [], scenarios: {} };\n const historyBuilder = new UICoverageHistoryBuilder({ history, settings });\n const coverageBuilder = new UICoverageBuilder({\n historyBuilder,\n pageResultList,\n elementResultList,\n scenarioResultList,\n transitionResultList\n });\n reportState.appsCoverage[app.key] = coverageBuilder.build();\n }\n\n await historyStorage.saveFromReport(reportState);\n await reportsStorage.saveJsonReport(reportState);\n await reportsStorage.saveHtmlReport(reportState);\n\n logger.info('Report saving process completed');\n};\n","import { getLogger } from '../tools/logger';\nimport { getSettings } from '../config/core';\n\nconst logger = getLogger('PRINT_CONFIG');\n\nexport const printConfig = () => {\n const settings = getSettings();\n logger.info(JSON.stringify(settings, null, 2));\n};\n"],"mappings":"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","names":["import_promises","path","fsAsync","fs","yaml","logger","fs","path","uuidv4","import_promises","import_path","logger","logger","fs","path","ActionType","import_promises","import_path","logger","fs","path","import_path","dotenv","path","url","logger","logger"]}