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 • 27.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/tools/actions.ts","../src/tools/selector.ts","../src/tracker/storage.ts","../src/tools/logger.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/tools/json.ts","../src/config/builders.ts","../src/config/core.ts","../src/tracker/core.ts"],"sourcesContent":["export { ActionType } from './tools/actions';\nexport { SelectorType } from './tools/selector';\nexport { UICoverageTracker } from './tracker/core';\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","export enum SelectorType {\n CSS = 'CSS',\n XPath = 'XPATH'\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","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';\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 { 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","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 { UICoverageTrackerStorage } from './storage';\nimport { ActionType } from '../tools/actions';\nimport { SelectorType } from '../tools/selector';\nimport { Settings } from '../config/models';\nimport { getSettings } from '../config/core';\nimport { getLogger } from '../tools/logger';\nimport { CoverageScenarioResult } from './models/scenarios';\n\nconst logger = getLogger('UI_COVERAGE_TRACKER');\n\ntype UICoverageTrackerProps = {\n app: string;\n settings?: Settings;\n};\n\ntype StartScenarioProps = {\n url: string | null;\n name: string;\n};\n\ntype TrackPageProps = {\n url: string;\n page: string;\n priority: number;\n};\n\ntype TrackElementProps = {\n selector: string;\n actionType: ActionType;\n selectorType: SelectorType;\n};\n\ntype TrackTransitionProps = {\n toPage: string;\n fromPage: string;\n};\n\nexport class UICoverageTracker {\n private readonly app: string;\n private readonly storage: UICoverageTrackerStorage;\n private readonly settings: Settings;\n private scenario: CoverageScenarioResult | null;\n\n constructor({ app, settings }: UICoverageTrackerProps) {\n this.app = app;\n this.settings = settings || getSettings();\n\n this.storage = new UICoverageTrackerStorage({ settings: this.settings });\n this.scenario = null;\n }\n\n startScenario({ url, name }: StartScenarioProps): void {\n this.scenario = { url, app: this.app, name };\n }\n\n async endScenario(): Promise<void> {\n if (this.scenario) {\n await this.storage.saveScenarioResult(this.scenario);\n }\n\n this.scenario = null;\n }\n\n /**\n * @deprecated Method is deprecated, use `trackElement` instead.\n */\n async trackCoverage(props: TrackElementProps): Promise<void> {\n logger.warning('Method trackCoverage() is deprecated. Use trackElement() instead.');\n await this.trackElement(props);\n }\n\n async trackPage({ url, page, priority }: TrackPageProps): Promise<void> {\n if (!this.scenario) {\n logger.warning('No active scenario. Did you forget to call startScenario? Calling: trackPage');\n return;\n }\n\n await this.storage.savePageResult({\n app: this.app,\n url: url,\n page: page,\n priority: priority,\n scenario: this.scenario.name\n });\n }\n\n async trackElement({ selector, actionType, selectorType }: TrackElementProps): Promise<void> {\n if (!this.scenario) {\n logger.warning('No active scenario. Did you forget to call startScenario? Calling: trackElement');\n return;\n }\n\n await this.storage.saveElementResult({\n app: this.app,\n scenario: this.scenario.name,\n selector,\n timestamp: Date.now(),\n actionType,\n selectorType\n });\n }\n\n async trackTransition({ toPage, fromPage }: TrackTransitionProps): Promise<void> {\n if (!this.scenario) {\n logger.warning('No active scenario. Did you forget to call startScenario? Calling: trackTransition');\n return;\n }\n\n await this.storage.saveTransitionResult({\n app: this.app,\n toPage,\n scenario: this.scenario.name,\n fromPage\n });\n }\n}\n"],"mappings":"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","names":["ActionType","SelectorType","import_promises","path","fsAsync","fs","yaml","logger","fs","path","uuidv4","logger","import_path","dotenv","path","url","logger","url"]}