@codspeed/playwright-plugin 6.0.0-beta.2 → 6.0.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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.es5.js +1 -1
- package/dist/index.es5.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -13,7 +13,7 @@ function ensureIntegrationSetup() {
|
|
|
13
13
|
return;
|
|
14
14
|
integrationInitialized = true;
|
|
15
15
|
core.warnOnUnsupportedNodeVersion();
|
|
16
|
-
core.InstrumentHooks.setIntegration("node-custom", "6.0.0
|
|
16
|
+
core.InstrumentHooks.setIntegration("node-custom", "6.0.0");
|
|
17
17
|
core.InstrumentHooks.setEnvironment("nodejs", "version", process.versions.node);
|
|
18
18
|
core.InstrumentHooks.setEnvironment("nodejs", "v8", process.versions.v8);
|
|
19
19
|
core.InstrumentHooks.writeEnvironment(process.pid);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import {\n calculateQuantiles,\n getCallingFile,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n msToS,\n warnOnUnsupportedNodeVersion,\n writeWalltimeResults,\n type Benchmark,\n type BenchmarkStats,\n} from \"@codspeed/core\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { _electron as electron } from \"playwright\";\nimport type { ElectronApplication, Page } from \"playwright-core\";\n\ndeclare const __VERSION__: string;\n\nconst DEFAULT_ROUNDS = 3;\nconst DEFAULT_PROFILING_JS_FLAGS =\n \"--perf-prof --perf-prof-annotate-wasm --interpreted-frames-native-stack --no-turbo-inlining --no-sandbox\";\n\n/**\n * The fixtures passed to a benchmark function, mirroring Playwright's `test`\n * API. Currently exposes the target's main window as `page`.\n */\nexport interface BenchFixtures {\n page: Page;\n}\n\n/**\n * The function whose execution is measured. Everything that runs inside it is\n * included in the reported timing.\n */\nexport type BenchFunction = (fixtures: BenchFixtures) => void | Promise<void>;\n\nexport type BenchHook = (fixtures: BenchFixtures) => void | Promise<void>;\n\n/**\n * Electron-specific target options.\n */\nexport interface ElectronTarget {\n kind: \"electron\";\n /**\n * Absolute path to the Electron main entrypoint (e.g. `out/main/index.js`).\n */\n appPath: string;\n /**\n * CLI flags forwarded to Electron.\n */\n electronArgs?: string[];\n /**\n * Working directory for the Electron process. Defaults to `process.cwd()`.\n */\n cwd?: string;\n /**\n * Absolute path to the Electron executable. When omitted, it is resolved from\n * the `electron` package in `cwd`. Set this only to override that default.\n */\n electronExecutablePath?: string;\n}\n\n/**\n * Determines what kind of host playwright is going to run the tests on\n */\nexport type Target = ElectronTarget;\n\n/**\n * Minimal options for a benchmark. Inspired by Vitest's `bench`, but kept\n * deliberately small.\n */\nexport interface BenchOptions {\n /**\n * Target configuration. The `kind` field selects the target; the remaining\n * fields are specific to that kind.\n */\n target: Target;\n /**\n * Number of measurement rounds to perform. Defaults to 3, or the value of CODSPEED_PLAYWRIGHT_ROUNDS.\n */\n rounds?: number;\n /**\n * Runs before each round, after the target is ready. Use it to bring the app to\n * a ready state. Not measured.\n */\n beforeRound?: BenchHook;\n /**\n * Runs after each round, before the target is torn down. Not measured.\n */\n afterRound?: BenchHook;\n}\n\nlet integrationInitialized = false;\n\n/**\n * Register the integration and environment with the instrumentation. This is\n * process-global, so it only needs to run once regardless of how many\n * benchmarks are defined.\n */\nfunction ensureIntegrationSetup(): void {\n if (integrationInitialized) return;\n integrationInitialized = true;\n\n warnOnUnsupportedNodeVersion();\n\n InstrumentHooks.setIntegration(\"node-custom\", __VERSION__);\n InstrumentHooks.setEnvironment(\"nodejs\", \"version\", process.versions.node);\n InstrumentHooks.setEnvironment(\"nodejs\", \"v8\", process.versions.v8);\n InstrumentHooks.writeEnvironment(process.pid);\n}\n\nfunction resolveRounds(optionRounds: number | undefined): number {\n const envValue = process.env.CODSPEED_PLAYWRIGHT_ROUNDS;\n const raw = envValue ?? optionRounds;\n if (raw === undefined) return DEFAULT_ROUNDS;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(`Invalid rounds value: ${raw} (expected positive integer)`);\n }\n return n;\n}\n\n/**\n * Resolve the path to the Electron binary.\n *\n * Playwright resolves Electron via `require(\"electron/index.js\")` from inside\n * its own package directory. Under isolated installs (e.g. pnpm), Playwright\n * cannot see the project's `electron` dependency and bails out with\n * \"Electron executablePath not found!\". We resolve it ourselves from the\n * benchmark's working directory, where `electron` is a real dependency.\n */\nfunction resolveElectronExecutable(cwd: string): string {\n const require = createRequire(pathToFileURL(`${cwd}/`));\n // `electron`'s main module exports the absolute path to its binary.\n return require(\"electron\") as string;\n}\n\nasync function launchElectronApp(\n target: ElectronTarget,\n): Promise<ElectronApplication> {\n const cwd = target.cwd ?? process.cwd();\n return electron.launch({\n args: [\n target.appPath,\n ...(target.electronArgs ?? []),\n `--js-flags=${DEFAULT_PROFILING_JS_FLAGS}`,\n ],\n cwd,\n executablePath:\n target.electronExecutablePath ?? resolveElectronExecutable(cwd),\n });\n}\n\nasync function runOneSample(\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<bigint> {\n const app = await launchElectronApp(options.target);\n const page = await app.firstWindow();\n\n try {\n if (options.beforeRound) {\n await options.beforeRound({ page });\n }\n\n const startTs = InstrumentHooks.currentTimestamp();\n await fn({ page });\n const endTs = InstrumentHooks.currentTimestamp();\n\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n startTs,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, endTs);\n\n if (options.afterRound) {\n await options.afterRound({ page });\n }\n\n return endTs - startTs;\n } finally {\n await app.close();\n }\n}\n\nfunction buildStats(sampleTimesNs: bigint[]): BenchmarkStats {\n const sortedTimesNs = sampleTimesNs\n .map((n) => Number(n))\n .sort((a, b) => a - b);\n\n const sum = sortedTimesNs.reduce((acc, t) => acc + t, 0);\n const meanNs = sum / sortedTimesNs.length;\n const variance =\n sortedTimesNs.reduce((acc, t) => acc + (t - meanNs) ** 2, 0) /\n sortedTimesNs.length;\n const stdevNs = Math.sqrt(variance);\n\n const { q1_ns, median_ns, q3_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({\n meanNs,\n stdevNs,\n sortedTimesNs,\n });\n\n return {\n min_ns: sortedTimesNs[0],\n max_ns: sortedTimesNs[sortedTimesNs.length - 1],\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n rounds: sortedTimesNs.length,\n total_time: msToS(sum / 1e6),\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n iter_per_round: 1,\n warmup_iters: 0,\n };\n}\n\n/**\n * Define and run a CodSpeed-instrumented benchmark, mirroring Playwright's\n * `test` API.\n *\n * Launches the target once per round, runs the user-provided function around a\n * measured region, and writes walltime results to disk so that the CodSpeed\n * runner can pick them up.\n *\n * @example\n * ```ts\n * import { bench } from \"@codspeed/playwright-plugin\";\n *\n * bench(\n * \"renders the dashboard\",\n * async ({ page }) => {\n * await page.getByRole(\"link\", { name: \"Dashboard\" }).click();\n * await page.getByRole(\"heading\", { name: \"Overview\" }).waitFor();\n * },\n * {\n * target: { kind: \"electron\", appPath: \"out/main/index.js\" },\n * rounds: 5,\n * },\n * );\n * ```\n */\nexport async function bench(\n name: string,\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<void> {\n const rounds = resolveRounds(options.rounds);\n const uri = `${getCallingFile(1)}::${name}`;\n\n ensureIntegrationSetup();\n\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n InstrumentHooks.startBenchmark();\n\n const sampleTimesNs: bigint[] = [];\n try {\n for (let i = 0; i < rounds; i++) {\n const elapsedNs = await runOneSample(fn, options);\n sampleTimesNs.push(elapsedNs);\n console.log(\n `[CodSpeed] [round ${i + 1}/${rounds}] ${(Number(elapsedNs) / 1e6).toFixed(2)} ms`,\n );\n }\n } finally {\n InstrumentHooks.stopBenchmark();\n }\n\n const benchmark: Benchmark = {\n name,\n uri,\n config: {\n warmup_time_ns: null,\n min_round_time_ns: null,\n max_rounds: rounds,\n max_time_ns: null,\n },\n stats: buildStats(sampleTimesNs),\n };\n\n writeWalltimeResults([benchmark]);\n}\n\nexport type { Page } from \"playwright-core\";\n"],"names":["warnOnUnsupportedNodeVersion","InstrumentHooks","createRequire","pathToFileURL","electron","MARKER_TYPE_BENCHMARK_START","MARKER_TYPE_BENCHMARK_END","calculateQuantiles","msToS","getCallingFile","writeWalltimeResults"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import {\n calculateQuantiles,\n getCallingFile,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n msToS,\n warnOnUnsupportedNodeVersion,\n writeWalltimeResults,\n type Benchmark,\n type BenchmarkStats,\n} from \"@codspeed/core\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { _electron as electron } from \"playwright\";\nimport type { ElectronApplication, Page } from \"playwright-core\";\n\ndeclare const __VERSION__: string;\n\nconst DEFAULT_ROUNDS = 3;\nconst DEFAULT_PROFILING_JS_FLAGS =\n \"--perf-prof --perf-prof-annotate-wasm --interpreted-frames-native-stack --no-turbo-inlining --no-sandbox\";\n\n/**\n * The fixtures passed to a benchmark function, mirroring Playwright's `test`\n * API. Currently exposes the target's main window as `page`.\n */\nexport interface BenchFixtures {\n page: Page;\n}\n\n/**\n * The function whose execution is measured. Everything that runs inside it is\n * included in the reported timing.\n */\nexport type BenchFunction = (fixtures: BenchFixtures) => void | Promise<void>;\n\nexport type BenchHook = (fixtures: BenchFixtures) => void | Promise<void>;\n\n/**\n * Electron-specific target options.\n */\nexport interface ElectronTarget {\n kind: \"electron\";\n /**\n * Absolute path to the Electron main entrypoint (e.g. `out/main/index.js`).\n */\n appPath: string;\n /**\n * CLI flags forwarded to Electron.\n */\n electronArgs?: string[];\n /**\n * Working directory for the Electron process. Defaults to `process.cwd()`.\n */\n cwd?: string;\n /**\n * Absolute path to the Electron executable. When omitted, it is resolved from\n * the `electron` package in `cwd`. Set this only to override that default.\n */\n electronExecutablePath?: string;\n}\n\n/**\n * Determines what kind of host playwright is going to run the tests on\n */\nexport type Target = ElectronTarget;\n\n/**\n * Minimal options for a benchmark. Inspired by Vitest's `bench`, but kept\n * deliberately small.\n */\nexport interface BenchOptions {\n /**\n * Target configuration. The `kind` field selects the target; the remaining\n * fields are specific to that kind.\n */\n target: Target;\n /**\n * Number of measurement rounds to perform. Defaults to 3, or the value of CODSPEED_PLAYWRIGHT_ROUNDS.\n */\n rounds?: number;\n /**\n * Runs before each round, after the target is ready. Use it to bring the app to\n * a ready state. Not measured.\n */\n beforeRound?: BenchHook;\n /**\n * Runs after each round, before the target is torn down. Not measured.\n */\n afterRound?: BenchHook;\n}\n\nlet integrationInitialized = false;\n\n/**\n * Register the integration and environment with the instrumentation. This is\n * process-global, so it only needs to run once regardless of how many\n * benchmarks are defined.\n */\nfunction ensureIntegrationSetup(): void {\n if (integrationInitialized) return;\n integrationInitialized = true;\n\n warnOnUnsupportedNodeVersion();\n\n InstrumentHooks.setIntegration(\"node-custom\", __VERSION__);\n InstrumentHooks.setEnvironment(\"nodejs\", \"version\", process.versions.node);\n InstrumentHooks.setEnvironment(\"nodejs\", \"v8\", process.versions.v8);\n InstrumentHooks.writeEnvironment(process.pid);\n}\n\nfunction resolveRounds(optionRounds: number | undefined): number {\n const envValue = process.env.CODSPEED_PLAYWRIGHT_ROUNDS;\n const raw = envValue ?? optionRounds;\n if (raw === undefined) return DEFAULT_ROUNDS;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(`Invalid rounds value: ${raw} (expected positive integer)`);\n }\n return n;\n}\n\n/**\n * Resolve the path to the Electron binary.\n *\n * Playwright resolves Electron via `require(\"electron/index.js\")` from inside\n * its own package directory. Under isolated installs (e.g. pnpm), Playwright\n * cannot see the project's `electron` dependency and bails out with\n * \"Electron executablePath not found!\". We resolve it ourselves from the\n * benchmark's working directory, where `electron` is a real dependency.\n */\nfunction resolveElectronExecutable(cwd: string): string {\n const require = createRequire(pathToFileURL(`${cwd}/`));\n // `electron`'s main module exports the absolute path to its binary.\n return require(\"electron\") as string;\n}\n\nasync function launchElectronApp(\n target: ElectronTarget,\n): Promise<ElectronApplication> {\n const cwd = target.cwd ?? process.cwd();\n return electron.launch({\n args: [\n target.appPath,\n ...(target.electronArgs ?? []),\n `--js-flags=${DEFAULT_PROFILING_JS_FLAGS}`,\n ],\n cwd,\n executablePath:\n target.electronExecutablePath ?? resolveElectronExecutable(cwd),\n });\n}\n\nasync function runOneSample(\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<bigint> {\n const app = await launchElectronApp(options.target);\n const page = await app.firstWindow();\n\n try {\n if (options.beforeRound) {\n await options.beforeRound({ page });\n }\n\n const startTs = InstrumentHooks.currentTimestamp();\n await fn({ page });\n const endTs = InstrumentHooks.currentTimestamp();\n\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n startTs,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, endTs);\n\n if (options.afterRound) {\n await options.afterRound({ page });\n }\n\n return endTs - startTs;\n } finally {\n await app.close();\n }\n}\n\nfunction buildStats(sampleTimesNs: bigint[]): BenchmarkStats {\n const sortedTimesNs = sampleTimesNs\n .map((n) => Number(n))\n .sort((a, b) => a - b);\n\n const sum = sortedTimesNs.reduce((acc, t) => acc + t, 0);\n const meanNs = sum / sortedTimesNs.length;\n const variance =\n sortedTimesNs.reduce((acc, t) => acc + (t - meanNs) ** 2, 0) /\n sortedTimesNs.length;\n const stdevNs = Math.sqrt(variance);\n\n const { q1_ns, median_ns, q3_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({\n meanNs,\n stdevNs,\n sortedTimesNs,\n });\n\n return {\n min_ns: sortedTimesNs[0],\n max_ns: sortedTimesNs[sortedTimesNs.length - 1],\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n rounds: sortedTimesNs.length,\n total_time: msToS(sum / 1e6),\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n iter_per_round: 1,\n warmup_iters: 0,\n };\n}\n\n/**\n * Define and run a CodSpeed-instrumented benchmark, mirroring Playwright's\n * `test` API.\n *\n * Launches the target once per round, runs the user-provided function around a\n * measured region, and writes walltime results to disk so that the CodSpeed\n * runner can pick them up.\n *\n * @example\n * ```ts\n * import { bench } from \"@codspeed/playwright-plugin\";\n *\n * bench(\n * \"renders the dashboard\",\n * async ({ page }) => {\n * await page.getByRole(\"link\", { name: \"Dashboard\" }).click();\n * await page.getByRole(\"heading\", { name: \"Overview\" }).waitFor();\n * },\n * {\n * target: { kind: \"electron\", appPath: \"out/main/index.js\" },\n * rounds: 5,\n * },\n * );\n * ```\n */\nexport async function bench(\n name: string,\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<void> {\n const rounds = resolveRounds(options.rounds);\n const uri = `${getCallingFile(1)}::${name}`;\n\n ensureIntegrationSetup();\n\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n InstrumentHooks.startBenchmark();\n\n const sampleTimesNs: bigint[] = [];\n try {\n for (let i = 0; i < rounds; i++) {\n const elapsedNs = await runOneSample(fn, options);\n sampleTimesNs.push(elapsedNs);\n console.log(\n `[CodSpeed] [round ${i + 1}/${rounds}] ${(Number(elapsedNs) / 1e6).toFixed(2)} ms`,\n );\n }\n } finally {\n InstrumentHooks.stopBenchmark();\n }\n\n const benchmark: Benchmark = {\n name,\n uri,\n config: {\n warmup_time_ns: null,\n min_round_time_ns: null,\n max_rounds: rounds,\n max_time_ns: null,\n },\n stats: buildStats(sampleTimesNs),\n };\n\n writeWalltimeResults([benchmark]);\n}\n\nexport type { Page } from \"playwright-core\";\n"],"names":["warnOnUnsupportedNodeVersion","InstrumentHooks","createRequire","pathToFileURL","electron","MARKER_TYPE_BENCHMARK_START","MARKER_TYPE_BENCHMARK_END","calculateQuantiles","msToS","getCallingFile","writeWalltimeResults"],"mappings":"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"}
|
package/dist/index.es5.js
CHANGED
|
@@ -11,7 +11,7 @@ function ensureIntegrationSetup() {
|
|
|
11
11
|
return;
|
|
12
12
|
integrationInitialized = true;
|
|
13
13
|
warnOnUnsupportedNodeVersion();
|
|
14
|
-
InstrumentHooks.setIntegration("node-custom", "6.0.0
|
|
14
|
+
InstrumentHooks.setIntegration("node-custom", "6.0.0");
|
|
15
15
|
InstrumentHooks.setEnvironment("nodejs", "version", process.versions.node);
|
|
16
16
|
InstrumentHooks.setEnvironment("nodejs", "v8", process.versions.v8);
|
|
17
17
|
InstrumentHooks.writeEnvironment(process.pid);
|
package/dist/index.es5.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es5.js","sources":["../src/index.ts"],"sourcesContent":["import {\n calculateQuantiles,\n getCallingFile,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n msToS,\n warnOnUnsupportedNodeVersion,\n writeWalltimeResults,\n type Benchmark,\n type BenchmarkStats,\n} from \"@codspeed/core\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { _electron as electron } from \"playwright\";\nimport type { ElectronApplication, Page } from \"playwright-core\";\n\ndeclare const __VERSION__: string;\n\nconst DEFAULT_ROUNDS = 3;\nconst DEFAULT_PROFILING_JS_FLAGS =\n \"--perf-prof --perf-prof-annotate-wasm --interpreted-frames-native-stack --no-turbo-inlining --no-sandbox\";\n\n/**\n * The fixtures passed to a benchmark function, mirroring Playwright's `test`\n * API. Currently exposes the target's main window as `page`.\n */\nexport interface BenchFixtures {\n page: Page;\n}\n\n/**\n * The function whose execution is measured. Everything that runs inside it is\n * included in the reported timing.\n */\nexport type BenchFunction = (fixtures: BenchFixtures) => void | Promise<void>;\n\nexport type BenchHook = (fixtures: BenchFixtures) => void | Promise<void>;\n\n/**\n * Electron-specific target options.\n */\nexport interface ElectronTarget {\n kind: \"electron\";\n /**\n * Absolute path to the Electron main entrypoint (e.g. `out/main/index.js`).\n */\n appPath: string;\n /**\n * CLI flags forwarded to Electron.\n */\n electronArgs?: string[];\n /**\n * Working directory for the Electron process. Defaults to `process.cwd()`.\n */\n cwd?: string;\n /**\n * Absolute path to the Electron executable. When omitted, it is resolved from\n * the `electron` package in `cwd`. Set this only to override that default.\n */\n electronExecutablePath?: string;\n}\n\n/**\n * Determines what kind of host playwright is going to run the tests on\n */\nexport type Target = ElectronTarget;\n\n/**\n * Minimal options for a benchmark. Inspired by Vitest's `bench`, but kept\n * deliberately small.\n */\nexport interface BenchOptions {\n /**\n * Target configuration. The `kind` field selects the target; the remaining\n * fields are specific to that kind.\n */\n target: Target;\n /**\n * Number of measurement rounds to perform. Defaults to 3, or the value of CODSPEED_PLAYWRIGHT_ROUNDS.\n */\n rounds?: number;\n /**\n * Runs before each round, after the target is ready. Use it to bring the app to\n * a ready state. Not measured.\n */\n beforeRound?: BenchHook;\n /**\n * Runs after each round, before the target is torn down. Not measured.\n */\n afterRound?: BenchHook;\n}\n\nlet integrationInitialized = false;\n\n/**\n * Register the integration and environment with the instrumentation. This is\n * process-global, so it only needs to run once regardless of how many\n * benchmarks are defined.\n */\nfunction ensureIntegrationSetup(): void {\n if (integrationInitialized) return;\n integrationInitialized = true;\n\n warnOnUnsupportedNodeVersion();\n\n InstrumentHooks.setIntegration(\"node-custom\", __VERSION__);\n InstrumentHooks.setEnvironment(\"nodejs\", \"version\", process.versions.node);\n InstrumentHooks.setEnvironment(\"nodejs\", \"v8\", process.versions.v8);\n InstrumentHooks.writeEnvironment(process.pid);\n}\n\nfunction resolveRounds(optionRounds: number | undefined): number {\n const envValue = process.env.CODSPEED_PLAYWRIGHT_ROUNDS;\n const raw = envValue ?? optionRounds;\n if (raw === undefined) return DEFAULT_ROUNDS;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(`Invalid rounds value: ${raw} (expected positive integer)`);\n }\n return n;\n}\n\n/**\n * Resolve the path to the Electron binary.\n *\n * Playwright resolves Electron via `require(\"electron/index.js\")` from inside\n * its own package directory. Under isolated installs (e.g. pnpm), Playwright\n * cannot see the project's `electron` dependency and bails out with\n * \"Electron executablePath not found!\". We resolve it ourselves from the\n * benchmark's working directory, where `electron` is a real dependency.\n */\nfunction resolveElectronExecutable(cwd: string): string {\n const require = createRequire(pathToFileURL(`${cwd}/`));\n // `electron`'s main module exports the absolute path to its binary.\n return require(\"electron\") as string;\n}\n\nasync function launchElectronApp(\n target: ElectronTarget,\n): Promise<ElectronApplication> {\n const cwd = target.cwd ?? process.cwd();\n return electron.launch({\n args: [\n target.appPath,\n ...(target.electronArgs ?? []),\n `--js-flags=${DEFAULT_PROFILING_JS_FLAGS}`,\n ],\n cwd,\n executablePath:\n target.electronExecutablePath ?? resolveElectronExecutable(cwd),\n });\n}\n\nasync function runOneSample(\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<bigint> {\n const app = await launchElectronApp(options.target);\n const page = await app.firstWindow();\n\n try {\n if (options.beforeRound) {\n await options.beforeRound({ page });\n }\n\n const startTs = InstrumentHooks.currentTimestamp();\n await fn({ page });\n const endTs = InstrumentHooks.currentTimestamp();\n\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n startTs,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, endTs);\n\n if (options.afterRound) {\n await options.afterRound({ page });\n }\n\n return endTs - startTs;\n } finally {\n await app.close();\n }\n}\n\nfunction buildStats(sampleTimesNs: bigint[]): BenchmarkStats {\n const sortedTimesNs = sampleTimesNs\n .map((n) => Number(n))\n .sort((a, b) => a - b);\n\n const sum = sortedTimesNs.reduce((acc, t) => acc + t, 0);\n const meanNs = sum / sortedTimesNs.length;\n const variance =\n sortedTimesNs.reduce((acc, t) => acc + (t - meanNs) ** 2, 0) /\n sortedTimesNs.length;\n const stdevNs = Math.sqrt(variance);\n\n const { q1_ns, median_ns, q3_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({\n meanNs,\n stdevNs,\n sortedTimesNs,\n });\n\n return {\n min_ns: sortedTimesNs[0],\n max_ns: sortedTimesNs[sortedTimesNs.length - 1],\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n rounds: sortedTimesNs.length,\n total_time: msToS(sum / 1e6),\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n iter_per_round: 1,\n warmup_iters: 0,\n };\n}\n\n/**\n * Define and run a CodSpeed-instrumented benchmark, mirroring Playwright's\n * `test` API.\n *\n * Launches the target once per round, runs the user-provided function around a\n * measured region, and writes walltime results to disk so that the CodSpeed\n * runner can pick them up.\n *\n * @example\n * ```ts\n * import { bench } from \"@codspeed/playwright-plugin\";\n *\n * bench(\n * \"renders the dashboard\",\n * async ({ page }) => {\n * await page.getByRole(\"link\", { name: \"Dashboard\" }).click();\n * await page.getByRole(\"heading\", { name: \"Overview\" }).waitFor();\n * },\n * {\n * target: { kind: \"electron\", appPath: \"out/main/index.js\" },\n * rounds: 5,\n * },\n * );\n * ```\n */\nexport async function bench(\n name: string,\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<void> {\n const rounds = resolveRounds(options.rounds);\n const uri = `${getCallingFile(1)}::${name}`;\n\n ensureIntegrationSetup();\n\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n InstrumentHooks.startBenchmark();\n\n const sampleTimesNs: bigint[] = [];\n try {\n for (let i = 0; i < rounds; i++) {\n const elapsedNs = await runOneSample(fn, options);\n sampleTimesNs.push(elapsedNs);\n console.log(\n `[CodSpeed] [round ${i + 1}/${rounds}] ${(Number(elapsedNs) / 1e6).toFixed(2)} ms`,\n );\n }\n } finally {\n InstrumentHooks.stopBenchmark();\n }\n\n const benchmark: Benchmark = {\n name,\n uri,\n config: {\n warmup_time_ns: null,\n min_round_time_ns: null,\n max_rounds: rounds,\n max_time_ns: null,\n },\n stats: buildStats(sampleTimesNs),\n };\n\n writeWalltimeResults([benchmark]);\n}\n\nexport type { Page } from \"playwright-core\";\n"],"names":["electron"],"mappings":";;;;;AAmBA,MAAM,cAAA,GAAiB,CAAA;AACvB,MAAM,0BAAA,GACJ,0GAAA;AAwEF,IAAI,sBAAA,GAAyB,KAAA;AAO7B,SAAS,sBAAA,GAA+B;AACtC,EAAA,IAAI,sBAAA;AAAwB,IAAA;AAC5B,EAAA,sBAAA,GAAyB,IAAA;AAEzB,EAAA,4BAAA,EAA6B;AAE7B,EAAA,eAAA,CAAgB,cAAA,CAAe,eAAe,cAAW,CAAA;AACzD,EAAA,eAAA,CAAgB,cAAA,CAAe,QAAA,EAAU,SAAA,EAAW,OAAA,CAAQ,SAAS,IAAI,CAAA;AACzE,EAAA,eAAA,CAAgB,cAAA,CAAe,QAAA,EAAU,IAAA,EAAM,OAAA,CAAQ,SAAS,EAAE,CAAA;AAClE,EAAA,eAAA,CAAgB,gBAAA,CAAiB,QAAQ,GAAG,CAAA;AAC9C;AAEA,SAAS,cAAc,YAAA,EAA0C;AAC/D,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,0BAAA;AAC7B,EAAA,MAAM,MAAM,QAAA,IAAY,YAAA;AACxB,EAAA,IAAI,GAAA,KAAQ,MAAA;AAAW,IAAA,OAAO,cAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,GAAA,CAAA,4BAAA,CAAiC,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,CAAA;AACT;AAWA,SAAS,0BAA0B,GAAA,EAAqB;AACtD,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,aAAA,CAAc,CAAA,EAAG,MAAM,CAAC,CAAA;AAEtD,EAAA,OAAO,QAAQ,UAAU,CAAA;AAC3B;AAEA,eAAe,kBACb,MAAA,EAC8B;AAC9B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACtC,EAAA,OAAOA,UAAS,MAAA,CAAO;AAAA,IACrB,IAAA,EAAM;AAAA,MACJ,MAAA,CAAO,OAAA;AAAA,MACP,GAAI,MAAA,CAAO,YAAA,IAAgB,EAAC;AAAA,MAC5B,CAAA,WAAA,EAAc,0BAAA,CAAA;AAAA,KAChB;AAAA,IACA,GAAA;AAAA,IACA,cAAA,EACE,MAAA,CAAO,sBAAA,IAA0B,yBAAA,CAA0B,GAAG;AAAA,GACjE,CAAA;AACH;AAEA,eAAe,YAAA,CACb,IACA,OAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,CAAkB,OAAA,CAAQ,MAAM,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,EAAY;AAEnC,EAAA,IAAI;AACF,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAM,OAAA,CAAQ,WAAA,CAAY,EAAE,IAAA,EAAM,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,OAAA,GAAU,gBAAgB,gBAAA,EAAiB;AACjD,IAAA,MAAM,EAAA,CAAG,EAAE,IAAA,EAAM,CAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,gBAAgB,gBAAA,EAAiB;AAE/C,IAAA,eAAA,CAAgB,SAAA;AAAA,MACd,OAAA,CAAQ,GAAA;AAAA,MACR,2BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,eAAA,CAAgB,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,yBAAA,EAA2B,KAAK,CAAA;AAEvE,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,EAAE,IAAA,EAAM,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,KAAA,GAAQ,OAAA;AAAA,EACjB,CAAA,SAAE;AACA,IAAA,MAAM,IAAI,KAAA,EAAM;AAAA,EAClB;AACF;AAEA,SAAS,WAAW,aAAA,EAAyC;AAC3D,EAAA,MAAM,aAAA,GAAgB,aAAA,CACnB,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CACpB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAEvB,EAAA,MAAM,GAAA,GAAM,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,MAAA;AACnC,EAAA,MAAM,QAAA,GACJ,aAAA,CAAc,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAA,CAAO,CAAA,GAAI,MAAA,KAAW,CAAA,EAAG,CAAC,CAAA,GAC3D,aAAA,CAAc,MAAA;AAChB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAElC,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,OAAO,kBAAA,EAAoB,oBAAA,KACnD,kBAAA,CAAmB;AAAA,IACjB,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,cAAc,CAAC,CAAA;AAAA,IACvB,MAAA,EAAQ,aAAA,CAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA;AAAA,IAC9C,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAQ,aAAA,CAAc,MAAA;AAAA,IACtB,UAAA,EAAY,KAAA,CAAM,GAAA,GAAM,GAAG,CAAA;AAAA,IAC3B,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,cAAA,EAAgB,CAAA;AAAA,IAChB,YAAA,EAAc;AAAA,GAChB;AACF;AA2BA,eAAsB,KAAA,CACpB,IAAA,EACA,EAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,cAAA,CAAe,CAAC,CAAA,CAAA,EAAA,EAAM,IAAA,CAAA,CAAA;AAErC,EAAA,sBAAA,EAAuB;AAEvB,EAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AACrD,EAAA,eAAA,CAAgB,cAAA,EAAe;AAE/B,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,IAAI;AACF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AAChD,MAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAC5B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAA,CAAA,EAAK,MAAA,CAAA,EAAA,EAAA,CAAY,OAAO,SAAS,CAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,GAAA;AAAA,OAC9E;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,eAAA,CAAgB,aAAA,EAAc;AAAA,EAChC;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,IAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,cAAA,EAAgB,IAAA;AAAA,MAChB,iBAAA,EAAmB,IAAA;AAAA,MACnB,UAAA,EAAY,MAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,IACA,KAAA,EAAO,WAAW,aAAa;AAAA,GACjC;AAEA,EAAA,oBAAA,CAAqB,CAAC,SAAS,CAAC,CAAA;AAClC;;;;"}
|
|
1
|
+
{"version":3,"file":"index.es5.js","sources":["../src/index.ts"],"sourcesContent":["import {\n calculateQuantiles,\n getCallingFile,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n msToS,\n warnOnUnsupportedNodeVersion,\n writeWalltimeResults,\n type Benchmark,\n type BenchmarkStats,\n} from \"@codspeed/core\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { _electron as electron } from \"playwright\";\nimport type { ElectronApplication, Page } from \"playwright-core\";\n\ndeclare const __VERSION__: string;\n\nconst DEFAULT_ROUNDS = 3;\nconst DEFAULT_PROFILING_JS_FLAGS =\n \"--perf-prof --perf-prof-annotate-wasm --interpreted-frames-native-stack --no-turbo-inlining --no-sandbox\";\n\n/**\n * The fixtures passed to a benchmark function, mirroring Playwright's `test`\n * API. Currently exposes the target's main window as `page`.\n */\nexport interface BenchFixtures {\n page: Page;\n}\n\n/**\n * The function whose execution is measured. Everything that runs inside it is\n * included in the reported timing.\n */\nexport type BenchFunction = (fixtures: BenchFixtures) => void | Promise<void>;\n\nexport type BenchHook = (fixtures: BenchFixtures) => void | Promise<void>;\n\n/**\n * Electron-specific target options.\n */\nexport interface ElectronTarget {\n kind: \"electron\";\n /**\n * Absolute path to the Electron main entrypoint (e.g. `out/main/index.js`).\n */\n appPath: string;\n /**\n * CLI flags forwarded to Electron.\n */\n electronArgs?: string[];\n /**\n * Working directory for the Electron process. Defaults to `process.cwd()`.\n */\n cwd?: string;\n /**\n * Absolute path to the Electron executable. When omitted, it is resolved from\n * the `electron` package in `cwd`. Set this only to override that default.\n */\n electronExecutablePath?: string;\n}\n\n/**\n * Determines what kind of host playwright is going to run the tests on\n */\nexport type Target = ElectronTarget;\n\n/**\n * Minimal options for a benchmark. Inspired by Vitest's `bench`, but kept\n * deliberately small.\n */\nexport interface BenchOptions {\n /**\n * Target configuration. The `kind` field selects the target; the remaining\n * fields are specific to that kind.\n */\n target: Target;\n /**\n * Number of measurement rounds to perform. Defaults to 3, or the value of CODSPEED_PLAYWRIGHT_ROUNDS.\n */\n rounds?: number;\n /**\n * Runs before each round, after the target is ready. Use it to bring the app to\n * a ready state. Not measured.\n */\n beforeRound?: BenchHook;\n /**\n * Runs after each round, before the target is torn down. Not measured.\n */\n afterRound?: BenchHook;\n}\n\nlet integrationInitialized = false;\n\n/**\n * Register the integration and environment with the instrumentation. This is\n * process-global, so it only needs to run once regardless of how many\n * benchmarks are defined.\n */\nfunction ensureIntegrationSetup(): void {\n if (integrationInitialized) return;\n integrationInitialized = true;\n\n warnOnUnsupportedNodeVersion();\n\n InstrumentHooks.setIntegration(\"node-custom\", __VERSION__);\n InstrumentHooks.setEnvironment(\"nodejs\", \"version\", process.versions.node);\n InstrumentHooks.setEnvironment(\"nodejs\", \"v8\", process.versions.v8);\n InstrumentHooks.writeEnvironment(process.pid);\n}\n\nfunction resolveRounds(optionRounds: number | undefined): number {\n const envValue = process.env.CODSPEED_PLAYWRIGHT_ROUNDS;\n const raw = envValue ?? optionRounds;\n if (raw === undefined) return DEFAULT_ROUNDS;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1) {\n throw new Error(`Invalid rounds value: ${raw} (expected positive integer)`);\n }\n return n;\n}\n\n/**\n * Resolve the path to the Electron binary.\n *\n * Playwright resolves Electron via `require(\"electron/index.js\")` from inside\n * its own package directory. Under isolated installs (e.g. pnpm), Playwright\n * cannot see the project's `electron` dependency and bails out with\n * \"Electron executablePath not found!\". We resolve it ourselves from the\n * benchmark's working directory, where `electron` is a real dependency.\n */\nfunction resolveElectronExecutable(cwd: string): string {\n const require = createRequire(pathToFileURL(`${cwd}/`));\n // `electron`'s main module exports the absolute path to its binary.\n return require(\"electron\") as string;\n}\n\nasync function launchElectronApp(\n target: ElectronTarget,\n): Promise<ElectronApplication> {\n const cwd = target.cwd ?? process.cwd();\n return electron.launch({\n args: [\n target.appPath,\n ...(target.electronArgs ?? []),\n `--js-flags=${DEFAULT_PROFILING_JS_FLAGS}`,\n ],\n cwd,\n executablePath:\n target.electronExecutablePath ?? resolveElectronExecutable(cwd),\n });\n}\n\nasync function runOneSample(\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<bigint> {\n const app = await launchElectronApp(options.target);\n const page = await app.firstWindow();\n\n try {\n if (options.beforeRound) {\n await options.beforeRound({ page });\n }\n\n const startTs = InstrumentHooks.currentTimestamp();\n await fn({ page });\n const endTs = InstrumentHooks.currentTimestamp();\n\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n startTs,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, endTs);\n\n if (options.afterRound) {\n await options.afterRound({ page });\n }\n\n return endTs - startTs;\n } finally {\n await app.close();\n }\n}\n\nfunction buildStats(sampleTimesNs: bigint[]): BenchmarkStats {\n const sortedTimesNs = sampleTimesNs\n .map((n) => Number(n))\n .sort((a, b) => a - b);\n\n const sum = sortedTimesNs.reduce((acc, t) => acc + t, 0);\n const meanNs = sum / sortedTimesNs.length;\n const variance =\n sortedTimesNs.reduce((acc, t) => acc + (t - meanNs) ** 2, 0) /\n sortedTimesNs.length;\n const stdevNs = Math.sqrt(variance);\n\n const { q1_ns, median_ns, q3_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({\n meanNs,\n stdevNs,\n sortedTimesNs,\n });\n\n return {\n min_ns: sortedTimesNs[0],\n max_ns: sortedTimesNs[sortedTimesNs.length - 1],\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n rounds: sortedTimesNs.length,\n total_time: msToS(sum / 1e6),\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n iter_per_round: 1,\n warmup_iters: 0,\n };\n}\n\n/**\n * Define and run a CodSpeed-instrumented benchmark, mirroring Playwright's\n * `test` API.\n *\n * Launches the target once per round, runs the user-provided function around a\n * measured region, and writes walltime results to disk so that the CodSpeed\n * runner can pick them up.\n *\n * @example\n * ```ts\n * import { bench } from \"@codspeed/playwright-plugin\";\n *\n * bench(\n * \"renders the dashboard\",\n * async ({ page }) => {\n * await page.getByRole(\"link\", { name: \"Dashboard\" }).click();\n * await page.getByRole(\"heading\", { name: \"Overview\" }).waitFor();\n * },\n * {\n * target: { kind: \"electron\", appPath: \"out/main/index.js\" },\n * rounds: 5,\n * },\n * );\n * ```\n */\nexport async function bench(\n name: string,\n fn: BenchFunction,\n options: BenchOptions,\n): Promise<void> {\n const rounds = resolveRounds(options.rounds);\n const uri = `${getCallingFile(1)}::${name}`;\n\n ensureIntegrationSetup();\n\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n InstrumentHooks.startBenchmark();\n\n const sampleTimesNs: bigint[] = [];\n try {\n for (let i = 0; i < rounds; i++) {\n const elapsedNs = await runOneSample(fn, options);\n sampleTimesNs.push(elapsedNs);\n console.log(\n `[CodSpeed] [round ${i + 1}/${rounds}] ${(Number(elapsedNs) / 1e6).toFixed(2)} ms`,\n );\n }\n } finally {\n InstrumentHooks.stopBenchmark();\n }\n\n const benchmark: Benchmark = {\n name,\n uri,\n config: {\n warmup_time_ns: null,\n min_round_time_ns: null,\n max_rounds: rounds,\n max_time_ns: null,\n },\n stats: buildStats(sampleTimesNs),\n };\n\n writeWalltimeResults([benchmark]);\n}\n\nexport type { Page } from \"playwright-core\";\n"],"names":["electron"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codspeed/playwright-plugin",
|
|
3
|
-
"version": "6.0.0
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "Playwright benchmarking integration for CodSpeed",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"codspeed",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"vitest": "^3.2.4"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@codspeed/core": "^6.0.0
|
|
34
|
+
"@codspeed/core": "^6.0.0"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"playwright": ">=1.40.0"
|