@rpcbase/test 0.342.0 → 0.344.0

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.
Files changed (43) hide show
  1. package/dist/clearDatabase.js +10 -12
  2. package/dist/clearDatabase.js.map +1 -1
  3. package/dist/cli.js +439 -556
  4. package/dist/cli.js.map +1 -1
  5. package/dist/coverage/collect.js +63 -101
  6. package/dist/coverage/collect.js.map +1 -1
  7. package/dist/coverage/config-loader.js +180 -230
  8. package/dist/coverage/config-loader.js.map +1 -1
  9. package/dist/coverage/config.js +76 -100
  10. package/dist/coverage/config.js.map +1 -1
  11. package/dist/coverage/console-text-report.js +175 -220
  12. package/dist/coverage/console-text-report.js.map +1 -1
  13. package/dist/coverage/files.js +45 -58
  14. package/dist/coverage/files.js.map +1 -1
  15. package/dist/coverage/fixtures.js +27 -38
  16. package/dist/coverage/fixtures.js.map +1 -1
  17. package/dist/coverage/global-setup.js +15 -18
  18. package/dist/coverage/global-setup.js.map +1 -1
  19. package/dist/coverage/index.js +38 -55
  20. package/dist/coverage/index.js.map +1 -1
  21. package/dist/coverage/report.js +341 -466
  22. package/dist/coverage/report.js.map +1 -1
  23. package/dist/coverage/reporter.js +47 -61
  24. package/dist/coverage/reporter.js.map +1 -1
  25. package/dist/coverage/v8-tracker.js +115 -147
  26. package/dist/coverage/v8-tracker.js.map +1 -1
  27. package/dist/index.js +46 -75
  28. package/dist/index.js.map +1 -1
  29. package/dist/runners/playwright.d.ts.map +1 -1
  30. package/dist/runners/playwright.js +398 -449
  31. package/dist/runners/playwright.js.map +1 -1
  32. package/dist/runners/process.d.ts +4 -1
  33. package/dist/runners/process.d.ts.map +1 -1
  34. package/dist/runners/process.js +111 -101
  35. package/dist/runners/process.js.map +1 -1
  36. package/dist/runners/vitest.js +124 -171
  37. package/dist/runners/vitest.js.map +1 -1
  38. package/dist/serverCoverage.js +28 -42
  39. package/dist/serverCoverage.js.map +1 -1
  40. package/dist/vitest.config.d.ts +1 -1
  41. package/dist/vitest.config.js +62 -74
  42. package/dist/vitest.config.js.map +1 -1
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"v8-tracker.js","sources":["../../src/coverage/v8-tracker.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { Page, TestInfo } from \"@playwright/test\"\n\nimport { isInsideAnyRoot, resolveCollectCoverageRoots } from \"./collect\"\nimport type { CoverageConfig } from \"./types\"\n\n\nconst VITE_FS_PREFIX = \"/@fs/\"\n\nfunction sanitizePathSegment(input: unknown): string {\n const value = String(input ?? \"\").trim()\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\") || \"unknown\"\n}\n\nfunction urlPathLooksLikeFile(pathname: unknown): boolean {\n const base = path.posix.basename(String(pathname ?? \"\"))\n return base.length > 0 && base.includes(\".\")\n}\n\nexport async function createCoverageTracker(\n page: Page,\n config: CoverageConfig,\n): Promise<{ stop: (testInfo: TestInfo) => Promise<void> }> {\n const session = await page.context().newCDPSession(page)\n const scriptMeta = new Map<string, { normalized: { absolutePath: string; relativePath: string } | null; url: string }>()\n const sourceCache = new Map<string, Promise<string>>()\n const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir)\n\n await session.send(\"Debugger.enable\")\n session.on(\"Debugger.scriptParsed\", (event: any) => {\n if (!event.url) {\n return\n }\n\n const normalized = normalizeScriptUrl(event.url, config)\n const trackable = normalized\n && !isNodeModulesPath(normalized.absolutePath)\n && isInsideAnyRoot(normalized.absolutePath, scriptRoots)\n\n scriptMeta.set(event.scriptId, {\n normalized: trackable ? normalized : null,\n url: event.url,\n })\n })\n\n await session.send(\"Profiler.enable\")\n await session.send(\"Profiler.startPreciseCoverage\", { callCount: false, detailed: true })\n\n return {\n async stop(testInfo: TestInfo) {\n try {\n const payload = await collectCoveragePayload(session, scriptMeta, sourceCache, testInfo, config)\n\n if (payload.scripts.length === 0) {\n return\n }\n\n const outputFile = resolveCoverageOutputFile(config, testInfo)\n await fs.mkdir(path.dirname(outputFile), { recursive: true })\n await fs.writeFile(outputFile, JSON.stringify(payload, null, 2), \"utf8\")\n } finally {\n await shutdownSession(session)\n }\n },\n }\n}\n\nfunction resolveCoverageOutputFile(config: CoverageConfig, testInfo: TestInfo): string {\n const projectName = sanitizePathSegment(testInfo.project?.name)\n const testId = sanitizePathSegment(testInfo.testId)\n const outputDir = path.join(config.rootDir, \"build\", \"playwright\", \"coverage\", projectName, testId)\n return path.join(outputDir, config.coverageFileName)\n}\n\nasync function collectCoveragePayload(\n session: any,\n scriptMeta: Map<string, { normalized: { absolutePath: string; relativePath: string } | null; url: string }>,\n sourceCache: Map<string, Promise<string>>,\n testInfo: TestInfo,\n config: CoverageConfig,\n): Promise<{ testId: string; scripts: any[] }> {\n const { result } = await session.send(\"Profiler.takePreciseCoverage\")\n await session.send(\"Profiler.stopPreciseCoverage\")\n\n const scripts = []\n\n for (const script of result) {\n const meta = scriptMeta.get(script.scriptId)\n if (!meta || !meta.normalized) {\n continue\n }\n\n const source = await resolveScriptSource(session, sourceCache, script.scriptId)\n scripts.push({\n absolutePath: meta.normalized.absolutePath,\n relativePath: meta.normalized.relativePath,\n source,\n functions: script.functions,\n url: meta.url,\n })\n }\n\n return {\n testId: testInfo.titlePath.join(\" › \"),\n scripts,\n }\n}\n\nasync function resolveScriptSource(session: any, cache: Map<string, Promise<string>>, scriptId: string): Promise<string> {\n const cached = cache.get(scriptId)\n if (cached) {\n return cached\n }\n\n const promise = fetchScriptSource(session, scriptId)\n cache.set(scriptId, promise)\n return promise\n}\n\nasync function fetchScriptSource(session: any, scriptId: string): Promise<string> {\n try {\n const sourceResponse = await session.send(\"Debugger.getScriptSource\", { scriptId })\n return sourceResponse?.scriptSource ?? \"\"\n } catch (error: any) {\n const message = String(error?.message ?? error)\n if (message.includes(\"Debugger agent is not enabled\")) {\n try {\n await session.send(\"Debugger.enable\")\n const sourceResponse = await session.send(\"Debugger.getScriptSource\", { scriptId })\n return sourceResponse?.scriptSource ?? \"\"\n } catch {\n return \"\"\n }\n }\n\n return \"\"\n }\n}\n\nasync function shutdownSession(session: any): Promise<void> {\n await Promise.allSettled([\n session.send(\"Profiler.stopPreciseCoverage\").catch(() => undefined),\n session.send(\"Profiler.disable\").catch(() => undefined),\n session.send(\"Debugger.disable\").catch(() => undefined),\n ])\n await session.detach().catch(() => undefined)\n}\n\nfunction normalizeScriptUrl(rawUrl: string, config: CoverageConfig): { absolutePath: string; relativePath: string } | null {\n if (!rawUrl || rawUrl.startsWith(\"node:\")) {\n return null\n }\n\n const cleaned = stripQuery(rawUrl)\n let pathname = cleaned\n\n try {\n const parsed = new URL(cleaned)\n pathname = parsed.pathname\n } catch {\n // keep as-is for relative paths\n }\n\n if (!pathname) {\n return null\n }\n\n let absolutePath\n\n const decoded = decodeURIComponent(pathname)\n if (decoded.startsWith(VITE_FS_PREFIX)) {\n const fsPath = decoded.slice(VITE_FS_PREFIX.length)\n const normalizedFsPath = fsPath.startsWith(\"/\") || /^[A-Za-z]:\\//.test(fsPath)\n ? fsPath\n : `/${fsPath}`\n absolutePath = path.normalize(normalizedFsPath)\n } else if (decoded.startsWith(\"/\")) {\n if (!urlPathLooksLikeFile(decoded)) {\n return null\n }\n absolutePath = path.resolve(process.cwd(), `.${decoded}`)\n } else {\n return null\n }\n\n return createNormalizedPath(absolutePath, config.rootDir)\n}\n\nfunction createNormalizedPath(absolutePath: string, rootDir: string): { absolutePath: string; relativePath: string } {\n const normalizedAbsolute = path.normalize(absolutePath)\n const relativePath = path.relative(rootDir, normalizedAbsolute)\n return {\n absolutePath: normalizedAbsolute,\n relativePath,\n }\n}\n\nfunction stripQuery(url: string): string {\n const queryIndex = url.indexOf(\"?\")\n const hashIndex = url.indexOf(\"#\")\n\n const endIndex = Math.min(\n queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex,\n hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex,\n )\n\n if (!Number.isFinite(endIndex)) {\n return url\n }\n\n return url.slice(0, endIndex)\n}\n\nfunction isNodeModulesPath(filePath: string): boolean {\n return path\n .normalize(String(filePath ?? \"\"))\n .split(path.sep)\n .includes(\"node_modules\")\n}\n"],"names":["VITE_FS_PREFIX","sanitizePathSegment","input","value","String","trim","replace","urlPathLooksLikeFile","pathname","base","path","posix","basename","length","includes","createCoverageTracker","page","config","session","context","newCDPSession","scriptMeta","Map","sourceCache","scriptRoots","resolveCollectCoverageRoots","collectCoverageFrom","rootDir","send","on","event","url","normalized","normalizeScriptUrl","trackable","isNodeModulesPath","absolutePath","isInsideAnyRoot","set","scriptId","callCount","detailed","stop","testInfo","payload","collectCoveragePayload","scripts","outputFile","resolveCoverageOutputFile","fs","mkdir","dirname","recursive","writeFile","JSON","stringify","shutdownSession","projectName","project","name","testId","outputDir","join","coverageFileName","result","script","meta","get","source","resolveScriptSource","push","relativePath","functions","titlePath","cache","cached","promise","fetchScriptSource","sourceResponse","scriptSource","error","message","Promise","allSettled","catch","undefined","detach","rawUrl","startsWith","cleaned","stripQuery","parsed","URL","decoded","decodeURIComponent","fsPath","slice","normalizedFsPath","test","normalize","resolve","process","cwd","createNormalizedPath","normalizedAbsolute","relative","queryIndex","indexOf","hashIndex","endIndex","Math","min","Number","POSITIVE_INFINITY","isFinite","filePath","split","sep"],"mappings":"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"}
1
+ {"version":3,"file":"v8-tracker.js","names":["fs","path","Page","TestInfo","isInsideAnyRoot","resolveCollectCoverageRoots","CoverageConfig","VITE_FS_PREFIX","sanitizePathSegment","input","value","String","trim","replace","urlPathLooksLikeFile","pathname","base","posix","basename","length","includes","createCoverageTracker","page","config","Promise","stop","testInfo","session","context","newCDPSession","scriptMeta","Map","normalized","absolutePath","relativePath","url","sourceCache","scriptRoots","collectCoverageFrom","rootDir","send","on","event","normalizeScriptUrl","trackable","isNodeModulesPath","set","scriptId","callCount","detailed","payload","collectCoveragePayload","scripts","outputFile","resolveCoverageOutputFile","mkdir","dirname","recursive","writeFile","JSON","stringify","shutdownSession","projectName","project","name","testId","outputDir","join","coverageFileName","result","script","meta","get","source","resolveScriptSource","push","functions","titlePath","cache","cached","promise","fetchScriptSource","sourceResponse","scriptSource","error","message","allSettled","catch","undefined","detach","rawUrl","startsWith","cleaned","stripQuery","parsed","URL","decoded","decodeURIComponent","fsPath","slice","normalizedFsPath","test","normalize","resolve","process","cwd","createNormalizedPath","normalizedAbsolute","relative","queryIndex","indexOf","hashIndex","endIndex","Math","min","Number","POSITIVE_INFINITY","isFinite","filePath","split","sep"],"sources":["../../src/coverage/v8-tracker.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { Page, TestInfo } from \"@playwright/test\"\n\nimport { isInsideAnyRoot, resolveCollectCoverageRoots } from \"./collect\"\nimport type { CoverageConfig } from \"./types\"\n\n\nconst VITE_FS_PREFIX = \"/@fs/\"\n\nfunction sanitizePathSegment(input: unknown): string {\n const value = String(input ?? \"\").trim()\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\") || \"unknown\"\n}\n\nfunction urlPathLooksLikeFile(pathname: unknown): boolean {\n const base = path.posix.basename(String(pathname ?? \"\"))\n return base.length > 0 && base.includes(\".\")\n}\n\nexport async function createCoverageTracker(\n page: Page,\n config: CoverageConfig,\n): Promise<{ stop: (testInfo: TestInfo) => Promise<void> }> {\n const session = await page.context().newCDPSession(page)\n const scriptMeta = new Map<string, { normalized: { absolutePath: string; relativePath: string } | null; url: string }>()\n const sourceCache = new Map<string, Promise<string>>()\n const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir)\n\n await session.send(\"Debugger.enable\")\n session.on(\"Debugger.scriptParsed\", (event: any) => {\n if (!event.url) {\n return\n }\n\n const normalized = normalizeScriptUrl(event.url, config)\n const trackable = normalized\n && !isNodeModulesPath(normalized.absolutePath)\n && isInsideAnyRoot(normalized.absolutePath, scriptRoots)\n\n scriptMeta.set(event.scriptId, {\n normalized: trackable ? normalized : null,\n url: event.url,\n })\n })\n\n await session.send(\"Profiler.enable\")\n await session.send(\"Profiler.startPreciseCoverage\", { callCount: false, detailed: true })\n\n return {\n async stop(testInfo: TestInfo) {\n try {\n const payload = await collectCoveragePayload(session, scriptMeta, sourceCache, testInfo, config)\n\n if (payload.scripts.length === 0) {\n return\n }\n\n const outputFile = resolveCoverageOutputFile(config, testInfo)\n await fs.mkdir(path.dirname(outputFile), { recursive: true })\n await fs.writeFile(outputFile, JSON.stringify(payload, null, 2), \"utf8\")\n } finally {\n await shutdownSession(session)\n }\n },\n }\n}\n\nfunction resolveCoverageOutputFile(config: CoverageConfig, testInfo: TestInfo): string {\n const projectName = sanitizePathSegment(testInfo.project?.name)\n const testId = sanitizePathSegment(testInfo.testId)\n const outputDir = path.join(config.rootDir, \"build\", \"playwright\", \"coverage\", projectName, testId)\n return path.join(outputDir, config.coverageFileName)\n}\n\nasync function collectCoveragePayload(\n session: any,\n scriptMeta: Map<string, { normalized: { absolutePath: string; relativePath: string } | null; url: string }>,\n sourceCache: Map<string, Promise<string>>,\n testInfo: TestInfo,\n config: CoverageConfig,\n): Promise<{ testId: string; scripts: any[] }> {\n const { result } = await session.send(\"Profiler.takePreciseCoverage\")\n await session.send(\"Profiler.stopPreciseCoverage\")\n\n const scripts = []\n\n for (const script of result) {\n const meta = scriptMeta.get(script.scriptId)\n if (!meta || !meta.normalized) {\n continue\n }\n\n const source = await resolveScriptSource(session, sourceCache, script.scriptId)\n scripts.push({\n absolutePath: meta.normalized.absolutePath,\n relativePath: meta.normalized.relativePath,\n source,\n functions: script.functions,\n url: meta.url,\n })\n }\n\n return {\n testId: testInfo.titlePath.join(\" › \"),\n scripts,\n }\n}\n\nasync function resolveScriptSource(session: any, cache: Map<string, Promise<string>>, scriptId: string): Promise<string> {\n const cached = cache.get(scriptId)\n if (cached) {\n return cached\n }\n\n const promise = fetchScriptSource(session, scriptId)\n cache.set(scriptId, promise)\n return promise\n}\n\nasync function fetchScriptSource(session: any, scriptId: string): Promise<string> {\n try {\n const sourceResponse = await session.send(\"Debugger.getScriptSource\", { scriptId })\n return sourceResponse?.scriptSource ?? \"\"\n } catch (error: any) {\n const message = String(error?.message ?? error)\n if (message.includes(\"Debugger agent is not enabled\")) {\n try {\n await session.send(\"Debugger.enable\")\n const sourceResponse = await session.send(\"Debugger.getScriptSource\", { scriptId })\n return sourceResponse?.scriptSource ?? \"\"\n } catch {\n return \"\"\n }\n }\n\n return \"\"\n }\n}\n\nasync function shutdownSession(session: any): Promise<void> {\n await Promise.allSettled([\n session.send(\"Profiler.stopPreciseCoverage\").catch(() => undefined),\n session.send(\"Profiler.disable\").catch(() => undefined),\n session.send(\"Debugger.disable\").catch(() => undefined),\n ])\n await session.detach().catch(() => undefined)\n}\n\nfunction normalizeScriptUrl(rawUrl: string, config: CoverageConfig): { absolutePath: string; relativePath: string } | null {\n if (!rawUrl || rawUrl.startsWith(\"node:\")) {\n return null\n }\n\n const cleaned = stripQuery(rawUrl)\n let pathname = cleaned\n\n try {\n const parsed = new URL(cleaned)\n pathname = parsed.pathname\n } catch {\n // keep as-is for relative paths\n }\n\n if (!pathname) {\n return null\n }\n\n let absolutePath\n\n const decoded = decodeURIComponent(pathname)\n if (decoded.startsWith(VITE_FS_PREFIX)) {\n const fsPath = decoded.slice(VITE_FS_PREFIX.length)\n const normalizedFsPath = fsPath.startsWith(\"/\") || /^[A-Za-z]:\\//.test(fsPath)\n ? fsPath\n : `/${fsPath}`\n absolutePath = path.normalize(normalizedFsPath)\n } else if (decoded.startsWith(\"/\")) {\n if (!urlPathLooksLikeFile(decoded)) {\n return null\n }\n absolutePath = path.resolve(process.cwd(), `.${decoded}`)\n } else {\n return null\n }\n\n return createNormalizedPath(absolutePath, config.rootDir)\n}\n\nfunction createNormalizedPath(absolutePath: string, rootDir: string): { absolutePath: string; relativePath: string } {\n const normalizedAbsolute = path.normalize(absolutePath)\n const relativePath = path.relative(rootDir, normalizedAbsolute)\n return {\n absolutePath: normalizedAbsolute,\n relativePath,\n }\n}\n\nfunction stripQuery(url: string): string {\n const queryIndex = url.indexOf(\"?\")\n const hashIndex = url.indexOf(\"#\")\n\n const endIndex = Math.min(\n queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex,\n hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex,\n )\n\n if (!Number.isFinite(endIndex)) {\n return url\n }\n\n return url.slice(0, endIndex)\n}\n\nfunction isNodeModulesPath(filePath: string): boolean {\n return path\n .normalize(String(filePath ?? \"\"))\n .split(path.sep)\n .includes(\"node_modules\")\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,87 +1,58 @@
1
- import { test as test$2, expect as expect$1, defineConfig as defineConfig$1 } from "@playwright/test";
2
- export * from "@playwright/test";
3
- import { devices } from "@playwright/test";
4
1
  import { loadCoverageOptionsSync } from "./coverage/config-loader.js";
2
+ import { createCoverageConfig } from "./coverage/config.js";
3
+ import { findCoverageFiles, removeCoverageFiles } from "./coverage/files.js";
4
+ import { createCoverageGlobalSetup } from "./coverage/global-setup.js";
5
+ import { createCoverageFixtures } from "./coverage/fixtures.js";
6
+ import { generateCoverageReport } from "./coverage/report.js";
7
+ import CoverageReporter from "./coverage/reporter.js";
5
8
  import { createCoverageHarness } from "./coverage/index.js";
6
9
  import { clearDatabase } from "./clearDatabase.js";
7
10
  import { setupServerCoverage } from "./serverCoverage.js";
8
- import { CoverageReporter } from "./coverage/reporter.js";
9
- import { createCoverageConfig } from "./coverage/config.js";
10
- import { generateCoverageReport } from "./coverage/report.js";
11
- import { createCoverageFixtures } from "./coverage/fixtures.js";
12
- import { createCoverageGlobalSetup } from "./coverage/global-setup.js";
13
- import { findCoverageFiles, removeCoverageFiles } from "./coverage/files.js";
14
- const coverageOptions = loadCoverageOptionsSync({
15
- optional: true
16
- });
17
- const coverageHarness = coverageOptions ? createCoverageHarness(coverageOptions) : null;
18
- const test = coverageHarness ? coverageHarness.extendTest(test$2) : test$2;
19
- const expect = expect$1;
11
+ import { defineConfig as defineConfig$1, devices, expect as expect$1, test as test$1 } from "@playwright/test";
12
+ export * from "@playwright/test";
13
+ //#region src/index.ts
14
+ var coverageOptions = loadCoverageOptionsSync({ optional: true });
15
+ var coverageHarness = coverageOptions ? createCoverageHarness(coverageOptions) : null;
16
+ var test = coverageHarness ? coverageHarness.extendTest(test$1) : test$1;
17
+ var expect = expect$1;
20
18
  function defineConfig(userConfig = {}) {
21
- const normalized = {
22
- ...userConfig
23
- };
24
- const reporters = ensureReporterArray(normalized.reporter);
25
- if (coverageHarness?.config.coverageEnabled && process.env.RB_TEST_COMBINED_COVERAGE !== "1") {
26
- const coverageReporter = coverageHarness.reporterEntry();
27
- if (!reporters.some(([name]) => name === coverageReporter[0])) {
28
- reporters.push(coverageReporter);
29
- }
30
- }
31
- normalized.reporter = reporters;
32
- applySpecFileConventions(normalized);
33
- return defineConfig$1(normalized);
19
+ const normalized = { ...userConfig };
20
+ const reporters = ensureReporterArray(normalized.reporter);
21
+ if (coverageHarness?.config.coverageEnabled && process.env.RB_TEST_COMBINED_COVERAGE !== "1") {
22
+ const coverageReporter = coverageHarness.reporterEntry();
23
+ if (!reporters.some(([name]) => name === coverageReporter[0])) reporters.push(coverageReporter);
24
+ }
25
+ normalized.reporter = reporters;
26
+ applySpecFileConventions(normalized);
27
+ return defineConfig$1(normalized);
34
28
  }
35
29
  function ensureReporterArray(reporter) {
36
- if (!reporter) {
37
- return [["list"]];
38
- }
39
- if (!Array.isArray(reporter)) {
40
- return [normalizeReporterEntry(reporter)];
41
- }
42
- return reporter.map((entry) => normalizeReporterEntry(entry));
30
+ if (!reporter) return [["list"]];
31
+ if (!Array.isArray(reporter)) return [normalizeReporterEntry(reporter)];
32
+ return reporter.map((entry) => normalizeReporterEntry(entry));
43
33
  }
44
34
  function normalizeReporterEntry(entry) {
45
- if (Array.isArray(entry)) {
46
- return entry;
47
- }
48
- return [entry];
35
+ if (Array.isArray(entry)) return entry;
36
+ return [entry];
49
37
  }
50
- const DESKTOP_SPEC_MATCH = [/\.spec(?:\.desktop)?\.(?:[cm]?[jt]sx?)$/];
51
- const MOBILE_SPEC_MATCH = [/\.spec(?:\.mobile)?\.(?:[cm]?[jt]sx?)$/];
38
+ var DESKTOP_SPEC_MATCH = [/\.spec(?:\.desktop)?\.(?:[cm]?[jt]sx?)$/];
39
+ var MOBILE_SPEC_MATCH = [/\.spec(?:\.mobile)?\.(?:[cm]?[jt]sx?)$/];
52
40
  function applySpecFileConventions(config) {
53
- if (config.testMatch != null) {
54
- return;
55
- }
56
- if (!Array.isArray(config.projects) || config.projects.length === 0) {
57
- config.testMatch = DESKTOP_SPEC_MATCH;
58
- return;
59
- }
60
- config.projects = config.projects.map((project) => {
61
- if (!project || project.testMatch != null) {
62
- return project;
63
- }
64
- const testMatch = project.use?.isMobile ? MOBILE_SPEC_MATCH : DESKTOP_SPEC_MATCH;
65
- return {
66
- ...project,
67
- testMatch
68
- };
69
- });
41
+ if (config.testMatch != null) return;
42
+ if (!Array.isArray(config.projects) || config.projects.length === 0) {
43
+ config.testMatch = DESKTOP_SPEC_MATCH;
44
+ return;
45
+ }
46
+ config.projects = config.projects.map((project) => {
47
+ if (!project || project.testMatch != null) return project;
48
+ const testMatch = project.use?.isMobile ? MOBILE_SPEC_MATCH : DESKTOP_SPEC_MATCH;
49
+ return {
50
+ ...project,
51
+ testMatch
52
+ };
53
+ });
70
54
  }
71
- export {
72
- CoverageReporter,
73
- clearDatabase,
74
- createCoverageConfig,
75
- createCoverageFixtures,
76
- createCoverageGlobalSetup,
77
- createCoverageHarness,
78
- defineConfig,
79
- devices,
80
- expect,
81
- findCoverageFiles,
82
- generateCoverageReport,
83
- removeCoverageFiles,
84
- setupServerCoverage,
85
- test
86
- };
87
- //# sourceMappingURL=index.js.map
55
+ //#endregion
56
+ export { CoverageReporter, clearDatabase, createCoverageConfig, createCoverageFixtures, createCoverageGlobalSetup, createCoverageHarness, defineConfig, devices, expect, findCoverageFiles, generateCoverageReport, removeCoverageFiles, setupServerCoverage, test };
57
+
58
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { test as baseTest, expect as baseExpect, defineConfig as playwrightDefineConfig, devices } from \"@playwright/test\"\n\nimport { loadCoverageOptionsSync } from \"./coverage/config-loader\"\nimport { createCoverageHarness } from \"./coverage\"\n\n\nexport * from \"@playwright/test\"\n\nexport { clearDatabase } from \"./clearDatabase\"\nexport * from \"./coverage\"\nexport * from \"./serverCoverage\"\n\nconst coverageOptions = loadCoverageOptionsSync({ optional: true })\nconst coverageHarness = coverageOptions ? createCoverageHarness(coverageOptions) : null\nexport const test: typeof baseTest = coverageHarness ? coverageHarness.extendTest(baseTest) : baseTest\nexport const expect = baseExpect\nexport { devices }\n\ntype PlaywrightConfig = Parameters<typeof playwrightDefineConfig>[0]\ntype ReporterEntry = [string, Record<string, unknown>?]\n\nexport function defineConfig(userConfig: PlaywrightConfig = {}) {\n const normalized: any = { ...userConfig }\n const reporters = ensureReporterArray(normalized.reporter)\n\n if (coverageHarness?.config.coverageEnabled && process.env.RB_TEST_COMBINED_COVERAGE !== \"1\") {\n const coverageReporter = coverageHarness.reporterEntry()\n if (!reporters.some(([name]) => name === coverageReporter[0])) {\n reporters.push(coverageReporter)\n }\n }\n\n normalized.reporter = reporters\n\n applySpecFileConventions(normalized)\n\n return playwrightDefineConfig(normalized)\n}\n\nfunction ensureReporterArray(reporter: any): ReporterEntry[] {\n if (!reporter) {\n return [[\"list\"]]\n }\n\n if (!Array.isArray(reporter)) {\n return [normalizeReporterEntry(reporter)]\n }\n\n return reporter.map((entry: any) => normalizeReporterEntry(entry))\n}\n\nfunction normalizeReporterEntry(entry: any): ReporterEntry {\n if (Array.isArray(entry)) {\n return entry as ReporterEntry\n }\n return [entry] as ReporterEntry\n}\n\nconst DESKTOP_SPEC_MATCH = [/\\.spec(?:\\.desktop)?\\.(?:[cm]?[jt]sx?)$/]\nconst MOBILE_SPEC_MATCH = [/\\.spec(?:\\.mobile)?\\.(?:[cm]?[jt]sx?)$/]\n\nfunction applySpecFileConventions(config: any): void {\n if (config.testMatch != null) {\n return\n }\n\n if (!Array.isArray(config.projects) || config.projects.length === 0) {\n config.testMatch = DESKTOP_SPEC_MATCH\n return\n }\n\n config.projects = config.projects.map((project: any) => {\n if (!project || project.testMatch != null) {\n return project\n }\n const testMatch = project.use?.isMobile ? MOBILE_SPEC_MATCH : DESKTOP_SPEC_MATCH\n return { ...project, testMatch }\n })\n}\n"],"names":["coverageOptions","loadCoverageOptionsSync","optional","coverageHarness","createCoverageHarness","test","extendTest","baseTest","expect","baseExpect","defineConfig","userConfig","normalized","reporters","ensureReporterArray","reporter","config","coverageEnabled","process","env","RB_TEST_COMBINED_COVERAGE","coverageReporter","reporterEntry","some","name","push","applySpecFileConventions","playwrightDefineConfig","Array","isArray","normalizeReporterEntry","map","entry","DESKTOP_SPEC_MATCH","MOBILE_SPEC_MATCH","testMatch","projects","length","project","use","isMobile"],"mappings":";;;;;;;;;;;;;AAYA,MAAMA,kBAAkBC,wBAAwB;AAAA,EAAEC,UAAU;AAAK,CAAC;AAClE,MAAMC,kBAAkBH,kBAAkBI,sBAAsBJ,eAAe,IAAI;AAC5E,MAAMK,OAAwBF,kBAAkBA,gBAAgBG,WAAWC,MAAQ,IAAIA;AACvF,MAAMC,SAASC;AAMf,SAASC,aAAaC,aAA+B,IAAI;AAC9D,QAAMC,aAAkB;AAAA,IAAE,GAAGD;AAAAA,EAAAA;AAC7B,QAAME,YAAYC,oBAAoBF,WAAWG,QAAQ;AAEzD,MAAIZ,iBAAiBa,OAAOC,mBAAmBC,QAAQC,IAAIC,8BAA8B,KAAK;AAC5F,UAAMC,mBAAmBlB,gBAAgBmB,cAAAA;AACzC,QAAI,CAACT,UAAUU,KAAK,CAAC,CAACC,IAAI,MAAMA,SAASH,iBAAiB,CAAC,CAAC,GAAG;AAC7DR,gBAAUY,KAAKJ,gBAAgB;AAAA,IACjC;AAAA,EACF;AAEAT,aAAWG,WAAWF;AAEtBa,2BAAyBd,UAAU;AAEnC,SAAOe,eAAuBf,UAAU;AAC1C;AAEA,SAASE,oBAAoBC,UAAgC;AAC3D,MAAI,CAACA,UAAU;AACb,WAAO,CAAC,CAAC,MAAM,CAAC;AAAA,EAClB;AAEA,MAAI,CAACa,MAAMC,QAAQd,QAAQ,GAAG;AAC5B,WAAO,CAACe,uBAAuBf,QAAQ,CAAC;AAAA,EAC1C;AAEA,SAAOA,SAASgB,IAAI,CAACC,UAAeF,uBAAuBE,KAAK,CAAC;AACnE;AAEA,SAASF,uBAAuBE,OAA2B;AACzD,MAAIJ,MAAMC,QAAQG,KAAK,GAAG;AACxB,WAAOA;AAAAA,EACT;AACA,SAAO,CAACA,KAAK;AACf;AAEA,MAAMC,qBAAqB,CAAC,yCAAyC;AACrE,MAAMC,oBAAoB,CAAC,wCAAwC;AAEnE,SAASR,yBAAyBV,QAAmB;AACnD,MAAIA,OAAOmB,aAAa,MAAM;AAC5B;AAAA,EACF;AAEA,MAAI,CAACP,MAAMC,QAAQb,OAAOoB,QAAQ,KAAKpB,OAAOoB,SAASC,WAAW,GAAG;AACnErB,WAAOmB,YAAYF;AACnB;AAAA,EACF;AAEAjB,SAAOoB,WAAWpB,OAAOoB,SAASL,IAAI,CAACO,YAAiB;AACtD,QAAI,CAACA,WAAWA,QAAQH,aAAa,MAAM;AACzC,aAAOG;AAAAA,IACT;AACA,UAAMH,YAAYG,QAAQC,KAAKC,WAAWN,oBAAoBD;AAC9D,WAAO;AAAA,MAAE,GAAGK;AAAAA,MAASH;AAAAA,IAAAA;AAAAA,EACvB,CAAC;AACH;"}
1
+ {"version":3,"file":"index.js","names":["test","baseTest","expect","baseExpect","defineConfig","playwrightDefineConfig","devices","loadCoverageOptionsSync","createCoverageHarness","clearDatabase","coverageOptions","optional","coverageHarness","extendTest","PlaywrightConfig","Parameters","ReporterEntry","Record","userConfig","normalized","reporters","ensureReporterArray","reporter","config","coverageEnabled","process","env","RB_TEST_COMBINED_COVERAGE","coverageReporter","reporterEntry","some","name","push","applySpecFileConventions","Array","isArray","normalizeReporterEntry","map","entry","DESKTOP_SPEC_MATCH","MOBILE_SPEC_MATCH","testMatch","projects","length","project","use","isMobile"],"sources":["../src/index.ts"],"sourcesContent":["import { test as baseTest, expect as baseExpect, defineConfig as playwrightDefineConfig, devices } from \"@playwright/test\"\n\nimport { loadCoverageOptionsSync } from \"./coverage/config-loader\"\nimport { createCoverageHarness } from \"./coverage\"\n\n\nexport * from \"@playwright/test\"\n\nexport { clearDatabase } from \"./clearDatabase\"\nexport * from \"./coverage\"\nexport * from \"./serverCoverage\"\n\nconst coverageOptions = loadCoverageOptionsSync({ optional: true })\nconst coverageHarness = coverageOptions ? createCoverageHarness(coverageOptions) : null\nexport const test: typeof baseTest = coverageHarness ? coverageHarness.extendTest(baseTest) : baseTest\nexport const expect = baseExpect\nexport { devices }\n\ntype PlaywrightConfig = Parameters<typeof playwrightDefineConfig>[0]\ntype ReporterEntry = [string, Record<string, unknown>?]\n\nexport function defineConfig(userConfig: PlaywrightConfig = {}) {\n const normalized: any = { ...userConfig }\n const reporters = ensureReporterArray(normalized.reporter)\n\n if (coverageHarness?.config.coverageEnabled && process.env.RB_TEST_COMBINED_COVERAGE !== \"1\") {\n const coverageReporter = coverageHarness.reporterEntry()\n if (!reporters.some(([name]) => name === coverageReporter[0])) {\n reporters.push(coverageReporter)\n }\n }\n\n normalized.reporter = reporters\n\n applySpecFileConventions(normalized)\n\n return playwrightDefineConfig(normalized)\n}\n\nfunction ensureReporterArray(reporter: any): ReporterEntry[] {\n if (!reporter) {\n return [[\"list\"]]\n }\n\n if (!Array.isArray(reporter)) {\n return [normalizeReporterEntry(reporter)]\n }\n\n return reporter.map((entry: any) => normalizeReporterEntry(entry))\n}\n\nfunction normalizeReporterEntry(entry: any): ReporterEntry {\n if (Array.isArray(entry)) {\n return entry as ReporterEntry\n }\n return [entry] as ReporterEntry\n}\n\nconst DESKTOP_SPEC_MATCH = [/\\.spec(?:\\.desktop)?\\.(?:[cm]?[jt]sx?)$/]\nconst MOBILE_SPEC_MATCH = [/\\.spec(?:\\.mobile)?\\.(?:[cm]?[jt]sx?)$/]\n\nfunction applySpecFileConventions(config: any): void {\n if (config.testMatch != null) {\n return\n }\n\n if (!Array.isArray(config.projects) || config.projects.length === 0) {\n config.testMatch = DESKTOP_SPEC_MATCH\n return\n }\n\n config.projects = config.projects.map((project: any) => {\n if (!project || project.testMatch != null) {\n return project\n }\n const testMatch = project.use?.isMobile ? MOBILE_SPEC_MATCH : DESKTOP_SPEC_MATCH\n return { ...project, testMatch }\n })\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAMU,kBAAkBH,wBAAwB,EAAEI,UAAU,MAAM,CAAC;AACnE,IAAMC,kBAAkBF,kBAAkBF,sBAAsBE,gBAAgB,GAAG;AACnF,IAAaV,OAAwBY,kBAAkBA,gBAAgBC,WAAWZ,OAAS,GAAGA;AAC9F,IAAaC,SAASC;AAMtB,SAAgBC,aAAac,aAA+B,EAAE,EAAE;CAC9D,MAAMC,aAAkB,EAAE,GAAGD,YAAY;CACzC,MAAME,YAAYC,oBAAoBF,WAAWG,SAAS;AAE1D,KAAIV,iBAAiBW,OAAOC,mBAAmBC,QAAQC,IAAIC,8BAA8B,KAAK;EAC5F,MAAMC,mBAAmBhB,gBAAgBiB,eAAe;AACxD,MAAI,CAACT,UAAUU,MAAM,CAACC,UAAUA,SAASH,iBAAiB,GAAG,CAC3DR,WAAUY,KAAKJ,iBAAiB;;AAIpCT,YAAWG,WAAWF;AAEtBa,0BAAyBd,WAAW;AAEpC,QAAOd,eAAuBc,WAAW;;AAG3C,SAASE,oBAAoBC,UAAgC;AAC3D,KAAI,CAACA,SACH,QAAO,CAAC,CAAC,OAAO,CAAC;AAGnB,KAAI,CAACY,MAAMC,QAAQb,SAAS,CAC1B,QAAO,CAACc,uBAAuBd,SAAS,CAAC;AAG3C,QAAOA,SAASe,KAAKC,UAAeF,uBAAuBE,MAAM,CAAC;;AAGpE,SAASF,uBAAuBE,OAA2B;AACzD,KAAIJ,MAAMC,QAAQG,MAAM,CACtB,QAAOA;AAET,QAAO,CAACA,MAAM;;AAGhB,IAAMC,qBAAqB,CAAC,0CAA0C;AACtE,IAAMC,oBAAoB,CAAC,yCAAyC;AAEpE,SAASP,yBAAyBV,QAAmB;AACnD,KAAIA,OAAOkB,aAAa,KACtB;AAGF,KAAI,CAACP,MAAMC,QAAQZ,OAAOmB,SAAS,IAAInB,OAAOmB,SAASC,WAAW,GAAG;AACnEpB,SAAOkB,YAAYF;AACnB;;AAGFhB,QAAOmB,WAAWnB,OAAOmB,SAASL,KAAKO,YAAiB;AACtD,MAAI,CAACA,WAAWA,QAAQH,aAAa,KACnC,QAAOG;EAET,MAAMH,YAAYG,QAAQC,KAAKC,WAAWN,oBAAoBD;AAC9D,SAAO;GAAE,GAAGK;GAASH;GAAW;GAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/runners/playwright.ts"],"names":[],"mappings":"AA0DA,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,IAAI,CAAC,CA2Ff"}
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/runners/playwright.ts"],"names":[],"mappings":"AAmEA,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,IAAI,CAAC,CAsFf"}