{"version":3,"file":"vis_server_context.logic.mjs","names":[],"sources":["../../src/server/vis_server_context.logic.ts"],"sourcesContent":["import { basename, join, resolve } from 'pathe'\nimport { pick } from 'type-plus'\nimport type { ImageSnapshotKeyOptions } from '../exports/client-api.ts'\nimport type { ImageSnapshotResult } from '../shared/commands.types.ts'\nimport { file } from './externals/file.ts'\nimport {\n\tabsoluteSnapshotFilePath,\n\tgetLegacySnapshotFilename,\n\tresolveLegacySnapshotFileRelativePath,\n} from './snapshot_path_limits.ts'\nimport { getSuite, getTaskSubpath } from './suite.ts'\nimport { getVisOption } from './vis_options.ts'\nimport type { ExtendedBrowserCommandContext } from './vis_server_context.types.ts'\n\nexport function createVisServerContext() {\n\tconst context = {\n\t\tasync getSnapshotResults(browserContext: ExtendedBrowserCommandContext, taskId: string) {\n\t\t\tconst suiteInfo = await context.getSuiteInfo(browserContext, taskId)\n\t\t\tconst base = resolve(suiteInfo.projectRoot, suiteInfo.baselineDir)\n\n\t\t\tconst legacyPattern = join(base, `${suiteInfo.taskId}-*.png`)\n\t\t\tconst baselines = await file.glob(legacyPattern)\n\n\t\t\tconst resultPattern = join(resolve(suiteInfo.projectRoot, suiteInfo.resultDir), `${suiteInfo.taskId}-*.png`)\n\t\t\tconst results = await file.glob(resultPattern)\n\n\t\t\tconst diffPattern = join(resolve(suiteInfo.projectRoot, suiteInfo.diffDir), `${suiteInfo.taskId}-*.png`)\n\t\t\tconst diffs = await file.glob(diffPattern)\n\n\t\t\tconst r: ImageSnapshotResult[] = []\n\t\t\tawait Promise.all(\n\t\t\t\tbaselines.map(async (baselinePath) => {\n\t\t\t\t\tconst filename = basename(baselinePath)\n\t\t\t\t\tconst resultPath = results.find((p) => p.endsWith(filename))\n\t\t\t\t\tconst diffPath = diffs.find((p) => p.endsWith(filename))\n\n\t\t\t\t\tconst baselineBuffer = await file.tryReadFile(baselinePath)\n\t\t\t\t\tconst resultBuffer = await file.tryReadFile(resultPath)\n\t\t\t\t\tconst diffBuffer = await file.tryReadFile(diffPath)\n\t\t\t\t\tr.push({\n\t\t\t\t\t\tfilename,\n\t\t\t\t\t\tbaseline: baselineBuffer?.toString('base64'),\n\t\t\t\t\t\tresult: resultBuffer?.toString('base64'),\n\t\t\t\t\t\tdiff: diffBuffer?.toString('base64'),\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\t\t\treturn r\n\t\t},\n\t\tasync getSnapshotInfo(\n\t\t\tbrowserContext: ExtendedBrowserCommandContext,\n\t\t\ttaskId: string,\n\t\t\toptions?: ImageSnapshotKeyOptions,\n\t\t) {\n\t\t\tconst suiteInfo = await context.getSuiteInfo(browserContext, taskId)\n\t\t\tconst snapshotFilename = context.getSnapshotFilename(browserContext, suiteInfo, options?.snapshotKey)\n\n\t\t\tconst { baselineDir, resultDir, diffDir, task } = suiteInfo\n\n\t\t\ttask.count += 1\n\t\t\tconst baselinePath = join(baselineDir, snapshotFilename)\n\t\t\tconst resultPath = join(resultDir, snapshotFilename)\n\t\t\tconst diffPath = join(diffDir, snapshotFilename)\n\n\t\t\treturn {\n\t\t\t\t...pick(\n\t\t\t\t\tgetVisOption(browserContext),\n\t\t\t\t\t'comparisonMethod',\n\t\t\t\t\t'diffOptions',\n\t\t\t\t\t'failureThreshold',\n\t\t\t\t\t'failureThresholdType',\n\t\t\t\t\t'timeout',\n\t\t\t\t),\n\t\t\t\tbaselinePath,\n\t\t\t\tresultPath,\n\t\t\t\tdiffPath,\n\t\t\t}\n\t\t},\n\n\t\tasync getTaskCount(browserContext: ExtendedBrowserCommandContext, taskId: string) {\n\t\t\treturn (await context.getSuiteInfo(browserContext, taskId)).task.count\n\t\t},\n\t\tasync hasImageSnapshot(\n\t\t\tbrowserContext: ExtendedBrowserCommandContext,\n\t\t\ttaskId: string,\n\t\t\tsnapshotKey: string | undefined,\n\t\t) {\n\t\t\tconst info = await context.getSuiteInfo(browserContext, taskId)\n\t\t\tconst visOptions = getVisOption(browserContext)\n\t\t\tconst legacyFilename = getLegacySnapshotFilename({\n\t\t\t\ttaskId: info.taskId,\n\t\t\t\texplicitSnapshotKey: snapshotKey,\n\t\t\t\tdefaultSnapshotKey: typeof visOptions.snapshotKey === 'string' ? visOptions.snapshotKey : undefined,\n\t\t\t\ttaskCount: info.task.count,\n\t\t\t})\n\t\t\tconst filename = resolveLegacySnapshotFileRelativePath({\n\t\t\t\tprojectRoot: info.projectRoot,\n\t\t\t\tbaselineDir: info.baselineDir,\n\t\t\t\tlegacySnapshotFilename: legacyFilename,\n\t\t\t\tshortenLongSnapshotPaths: visOptions.shortenLongSnapshotPaths === true,\n\t\t\t})\n\t\t\tconst legacyAbs = absoluteSnapshotFilePath(info.projectRoot, info.baselineDir, filename)\n\t\t\treturn file.existFile(legacyAbs)\n\t\t},\n\t\tgetSnapshotFilename(\n\t\t\tbrowserContext: ExtendedBrowserCommandContext,\n\t\t\tinfo: { taskId: string; task: { count: number }; suiteId: string; baselineDir: string; projectRoot: string },\n\t\t\tsnapshotKey: string | undefined,\n\t\t) {\n\t\t\tconst visOptions = getVisOption(browserContext)\n\t\t\tconst legacyFilename = getLegacySnapshotFilename({\n\t\t\t\ttaskId: info.taskId,\n\t\t\t\texplicitSnapshotKey: snapshotKey,\n\t\t\t\tdefaultSnapshotKey: typeof visOptions.snapshotKey === 'string' ? visOptions.snapshotKey : undefined,\n\t\t\t\ttaskCount: info.task.count,\n\t\t\t})\n\t\t\treturn resolveLegacySnapshotFileRelativePath({\n\t\t\t\tprojectRoot: info.projectRoot,\n\t\t\t\tbaselineDir: info.baselineDir,\n\t\t\t\tlegacySnapshotFilename: legacyFilename,\n\t\t\t\tshortenLongSnapshotPaths: visOptions.shortenLongSnapshotPaths === true,\n\t\t\t})\n\t\t},\n\t\tasync getSuiteInfo(browserContext: ExtendedBrowserCommandContext, taskId: string) {\n\t\t\tconst projectState = await getSuite(browserContext)\n\t\t\tconst visOptions = getVisOption(browserContext)\n\t\t\tconst moduleId = getTaskSubpath(projectState, browserContext.testPath, visOptions)\n\t\t\tconst m = projectState.modules[moduleId]!\n\t\t\tconst task = (m.tasks[taskId] = m.tasks[taskId] ?? { count: 1 })\n\t\t\treturn {\n\t\t\t\tprojectRoot: projectState.projectRoot,\n\t\t\t\tsuiteId: moduleId,\n\t\t\t\ttaskId,\n\t\t\t\tbaselineDir: m.baselineDir,\n\t\t\t\tresultDir: m.resultDir,\n\t\t\t\tdiffDir: m.diffDir,\n\t\t\t\ttask,\n\t\t\t}\n\t\t},\n\t}\n\treturn context\n}\n"],"mappings":"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"}