@tracelane/cli 0.1.0-alpha.11 → 0.1.0-alpha.12
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/README.md +27 -15
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +167 -48
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/detect.d.ts +11 -9
- package/dist/lib/detect.d.ts.map +1 -1
- package/dist/lib/detect.js +16 -14
- package/dist/lib/detect.js.map +1 -1
- package/dist/lib/playwright-editor.d.ts +108 -0
- package/dist/lib/playwright-editor.d.ts.map +1 -0
- package/dist/lib/playwright-editor.js +417 -0
- package/dist/lib/playwright-editor.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# @tracelane/cli
|
|
4
4
|
|
|
5
|
-
> The reporter for your WebdriverIO tests —
|
|
5
|
+
> The reporter for your WebdriverIO and Playwright tests — Cypress on the roadmap. Self-contained HTML for every run — replay failures, audit successes, attach to any bug tracker. No SaaS, no dashboard, no signup.
|
|
6
6
|
|
|
7
|
-
One command to wire tracelane into your WebdriverIO project. Detects your runner + package manager, installs `@tracelane/wdio
|
|
7
|
+
One command to wire tracelane into your WebdriverIO or Playwright project. Detects your runner + package manager, installs the right adapter (`@tracelane/wdio` / `@tracelane/playwright`), edits the runner config in place, creates `tracelane-reports/`, ignores it in git. Idempotent and dry-runnable.
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@tracelane/cli)
|
|
10
10
|
[](https://www.npmjs.com/package/@tracelane/cli)
|
|
@@ -23,14 +23,25 @@ npx @tracelane/cli init
|
|
|
23
23
|
|
|
24
24
|
That's it. `npx @tracelane/cli init` does four things:
|
|
25
25
|
|
|
26
|
-
1. Detects WebdriverIO from `wdio.conf.{ts,js,mjs,cjs}` and your package manager from your lockfile.
|
|
27
|
-
2. Runs the package manager's dev-add for `@tracelane/wdio` (`pnpm add -D` / `yarn add -D` / `npm install --save-dev` / `bun add -d`).
|
|
28
|
-
3. Edits
|
|
26
|
+
1. Detects your runner — WebdriverIO from `wdio.conf.{ts,js,mjs,cjs}` or Playwright from `playwright.config.{ts,js,mjs,cjs}` — and your package manager from your lockfile.
|
|
27
|
+
2. Runs the package manager's dev-add for the matching adapter — `@tracelane/wdio` or `@tracelane/playwright` (`pnpm add -D` / `yarn add -D` / `npm install --save-dev` / `bun add -d`).
|
|
28
|
+
3. Edits the runner config in place:
|
|
29
|
+
- **WebdriverIO** — adds the `TraceLaneService` import and inserts the service tuple into the `services:` array.
|
|
30
|
+
- **Playwright** — registers the `['@tracelane/playwright', { mode: 'failed' }]` entry in the `reporter` array.
|
|
29
31
|
4. Creates `./tracelane-reports/` and appends `tracelane-reports/` to `.gitignore`.
|
|
30
32
|
|
|
31
|
-
Run your tests. On a failing
|
|
33
|
+
Run your tests. On a failing test you get a self-contained `./tracelane-reports/…html` — open it in any browser, replay the run with [rrweb](https://www.rrweb.io), inspect console + failed-network panels, attach to any bug tracker.
|
|
32
34
|
|
|
33
|
-
|
|
35
|
+
> **Playwright one-time follow-up.** The Playwright recording is driven by tracelane's test **fixture**, and the CLI can't safely rewrite every spec file. After `init`, change your spec imports yourself (recording is then automatic — nothing per-test):
|
|
36
|
+
>
|
|
37
|
+
> ```diff
|
|
38
|
+
> - import { test, expect } from '@playwright/test';
|
|
39
|
+
> + import { test, expect } from '@tracelane/playwright/fixture';
|
|
40
|
+
> ```
|
|
41
|
+
>
|
|
42
|
+
> `init` prints this reminder when it finishes.
|
|
43
|
+
|
|
44
|
+
See the [@tracelane/wdio README](https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-wdio) and the [@tracelane/playwright README](https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-playwright) for the full options reference.
|
|
34
45
|
|
|
35
46
|
## Usage
|
|
36
47
|
|
|
@@ -43,7 +54,7 @@ Options:
|
|
|
43
54
|
--dry-run Print what would happen; change nothing.
|
|
44
55
|
--yes, -y Skip the "about to do X, Y, Z - continue?" prompt.
|
|
45
56
|
--skip-install Don't run the package-manager install command.
|
|
46
|
-
Useful if you have
|
|
57
|
+
Useful if you already have the adapter installed.
|
|
47
58
|
--help, -h Show usage.
|
|
48
59
|
```
|
|
49
60
|
|
|
@@ -51,20 +62,21 @@ Options:
|
|
|
51
62
|
|
|
52
63
|
## What this is NOT
|
|
53
64
|
|
|
54
|
-
- Not a test runner. tracelane wires itself **into** WebdriverIO; you keep using `npx wdio run wdio.conf.ts`
|
|
65
|
+
- Not a test runner. tracelane wires itself **into** WebdriverIO / Playwright; you keep using `npx wdio run wdio.conf.ts` or `npx playwright test`.
|
|
55
66
|
- Not a SaaS or cloud uploader. The artifact is a single HTML file on your filesystem.
|
|
56
67
|
- Not coupled to the GitHub repo. The CLI only reads + writes files in the directory you ran it from.
|
|
57
68
|
|
|
58
|
-
##
|
|
69
|
+
## Cypress
|
|
70
|
+
|
|
71
|
+
Cypress detection works, but the CLI exits 0 with a "not yet supported" message — the `@tracelane/cypress` adapter hasn't been published. When it is, a future bump to `@tracelane/cli` will add the wiring. Progress is [tracked on the issues board](https://github.com/Cubenest/rrweb-stack/issues).
|
|
59
72
|
|
|
60
|
-
|
|
73
|
+
If you have a `wdio.conf.*` and a `playwright.config.*` (and/or a `cypress.config.*`) side by side, detection picks the most-mature match in priority order WDIO > Playwright > Cypress — pass `--runner playwright` (etc.) to override.
|
|
61
74
|
|
|
62
|
-
|
|
63
|
-
- Cypress — target Q4 2026
|
|
75
|
+
## How the config edit works (and what to do if it fails)
|
|
64
76
|
|
|
65
|
-
|
|
77
|
+
For **Playwright**, the editor registers `['@tracelane/playwright', { mode: 'failed' }]` in the `reporter` array of your `playwright.config.*` — creating the array if there isn't one, appending if there is, idempotent on re-run. It does **not** touch your spec files: the second half of the Playwright wiring (swapping the test import to `@tracelane/playwright/fixture`) is a one-time manual step `init` reminds you to do.
|
|
66
78
|
|
|
67
|
-
|
|
79
|
+
For **WebdriverIO**, the editor uses string-based regex to:
|
|
68
80
|
|
|
69
81
|
The editor uses string-based regex to:
|
|
70
82
|
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ export interface InitOptions {
|
|
|
35
35
|
*/
|
|
36
36
|
export declare function runInitProgrammatic(opts: InitOptions): Promise<number>;
|
|
37
37
|
/** Help text for `tracelane init --help`. */
|
|
38
|
-
export declare const INIT_HELP = "tracelane init - wire
|
|
38
|
+
export declare const INIT_HELP = "tracelane init - wire tracelane into the test project in this directory.\n\nUsage: npx @tracelane/cli init [options] (one-off; recommended)\n tracelane init [options] (after 'npm i -D @tracelane/cli')\n\nOptions:\n --runner <name> Force runner choice (wdio|playwright|cypress).\n Default: auto-detected from project files.\n --dry-run Print what would happen; change nothing.\n --yes, -y Skip the \"about to do X, Y, Z - continue?\" prompt.\n --skip-install Don't run the package-manager install command.\n Useful if you already have the adapter installed.\n --help, -h Show this help.\n\nThe CLI scans the current working directory for a runner config:\n\n WebdriverIO wdio.conf.{ts,js,mjs,cjs} adds @tracelane/wdio,\n inserts the service tuple\n Playwright playwright.config.{ts,js,mjs,cjs} adds @tracelane/playwright,\n registers the reporter\n Cypress cypress.config.* detected, not yet supported\n\nIt adds the adapter as a devDependency via the detected package manager\n(pnpm/yarn/npm/bun), edits the config, creates ./tracelane-reports/, and\nappends to .gitignore. Idempotent: re-running on an already-wired project is a\nno-op.\n\nPlaywright also needs a one-time manual step the CLI can't do for you: change\nyour spec imports to tracelane's fixture --\n import { test, expect } from '@tracelane/playwright/fixture';\ninit prints this reminder after it finishes.\n\nAuto-edit limitation: the editors use string regex to insert into the\nservices / reporter array. If they can't recognise the shape they BACK OUT\ncleanly and print the snippet to paste manually - they NEVER corrupt your config.\n";
|
|
39
39
|
/**
|
|
40
40
|
* Argv entry for `tracelane init`. Parses flags via node:util.parseArgs and
|
|
41
41
|
* delegates to runInitProgrammatic.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAC;AAWtE,OAAO,EAGL,KAAK,MAAM,EAKZ,MAAM,kBAAkB,CAAC;AAmB1B,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KACzE,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAK9B,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;CAC9B;AAoFD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyO5E;AAgJD,6CAA6C;AAC7C,eAAO,MAAM,SAAS,k0DAmCrB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDtE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -6,8 +6,12 @@
|
|
|
6
6
|
// 2. Detect package manager from lockfile presence.
|
|
7
7
|
// 3. For WDIO: ask, then install @tracelane/wdio + edit conf + mkdir
|
|
8
8
|
// ./tracelane-reports/ + append to .gitignore.
|
|
9
|
-
// 4. For Playwright
|
|
10
|
-
//
|
|
9
|
+
// 4. For Playwright: ask, then install @tracelane/playwright + register the
|
|
10
|
+
// reporter in playwright.config + mkdir ./tracelane-reports/ + append to
|
|
11
|
+
// .gitignore + print the fixture-import follow-up the user must apply by
|
|
12
|
+
// hand (the CLI can't safely rewrite every spec file).
|
|
13
|
+
// 5. For Cypress: print "not yet supported" + a tracking issue link, install
|
|
14
|
+
// nothing, exit 0 (the @tracelane/cypress adapter isn't published yet).
|
|
11
15
|
//
|
|
12
16
|
// Side effects (mkdirSync, writeFileSync, the package-manager spawn) are
|
|
13
17
|
// gated behind --dry-run and an interactive confirm prompt (suppressed by
|
|
@@ -19,8 +23,14 @@ import { join } from 'node:path';
|
|
|
19
23
|
import { parseArgs } from 'node:util';
|
|
20
24
|
import { detectPackageManager, detectRunner, findRunnerConfig, installCommand, } from '../lib/detect.js';
|
|
21
25
|
import { hasTracelaneEntry, mergeGitignore } from '../lib/gitignore.js';
|
|
26
|
+
import { FIXTURE_IMPORT_FOLLOWUP, MANUAL_SNIPPET as PLAYWRIGHT_MANUAL_SNIPPET, applyPlaywrightEdit, } from '../lib/playwright-editor.js';
|
|
22
27
|
import { confirm } from '../lib/prompt.js';
|
|
23
28
|
import { MANUAL_SNIPPET, applyWdioEdit } from '../lib/wdio-editor.js';
|
|
29
|
+
/** The npm package that provides each runner's tracelane adapter. */
|
|
30
|
+
const RUNNER_PACKAGE = {
|
|
31
|
+
wdio: '@tracelane/wdio',
|
|
32
|
+
playwright: '@tracelane/playwright',
|
|
33
|
+
};
|
|
24
34
|
/** Issues board for tracking the not-yet-shipped Playwright/Cypress paths. */
|
|
25
35
|
const ISSUES_BOARD = 'https://github.com/Cubenest/rrweb-stack/issues';
|
|
26
36
|
const realSpawn = (program, args, options) => spawnSync(program, args, options);
|
|
@@ -42,12 +52,14 @@ function describeSteps(detected, pm, options) {
|
|
|
42
52
|
if (!options.skipInstall) {
|
|
43
53
|
steps.push({
|
|
44
54
|
index: i++,
|
|
45
|
-
description: commandString(installCommand(pm.manager)),
|
|
55
|
+
description: commandString(installCommand(pm.manager, options.pkg)),
|
|
46
56
|
});
|
|
47
57
|
}
|
|
48
58
|
steps.push({
|
|
49
59
|
index: i++,
|
|
50
|
-
description:
|
|
60
|
+
description: detected.runner === 'playwright'
|
|
61
|
+
? `Edit ${basename(detected.configPath)} to register the tracelane reporter`
|
|
62
|
+
: `Edit ${basename(detected.configPath)} to register the Service`,
|
|
51
63
|
});
|
|
52
64
|
steps.push({ index: i++, description: 'Create ./tracelane-reports/' });
|
|
53
65
|
steps.push({
|
|
@@ -63,20 +75,20 @@ function basename(p) {
|
|
|
63
75
|
return p.split(/[/\\]/).pop() ?? p;
|
|
64
76
|
}
|
|
65
77
|
/**
|
|
66
|
-
* Print the not-yet-supported message for
|
|
67
|
-
*
|
|
78
|
+
* Print the not-yet-supported message for Cypress. Exits 0 (no error — the
|
|
79
|
+
* user has a valid project, the @tracelane/cypress adapter just isn't published
|
|
80
|
+
* yet, so there's nothing to wire).
|
|
68
81
|
*/
|
|
69
|
-
function
|
|
70
|
-
const runnerLabel = detected.runner === 'playwright' ? 'Playwright' : 'Cypress';
|
|
71
|
-
const target = detected.runner === 'playwright' ? 'Q3 2026' : 'Q4 2026';
|
|
82
|
+
function printCypressUnsupported(detected, stdout) {
|
|
72
83
|
write(stdout, [
|
|
73
|
-
`tracelane init - detected
|
|
84
|
+
`tracelane init - detected Cypress project (${basename(detected.configPath)}).`,
|
|
74
85
|
'',
|
|
75
|
-
|
|
86
|
+
'Cypress is not yet supported: the @tracelane/cypress adapter has not been',
|
|
87
|
+
'published. WebdriverIO and Playwright are wired today.',
|
|
76
88
|
`Track progress: ${ISSUES_BOARD}`,
|
|
77
89
|
'',
|
|
78
|
-
'To use tracelane
|
|
79
|
-
'if your project
|
|
90
|
+
'To use tracelane now, run it against a WebdriverIO or Playwright suite',
|
|
91
|
+
'(pass --runner wdio / --runner playwright if your project has both).',
|
|
80
92
|
'',
|
|
81
93
|
].join('\n'));
|
|
82
94
|
return 0;
|
|
@@ -101,9 +113,9 @@ export async function runInitProgrammatic(opts) {
|
|
|
101
113
|
// editor has something to point at.
|
|
102
114
|
const configPath = findRunnerConfig(cwd, opts.runner);
|
|
103
115
|
if (configPath === undefined) {
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
116
|
+
// WDIO + Playwright need a config file to edit; Cypress needs one to
|
|
117
|
+
// confirm the project shape before printing the not-yet-supported note.
|
|
118
|
+
// Either way, a missing config for the forced runner is a hard error.
|
|
107
119
|
writeErr(stderr, `tracelane init: --runner ${opts.runner} was passed, but no matching config file found in ${cwd}.\n`);
|
|
108
120
|
return 1;
|
|
109
121
|
}
|
|
@@ -117,22 +129,28 @@ export async function runInitProgrammatic(opts) {
|
|
|
117
129
|
}
|
|
118
130
|
}
|
|
119
131
|
// ---- Runner-specific routing ------------------------------------------
|
|
120
|
-
|
|
121
|
-
|
|
132
|
+
// Cypress is detected but not yet wired (adapter unpublished).
|
|
133
|
+
if (detected.runner === 'cypress') {
|
|
134
|
+
return printCypressUnsupported(detected, stdout);
|
|
122
135
|
}
|
|
123
|
-
//
|
|
136
|
+
// WDIO + Playwright share the same scaffold flow; the per-runner details
|
|
137
|
+
// (install package, config editor, success CTA, fixture follow-up) are
|
|
138
|
+
// captured below.
|
|
139
|
+
const runner = detected.runner;
|
|
140
|
+
const pkg = RUNNER_PACKAGE[runner];
|
|
141
|
+
const runnerLabel = runner === 'playwright' ? 'Playwright' : 'WebdriverIO';
|
|
124
142
|
const pm = detectPackageManager(cwd);
|
|
125
143
|
const gitignorePath = join(cwd, '.gitignore');
|
|
126
144
|
const gitignoreExists = existsSync(gitignorePath);
|
|
127
145
|
const skipInstall = opts.skipInstall ?? false;
|
|
128
|
-
write(stdout, `tracelane init - detected
|
|
146
|
+
write(stdout, `tracelane init - detected ${runnerLabel} project (${basename(detected.configPath)}) using ${pm.manager}.\n\n`);
|
|
129
147
|
if (pm.multipleLockfiles) {
|
|
130
148
|
write(stdout, `Note: multiple lockfiles detected (${pm.lockfilesFound.join(', ')}); using ${pm.manager}.\n\n`);
|
|
131
149
|
}
|
|
132
150
|
if (pm.fallback) {
|
|
133
151
|
write(stdout, 'Note: no lockfile detected; defaulting to npm.\n\n');
|
|
134
152
|
}
|
|
135
|
-
const steps = describeSteps(detected, pm, { skipInstall, gitignoreExists });
|
|
153
|
+
const steps = describeSteps(detected, pm, { skipInstall, gitignoreExists, pkg });
|
|
136
154
|
write(stdout, opts.dryRun ? 'DRY RUN — would do:\n' : 'About to:\n');
|
|
137
155
|
for (const s of steps) {
|
|
138
156
|
write(stdout, ` ${s.index}. ${opts.dryRun ? 'WOULD: ' : ''}${s.description}\n`);
|
|
@@ -140,9 +158,14 @@ export async function runInitProgrammatic(opts) {
|
|
|
140
158
|
write(stdout, '\n');
|
|
141
159
|
if (opts.dryRun) {
|
|
142
160
|
// Show the conf-edit preview without writing.
|
|
143
|
-
const preview =
|
|
161
|
+
const preview = runner === 'playwright'
|
|
162
|
+
? previewPlaywrightEdit(detected.configPath)
|
|
163
|
+
: previewConfEdit(detected.configPath);
|
|
144
164
|
if (preview !== undefined)
|
|
145
165
|
write(stdout, preview);
|
|
166
|
+
if (runner === 'playwright') {
|
|
167
|
+
write(stdout, `Manual follow-up after init:\n${FIXTURE_IMPORT_FOLLOWUP}\n\n`);
|
|
168
|
+
}
|
|
146
169
|
write(stdout, 'Dry run complete; no files changed.\n');
|
|
147
170
|
return 0;
|
|
148
171
|
}
|
|
@@ -155,7 +178,7 @@ export async function runInitProgrammatic(opts) {
|
|
|
155
178
|
}
|
|
156
179
|
// ---- Execute the steps ------------------------------------------------
|
|
157
180
|
if (!skipInstall) {
|
|
158
|
-
const cmd = installCommand(pm.manager);
|
|
181
|
+
const cmd = installCommand(pm.manager, pkg);
|
|
159
182
|
const [program, ...args] = cmd;
|
|
160
183
|
if (program === undefined) {
|
|
161
184
|
writeErr(stderr, 'tracelane init: empty install command (internal error).\n');
|
|
@@ -168,15 +191,17 @@ export async function runInitProgrammatic(opts) {
|
|
|
168
191
|
return 1;
|
|
169
192
|
}
|
|
170
193
|
if (result.status !== 0) {
|
|
171
|
-
writeErr(stderr, `tracelane init: install exited with code ${result.status}. Re-run with --skip-install once you've added
|
|
194
|
+
writeErr(stderr, `tracelane init: install exited with code ${result.status}. Re-run with --skip-install once you've added ${pkg} manually.\n`);
|
|
172
195
|
return 1;
|
|
173
196
|
}
|
|
174
197
|
write(stdout, '\n');
|
|
175
198
|
}
|
|
176
|
-
// Edit the
|
|
177
|
-
// next to the
|
|
199
|
+
// Edit the runner config in place. Back-out path keeps a one-shot .backup
|
|
200
|
+
// next to the config so the user can restore on their own if anything
|
|
178
201
|
// looks wrong after the run.
|
|
179
|
-
const editOutcome =
|
|
202
|
+
const editOutcome = runner === 'playwright'
|
|
203
|
+
? editPlaywrightConfigOnDisk(detected.configPath)
|
|
204
|
+
: editWdioConfOnDisk(detected.configPath);
|
|
180
205
|
if (editOutcome.kind === 'manual') {
|
|
181
206
|
write(stdout, [
|
|
182
207
|
`! Could not auto-edit ${basename(detected.configPath)}: ${editOutcome.reason}`,
|
|
@@ -199,7 +224,9 @@ export async function runInitProgrammatic(opts) {
|
|
|
199
224
|
].join('\n'));
|
|
200
225
|
}
|
|
201
226
|
else if (editOutcome.kind === 'alreadyConfigured') {
|
|
202
|
-
write(stdout,
|
|
227
|
+
write(stdout, runner === 'playwright'
|
|
228
|
+
? `* ${basename(detected.configPath)} already registers the @tracelane/playwright reporter; left it alone.\n`
|
|
229
|
+
: `* ${basename(detected.configPath)} already wires TraceLaneService; left it alone.\n`);
|
|
203
230
|
}
|
|
204
231
|
else {
|
|
205
232
|
write(stdout, `+ Edited ${basename(detected.configPath)}.\n`);
|
|
@@ -227,16 +254,39 @@ export async function runInitProgrammatic(opts) {
|
|
|
227
254
|
// copy-paste-ready command so the user knows exactly what to run, with
|
|
228
255
|
// the conf filename matching what we detected (handles .js/.mjs/.cjs).
|
|
229
256
|
const ok = process.stdout.isTTY ? '✔' : 'OK';
|
|
230
|
-
|
|
231
|
-
'
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
257
|
+
if (runner === 'playwright') {
|
|
258
|
+
// Playwright needs a SECOND, manual edit the CLI can't do safely: every
|
|
259
|
+
// spec must import tracelane's fixture instead of @playwright/test. Print
|
|
260
|
+
// it prominently so the user doesn't miss it.
|
|
261
|
+
write(stdout, [
|
|
262
|
+
'',
|
|
263
|
+
`${ok} reporter registered.`,
|
|
264
|
+
'',
|
|
265
|
+
"ONE MANUAL STEP LEFT — the recording is driven by tracelane's test fixture,",
|
|
266
|
+
"which the CLI can't safely add to your spec files for you:",
|
|
267
|
+
'',
|
|
268
|
+
...FIXTURE_IMPORT_FOLLOWUP.split('\n').map((l) => ` ${l}`),
|
|
269
|
+
'',
|
|
270
|
+
'Then run your suite: npx playwright test',
|
|
271
|
+
'On a failing test you get',
|
|
272
|
+
'./tracelane-reports/<spec>--<title>--<project>-<ts>.html — open it in any browser.',
|
|
273
|
+
'',
|
|
274
|
+
'Docs: https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-playwright',
|
|
275
|
+
'',
|
|
276
|
+
].join('\n'));
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
write(stdout, [
|
|
280
|
+
'',
|
|
281
|
+
`${ok} done.`,
|
|
282
|
+
`Run: npx wdio run ${basename(detected.configPath)}`,
|
|
283
|
+
'On a failing Chrome test you get',
|
|
284
|
+
'./tracelane-reports/<spec>--<title>.html — open it in any browser.',
|
|
285
|
+
'',
|
|
286
|
+
'Docs: https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-wdio',
|
|
287
|
+
'',
|
|
288
|
+
].join('\n'));
|
|
289
|
+
}
|
|
240
290
|
return 0;
|
|
241
291
|
}
|
|
242
292
|
function editWdioConfOnDisk(configPath) {
|
|
@@ -306,8 +356,65 @@ function previewConfEdit(configPath) {
|
|
|
306
356
|
: '';
|
|
307
357
|
return `Conf edit preview (${basename(configPath)}):\n${importLine}${entryLine}\n`;
|
|
308
358
|
}
|
|
359
|
+
/**
|
|
360
|
+
* Playwright analogue of `editWdioConfOnDisk`. Reads the playwright.config,
|
|
361
|
+
* registers the tracelane reporter, and on success writes the new content
|
|
362
|
+
* back with the same backup/sanity-check/restore discipline. On a clean
|
|
363
|
+
* back-out (unrecognised config shape) the file on disk is untouched.
|
|
364
|
+
*/
|
|
365
|
+
function editPlaywrightConfigOnDisk(configPath) {
|
|
366
|
+
const original = readFileSync(configPath, 'utf8');
|
|
367
|
+
const result = applyPlaywrightEdit(original);
|
|
368
|
+
if (!result.ok) {
|
|
369
|
+
return { kind: 'manual', reason: result.reason, snippet: result.manualSnippet };
|
|
370
|
+
}
|
|
371
|
+
if (result.alreadyConfigured) {
|
|
372
|
+
return { kind: 'alreadyConfigured' };
|
|
373
|
+
}
|
|
374
|
+
const backupPath = `${configPath}.tracelane-init.backup`;
|
|
375
|
+
writeFileSync(backupPath, original, 'utf8');
|
|
376
|
+
writeFileSync(configPath, result.source, 'utf8');
|
|
377
|
+
const verifyContent = readFileSync(configPath, 'utf8');
|
|
378
|
+
if (verifyContent !== result.source) {
|
|
379
|
+
renameSync(backupPath, configPath);
|
|
380
|
+
return {
|
|
381
|
+
kind: 'restored',
|
|
382
|
+
reason: 'post-write read-back did not match expected content',
|
|
383
|
+
snippet: PLAYWRIGHT_MANUAL_SNIPPET,
|
|
384
|
+
backupPath,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
try {
|
|
388
|
+
unlinkSync(backupPath);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
// Non-fatal; the leftover .backup is harmless.
|
|
392
|
+
}
|
|
393
|
+
return { kind: 'edited' };
|
|
394
|
+
}
|
|
395
|
+
/** Build the WOULD-BE preview shown by --dry-run for a Playwright config. */
|
|
396
|
+
function previewPlaywrightEdit(configPath) {
|
|
397
|
+
let original;
|
|
398
|
+
try {
|
|
399
|
+
original = readFileSync(configPath, 'utf8');
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
return undefined;
|
|
403
|
+
}
|
|
404
|
+
const result = applyPlaywrightEdit(original);
|
|
405
|
+
if (!result.ok) {
|
|
406
|
+
return `Would back out of config edit: ${result.reason}\n Manual snippet:\n${result.manualSnippet
|
|
407
|
+
.split('\n')
|
|
408
|
+
.map((l) => ` ${l}`)
|
|
409
|
+
.join('\n')}\n\n`;
|
|
410
|
+
}
|
|
411
|
+
if (result.alreadyConfigured) {
|
|
412
|
+
return `Would leave ${basename(configPath)} alone (already registers the @tracelane/playwright reporter).\n\n`;
|
|
413
|
+
}
|
|
414
|
+
return `Config edit preview (${basename(configPath)}):\n+ reporter: [..., ['@tracelane/playwright', { mode: 'failed' }]]\n\n`;
|
|
415
|
+
}
|
|
309
416
|
/** Help text for `tracelane init --help`. */
|
|
310
|
-
export const INIT_HELP = `tracelane init - wire
|
|
417
|
+
export const INIT_HELP = `tracelane init - wire tracelane into the test project in this directory.
|
|
311
418
|
|
|
312
419
|
Usage: npx @tracelane/cli init [options] (one-off; recommended)
|
|
313
420
|
tracelane init [options] (after 'npm i -D @tracelane/cli')
|
|
@@ -318,18 +425,30 @@ Options:
|
|
|
318
425
|
--dry-run Print what would happen; change nothing.
|
|
319
426
|
--yes, -y Skip the "about to do X, Y, Z - continue?" prompt.
|
|
320
427
|
--skip-install Don't run the package-manager install command.
|
|
321
|
-
Useful if you have
|
|
428
|
+
Useful if you already have the adapter installed.
|
|
322
429
|
--help, -h Show this help.
|
|
323
430
|
|
|
324
|
-
The CLI scans the current working directory for a
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
431
|
+
The CLI scans the current working directory for a runner config:
|
|
432
|
+
|
|
433
|
+
WebdriverIO wdio.conf.{ts,js,mjs,cjs} adds @tracelane/wdio,
|
|
434
|
+
inserts the service tuple
|
|
435
|
+
Playwright playwright.config.{ts,js,mjs,cjs} adds @tracelane/playwright,
|
|
436
|
+
registers the reporter
|
|
437
|
+
Cypress cypress.config.* detected, not yet supported
|
|
438
|
+
|
|
439
|
+
It adds the adapter as a devDependency via the detected package manager
|
|
440
|
+
(pnpm/yarn/npm/bun), edits the config, creates ./tracelane-reports/, and
|
|
441
|
+
appends to .gitignore. Idempotent: re-running on an already-wired project is a
|
|
442
|
+
no-op.
|
|
443
|
+
|
|
444
|
+
Playwright also needs a one-time manual step the CLI can't do for you: change
|
|
445
|
+
your spec imports to tracelane's fixture --
|
|
446
|
+
import { test, expect } from '@tracelane/playwright/fixture';
|
|
447
|
+
init prints this reminder after it finishes.
|
|
329
448
|
|
|
330
|
-
Auto-edit limitation: the
|
|
331
|
-
services array. If
|
|
332
|
-
and
|
|
449
|
+
Auto-edit limitation: the editors use string regex to insert into the
|
|
450
|
+
services / reporter array. If they can't recognise the shape they BACK OUT
|
|
451
|
+
cleanly and print the snippet to paste manually - they NEVER corrupt your config.
|
|
333
452
|
`;
|
|
334
453
|
/**
|
|
335
454
|
* Argv entry for `tracelane init`. Parses flags via node:util.parseArgs and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/detect.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** The test runners tracelane recognises.
|
|
1
|
+
/** The test runners tracelane recognises. WDIO + Playwright are fully wired. */
|
|
2
2
|
export type Runner = 'wdio' | 'playwright' | 'cypress';
|
|
3
3
|
/** The package managers tracelane recognises (lockfile-driven detection). */
|
|
4
4
|
export type PackageManager = 'pnpm' | 'yarn' | 'npm' | 'bun';
|
|
@@ -45,15 +45,17 @@ export interface DetectedPackageManager {
|
|
|
45
45
|
*/
|
|
46
46
|
export declare function detectPackageManager(cwd: string, fileExists?: (path: string) => boolean): DetectedPackageManager;
|
|
47
47
|
/**
|
|
48
|
-
* Build the package-manager install command for adding
|
|
49
|
-
* a devDependency.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
48
|
+
* Build the package-manager install command for adding a tracelane adapter as
|
|
49
|
+
* a devDependency. `pkg` defaults to `@tracelane/wdio` but callers pass the
|
|
50
|
+
* runner-specific package (e.g. `@tracelane/playwright`). Returned as
|
|
51
|
+
* `[program, ...args]` for `spawnSync`, NOT a single shell string — `sh -c` is
|
|
52
|
+
* avoided to dodge injection on Windows and paths-with-spaces. Each manager
|
|
53
|
+
* has its own dev-flag spelling:
|
|
52
54
|
*
|
|
53
|
-
* pnpm add -D
|
|
54
|
-
* yarn add -D
|
|
55
|
-
* npm install --save-dev
|
|
56
|
-
* bun add -d
|
|
55
|
+
* pnpm add -D <pkg>
|
|
56
|
+
* yarn add -D <pkg>
|
|
57
|
+
* npm install --save-dev <pkg>
|
|
58
|
+
* bun add -d <pkg>
|
|
57
59
|
*/
|
|
58
60
|
export declare function installCommand(manager: PackageManager, pkg?: string): readonly string[];
|
|
59
61
|
//# sourceMappingURL=detect.d.ts.map
|
package/dist/lib/detect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"AAcA
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"AAcA,gFAAgF;AAChF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAoC7D,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,cAAc,GAAG,SAAS,CAQ5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,MAAM,GAAG,SAAS,CAQpB;AAiBD,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,oEAAoE;IACpE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,sBAAsB,CAsBxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,GAAG,SAAoB,GACtB,SAAS,MAAM,EAAE,CAWnB"}
|
package/dist/lib/detect.js
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
//
|
|
7
7
|
// Runner detection looks ONLY at the project root, not recursively — a
|
|
8
8
|
// wdio.conf inside node_modules is not the user's project. Priority order
|
|
9
|
-
// when multiple match is WDIO > Playwright > Cypress (WDIO
|
|
10
|
-
//
|
|
9
|
+
// when multiple match is WDIO > Playwright > Cypress (both WDIO and Playwright
|
|
10
|
+
// are fully wired; Cypress isn't supported yet).
|
|
11
11
|
import { existsSync } from 'node:fs';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
|
-
// Priority order: WDIO first
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
13
|
+
// Priority order: WDIO first, then Playwright (both are fully wired by the
|
|
14
|
+
// CLI), then Cypress (detected, but not yet supported — the init command
|
|
15
|
+
// prints a clear "not yet supported" message). Listing all three means a user
|
|
16
|
+
// with multiple configs is routed to the most-mature matching path.
|
|
17
17
|
const RUNNER_SPECS = [
|
|
18
18
|
{
|
|
19
19
|
runner: 'wdio',
|
|
@@ -115,15 +115,17 @@ export function detectPackageManager(cwd, fileExists = existsSync) {
|
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
|
-
* Build the package-manager install command for adding
|
|
119
|
-
* a devDependency.
|
|
120
|
-
*
|
|
121
|
-
*
|
|
118
|
+
* Build the package-manager install command for adding a tracelane adapter as
|
|
119
|
+
* a devDependency. `pkg` defaults to `@tracelane/wdio` but callers pass the
|
|
120
|
+
* runner-specific package (e.g. `@tracelane/playwright`). Returned as
|
|
121
|
+
* `[program, ...args]` for `spawnSync`, NOT a single shell string — `sh -c` is
|
|
122
|
+
* avoided to dodge injection on Windows and paths-with-spaces. Each manager
|
|
123
|
+
* has its own dev-flag spelling:
|
|
122
124
|
*
|
|
123
|
-
* pnpm add -D
|
|
124
|
-
* yarn add -D
|
|
125
|
-
* npm install --save-dev
|
|
126
|
-
* bun add -d
|
|
125
|
+
* pnpm add -D <pkg>
|
|
126
|
+
* yarn add -D <pkg>
|
|
127
|
+
* npm install --save-dev <pkg>
|
|
128
|
+
* bun add -d <pkg>
|
|
127
129
|
*/
|
|
128
130
|
export function installCommand(manager, pkg = '@tracelane/wdio') {
|
|
129
131
|
switch (manager) {
|
package/dist/lib/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,yEAAyE;AACzE,8BAA8B;AAC9B,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reporter-array entry we add. Tuple form: ['@tracelane/playwright', opts].
|
|
3
|
+
* Mirrors the canonical wiring from the @tracelane/playwright README.
|
|
4
|
+
*/
|
|
5
|
+
export declare const TRACELANE_REPORTER_ENTRY = "['@tracelane/playwright', { mode: 'failed' }]";
|
|
6
|
+
/**
|
|
7
|
+
* The manual follow-up the user must apply themselves: swap the test import in
|
|
8
|
+
* their spec files to tracelane's fixture. The CLI can't safely rewrite every
|
|
9
|
+
* spec, so init prints this verbatim. Phrasing mirrors the README's "Use
|
|
10
|
+
* tracelane's test/expect" step.
|
|
11
|
+
*/
|
|
12
|
+
export declare const FIXTURE_IMPORT_FOLLOWUP = "In each spec file, change your Playwright test import to tracelane's fixture\n(a drop-in for @playwright/test \u2014 recording is automatic, nothing per-test):\n\n - import { test, expect } from '@playwright/test';\n + import { test, expect } from '@tracelane/playwright/fixture';";
|
|
13
|
+
/** Sanity bounds for the post-edit byte-count delta. */
|
|
14
|
+
export declare const EDIT_DELTA_MIN = 30;
|
|
15
|
+
export declare const EDIT_DELTA_MAX = 400;
|
|
16
|
+
/** A `reporter: [...]` literal block we found inside the source. */
|
|
17
|
+
interface ReporterBlock {
|
|
18
|
+
/** Absolute character offset of the opening `[`. */
|
|
19
|
+
readonly openIndex: number;
|
|
20
|
+
/** Absolute character offset of the matching closing `]`. */
|
|
21
|
+
readonly closeIndex: number;
|
|
22
|
+
/** Substring between `[` and `]` (exclusive). */
|
|
23
|
+
readonly inner: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Produce a same-length copy of `src` where every string literal and every
|
|
27
|
+
* comment is replaced with same-length space padding (newlines preserved).
|
|
28
|
+
* Template-literal `${...}` interpolation bodies are treated as code.
|
|
29
|
+
*/
|
|
30
|
+
export declare function stripStringsAndComments(src: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Locate the `reporter:` array literal in a playwright.config source string.
|
|
33
|
+
* Returns the bracket indices + the substring inside, or `undefined` if the
|
|
34
|
+
* `reporter` key is absent OR is not an array (e.g. `reporter: 'list'`).
|
|
35
|
+
*
|
|
36
|
+
* Runs against `stripStringsAndComments(source)` so a `reporter:` inside a
|
|
37
|
+
* comment or string can never be selected. Prefers the SHALLOWEST brace+bracket
|
|
38
|
+
* depth so a nested `reporter:` inside e.g. a `projects: [{ ... }]` entry would
|
|
39
|
+
* not win over a top-level config `reporter:`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function findReporterArray(source: string): ReporterBlock | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* True if the source already registers the `@tracelane/playwright` reporter.
|
|
44
|
+
* Only the `reporter:` value region is inspected (see `reporterValueRegion`),
|
|
45
|
+
* so a `@tracelane/playwright` string literal elsewhere — or in a comment —
|
|
46
|
+
* never false-positives.
|
|
47
|
+
*/
|
|
48
|
+
export declare function hasTracelaneReporter(source: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Append the tracelane reporter entry as the LAST element of an existing
|
|
51
|
+
* reporter array. Covers:
|
|
52
|
+
*
|
|
53
|
+
* reporter: [] → reporter: [<entry>]
|
|
54
|
+
* reporter: [['list']] → reporter: [['list'], <entry>]
|
|
55
|
+
* reporter: [['list'],] → reporter: [['list'], <entry>] (trailing comma)
|
|
56
|
+
*
|
|
57
|
+
* Caller has already located `block` via `findReporterArray`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function appendToReporterArray(source: string, block: ReporterBlock): string;
|
|
60
|
+
/**
|
|
61
|
+
* Insert a `reporter: [<entry>]` line into a config object that has no
|
|
62
|
+
* `reporter:` key at all.
|
|
63
|
+
*
|
|
64
|
+
* Strategy: find the FIRST config object literal — either the object passed to
|
|
65
|
+
* `defineConfig({ ... })`, or an `export default { ... }` / `const config = {`
|
|
66
|
+
* literal — locate its outermost `{`/`}`, and insert the reporter key just
|
|
67
|
+
* after the opening brace. Returns undefined if no object literal is found
|
|
68
|
+
* (caller backs out to the manual snippet).
|
|
69
|
+
*
|
|
70
|
+
* Runs against the stripped buffer so an example in a doc-comment can't match.
|
|
71
|
+
*/
|
|
72
|
+
export declare function insertReporterKey(source: string): string | undefined;
|
|
73
|
+
/** Result shape for `applyPlaywrightEdit`. */
|
|
74
|
+
export type PlaywrightEditResult = {
|
|
75
|
+
readonly ok: true;
|
|
76
|
+
/** The new source content to write back. */
|
|
77
|
+
readonly source: string;
|
|
78
|
+
/** True if the reporter was already registered — no-op. */
|
|
79
|
+
readonly alreadyConfigured: boolean;
|
|
80
|
+
} | {
|
|
81
|
+
readonly ok: false;
|
|
82
|
+
/** Why the editor backed out. Surfaced verbatim to the user. */
|
|
83
|
+
readonly reason: string;
|
|
84
|
+
/** The snippet the user should paste manually (always populated). */
|
|
85
|
+
readonly manualSnippet: string;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Manual-paste snippet shown when the editor backs out. The user adds the
|
|
89
|
+
* reporter tuple to their `reporter` array themselves. Single source of truth
|
|
90
|
+
* — init.ts's "restored from backup" path references this so the copy can't
|
|
91
|
+
* drift.
|
|
92
|
+
*/
|
|
93
|
+
export declare const MANUAL_SNIPPET: string;
|
|
94
|
+
/**
|
|
95
|
+
* The single high-level entrypoint. Given the current source of a
|
|
96
|
+
* playwright.config.*, produce the new source (with the tracelane reporter
|
|
97
|
+
* registered) — or fail cleanly with a manual snippet.
|
|
98
|
+
*
|
|
99
|
+
* Steps:
|
|
100
|
+
* 1. If the reporter is already registered, no-op (alreadyConfigured).
|
|
101
|
+
* 2. Append to an existing `reporter: [...]` array, OR
|
|
102
|
+
* 3. Promote a bare-string `reporter: 'x'` into an array, OR
|
|
103
|
+
* 4. Insert a new `reporter:` key into the config object literal.
|
|
104
|
+
* 5. Sanity-check the byte-count delta + presence of the marker string.
|
|
105
|
+
*/
|
|
106
|
+
export declare function applyPlaywrightEdit(originalSource: string): PlaywrightEditResult;
|
|
107
|
+
export {};
|
|
108
|
+
//# sourceMappingURL=playwright-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-editor.d.ts","sourceRoot":"","sources":["../../src/lib/playwright-editor.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,eAAO,MAAM,wBAAwB,kDAAkD,CAAC;AAExF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,+RAI8B,CAAC;AAEnE,wDAAwD;AACxD,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,oEAAoE;AACpE,UAAU,aAAa;IACrB,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAQD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoF3D;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAwB3E;AA6BD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAI5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAclF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAepE;AA2BD,8CAA8C;AAC9C,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEN;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAG6B,CAAC;AAEzD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,oBAAoB,CA2ChF"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
// String-based editor for playwright.config.* — the Playwright analogue of
|
|
2
|
+
// wdio-editor.ts (Strategy A: regex over an AST parser, for the same two
|
|
3
|
+
// reasons documented there: ts-morph would bloat the published CLI, and the
|
|
4
|
+
// space of "real" playwright.config shapes is small + well-defined).
|
|
5
|
+
//
|
|
6
|
+
// What it does (and DELIBERATELY does NOT do):
|
|
7
|
+
//
|
|
8
|
+
// - It registers the `@tracelane/playwright` reporter in the `reporter`
|
|
9
|
+
// array of the user's Playwright config — creating the array if absent,
|
|
10
|
+
// appending if present, idempotent on re-run.
|
|
11
|
+
// - It does NOT rewrite the user's spec files. The Playwright integration
|
|
12
|
+
// also requires swapping the test import to the fixture
|
|
13
|
+
// (`import { test, expect } from '@tracelane/playwright/fixture'`), which
|
|
14
|
+
// can live across arbitrarily many spec files in arbitrary shapes. The
|
|
15
|
+
// CLI cannot reliably rewrite all of them, so `init` registers the
|
|
16
|
+
// reporter here and prints a clear, copy-pasteable follow-up instruction
|
|
17
|
+
// (see FIXTURE_IMPORT_FOLLOWUP). This is the conservative choice — we
|
|
18
|
+
// never touch files we can't edit safely.
|
|
19
|
+
//
|
|
20
|
+
// The contract every edit MUST satisfy after `applyPlaywrightEdit` returns
|
|
21
|
+
// `{ ok: true, ... }`:
|
|
22
|
+
//
|
|
23
|
+
// - The source contains a `@tracelane/playwright` entry inside the
|
|
24
|
+
// `reporter` array.
|
|
25
|
+
// - File length grew by a plausible amount (sanity bound; 0 = nothing
|
|
26
|
+
// happened, 10kb+ = the regex went off the rails). Idempotent re-runs
|
|
27
|
+
// return `alreadyConfigured: true` and grow by 0.
|
|
28
|
+
//
|
|
29
|
+
// SHADOW SAFETY: like wdio-editor, every source-scanning regex runs against a
|
|
30
|
+
// `stripStringsAndComments` buffer (NOT the raw source), so a `reporter:`
|
|
31
|
+
// mention inside a comment or string literal can never be edited. Offsets
|
|
32
|
+
// translate 1:1 between the stripped and raw buffers (the strip is
|
|
33
|
+
// length-preserving), so a match in the stripped buffer slices out of the raw
|
|
34
|
+
// source by its index.
|
|
35
|
+
/**
|
|
36
|
+
* The reporter-array entry we add. Tuple form: ['@tracelane/playwright', opts].
|
|
37
|
+
* Mirrors the canonical wiring from the @tracelane/playwright README.
|
|
38
|
+
*/
|
|
39
|
+
export const TRACELANE_REPORTER_ENTRY = `['@tracelane/playwright', { mode: 'failed' }]`;
|
|
40
|
+
/**
|
|
41
|
+
* The manual follow-up the user must apply themselves: swap the test import in
|
|
42
|
+
* their spec files to tracelane's fixture. The CLI can't safely rewrite every
|
|
43
|
+
* spec, so init prints this verbatim. Phrasing mirrors the README's "Use
|
|
44
|
+
* tracelane's test/expect" step.
|
|
45
|
+
*/
|
|
46
|
+
export const FIXTURE_IMPORT_FOLLOWUP = `In each spec file, change your Playwright test import to tracelane's fixture
|
|
47
|
+
(a drop-in for @playwright/test — recording is automatic, nothing per-test):
|
|
48
|
+
|
|
49
|
+
- import { test, expect } from '@playwright/test';
|
|
50
|
+
+ import { test, expect } from '@tracelane/playwright/fixture';`;
|
|
51
|
+
/** Sanity bounds for the post-edit byte-count delta. */
|
|
52
|
+
export const EDIT_DELTA_MIN = 30; // the reporter entry alone is ~45 bytes
|
|
53
|
+
export const EDIT_DELTA_MAX = 400;
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Shared scanner — identical strategy to wdio-editor: walk the source once,
|
|
56
|
+
// padding string-literal + comment bodies to spaces so regex can never match
|
|
57
|
+
// inside them. Offsets are preserved 1:1 (the strip is length-preserving).
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/**
|
|
60
|
+
* Produce a same-length copy of `src` where every string literal and every
|
|
61
|
+
* comment is replaced with same-length space padding (newlines preserved).
|
|
62
|
+
* Template-literal `${...}` interpolation bodies are treated as code.
|
|
63
|
+
*/
|
|
64
|
+
export function stripStringsAndComments(src) {
|
|
65
|
+
const out = new Array(src.length);
|
|
66
|
+
let i = 0;
|
|
67
|
+
const n = src.length;
|
|
68
|
+
while (i < n) {
|
|
69
|
+
const ch = src[i];
|
|
70
|
+
const next = src[i + 1];
|
|
71
|
+
// Line comment: `// ...` to end-of-line.
|
|
72
|
+
if (ch === '/' && next === '/') {
|
|
73
|
+
out[i] = ' ';
|
|
74
|
+
out[i + 1] = ' ';
|
|
75
|
+
i += 2;
|
|
76
|
+
while (i < n && src[i] !== '\n') {
|
|
77
|
+
out[i] = ' ';
|
|
78
|
+
i += 1;
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Block comment: `/* ... */`.
|
|
83
|
+
if (ch === '/' && next === '*') {
|
|
84
|
+
out[i] = ' ';
|
|
85
|
+
out[i + 1] = ' ';
|
|
86
|
+
i += 2;
|
|
87
|
+
while (i < n && !(src[i] === '*' && src[i + 1] === '/')) {
|
|
88
|
+
out[i] = src[i] === '\n' ? '\n' : ' ';
|
|
89
|
+
i += 1;
|
|
90
|
+
}
|
|
91
|
+
if (i < n) {
|
|
92
|
+
out[i] = ' ';
|
|
93
|
+
out[i + 1] = ' ';
|
|
94
|
+
i += 2;
|
|
95
|
+
}
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// String literals: single, double, template.
|
|
99
|
+
if (ch === '"' || ch === "'" || ch === '`') {
|
|
100
|
+
const quote = ch;
|
|
101
|
+
out[i] = ch;
|
|
102
|
+
i += 1;
|
|
103
|
+
while (i < n) {
|
|
104
|
+
const c = src[i];
|
|
105
|
+
if (c === '\\') {
|
|
106
|
+
out[i] = ' ';
|
|
107
|
+
if (i + 1 < n)
|
|
108
|
+
out[i + 1] = src[i + 1] === '\n' ? '\n' : ' ';
|
|
109
|
+
i += 2;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (quote === '`' && c === '$' && src[i + 1] === '{') {
|
|
113
|
+
out[i] = ' ';
|
|
114
|
+
out[i + 1] = ' ';
|
|
115
|
+
let braceDepth = 1;
|
|
116
|
+
i += 2;
|
|
117
|
+
while (i < n && braceDepth > 0) {
|
|
118
|
+
const cc = src[i] ?? '';
|
|
119
|
+
if (cc === '{')
|
|
120
|
+
braceDepth += 1;
|
|
121
|
+
else if (cc === '}')
|
|
122
|
+
braceDepth -= 1;
|
|
123
|
+
if (braceDepth === 0) {
|
|
124
|
+
out[i] = ' ';
|
|
125
|
+
i += 1;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
out[i] = cc;
|
|
129
|
+
i += 1;
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (c === quote) {
|
|
134
|
+
out[i] = c;
|
|
135
|
+
i += 1;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
out[i] = c === '\n' ? '\n' : ' ';
|
|
139
|
+
i += 1;
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
out[i] = ch ?? '';
|
|
144
|
+
i += 1;
|
|
145
|
+
}
|
|
146
|
+
return out.join('');
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Generic bracket/brace counter. Walks `scan` (a pre-stripped buffer) from
|
|
150
|
+
* `openIndex` (which must point at an opening delimiter) and returns the index
|
|
151
|
+
* of the matching closer, or -1 if EOF arrives first.
|
|
152
|
+
*/
|
|
153
|
+
function findMatchingDelimiter(scan, openIndex, open, close) {
|
|
154
|
+
let depth = 0;
|
|
155
|
+
let i = openIndex;
|
|
156
|
+
const n = scan.length;
|
|
157
|
+
while (i < n) {
|
|
158
|
+
const ch = scan[i];
|
|
159
|
+
if (ch === open)
|
|
160
|
+
depth += 1;
|
|
161
|
+
else if (ch === close) {
|
|
162
|
+
depth -= 1;
|
|
163
|
+
if (depth === 0)
|
|
164
|
+
return i;
|
|
165
|
+
}
|
|
166
|
+
i += 1;
|
|
167
|
+
}
|
|
168
|
+
return -1;
|
|
169
|
+
}
|
|
170
|
+
/** Brace + bracket combined depth at every character of a stripped buffer. */
|
|
171
|
+
function depthAt(scan) {
|
|
172
|
+
const out = new Array(scan.length);
|
|
173
|
+
let braces = 0;
|
|
174
|
+
let brackets = 0;
|
|
175
|
+
for (let i = 0; i < scan.length; i += 1) {
|
|
176
|
+
const ch = scan[i];
|
|
177
|
+
if (ch === '{')
|
|
178
|
+
braces += 1;
|
|
179
|
+
else if (ch === '}')
|
|
180
|
+
braces = Math.max(0, braces - 1);
|
|
181
|
+
else if (ch === '[')
|
|
182
|
+
brackets += 1;
|
|
183
|
+
else if (ch === ']')
|
|
184
|
+
brackets = Math.max(0, brackets - 1);
|
|
185
|
+
out[i] = braces + brackets;
|
|
186
|
+
}
|
|
187
|
+
return out;
|
|
188
|
+
}
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// Public scanning helpers
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
/**
|
|
193
|
+
* Locate the `reporter:` array literal in a playwright.config source string.
|
|
194
|
+
* Returns the bracket indices + the substring inside, or `undefined` if the
|
|
195
|
+
* `reporter` key is absent OR is not an array (e.g. `reporter: 'list'`).
|
|
196
|
+
*
|
|
197
|
+
* Runs against `stripStringsAndComments(source)` so a `reporter:` inside a
|
|
198
|
+
* comment or string can never be selected. Prefers the SHALLOWEST brace+bracket
|
|
199
|
+
* depth so a nested `reporter:` inside e.g. a `projects: [{ ... }]` entry would
|
|
200
|
+
* not win over a top-level config `reporter:`.
|
|
201
|
+
*/
|
|
202
|
+
export function findReporterArray(source) {
|
|
203
|
+
const scan = stripStringsAndComments(source);
|
|
204
|
+
const depths = depthAt(scan);
|
|
205
|
+
// Match `reporter:` followed (after optional whitespace) by `[`. If the
|
|
206
|
+
// next non-space char is NOT `[`, this isn't an array reporter and we skip.
|
|
207
|
+
const re = /(?:^|[\s,{])(?:reporter|"reporter"|'reporter')\s*:\s*\[/g;
|
|
208
|
+
let m;
|
|
209
|
+
let best;
|
|
210
|
+
// biome-ignore lint/suspicious/noAssignInExpressions: idiomatic for global-flag regex iteration
|
|
211
|
+
while ((m = re.exec(scan)) !== null) {
|
|
212
|
+
const openIndex = m.index + m[0].length - 1; // points at `[`
|
|
213
|
+
const closeIndex = findMatchingDelimiter(scan, openIndex, '[', ']');
|
|
214
|
+
if (closeIndex === -1)
|
|
215
|
+
continue;
|
|
216
|
+
const keyDepth = depths[openIndex - 1] ?? 0;
|
|
217
|
+
if (best === undefined || keyDepth < best.depth) {
|
|
218
|
+
best = { openIndex, closeIndex, depth: keyDepth };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (!best)
|
|
222
|
+
return undefined;
|
|
223
|
+
return {
|
|
224
|
+
openIndex: best.openIndex,
|
|
225
|
+
closeIndex: best.closeIndex,
|
|
226
|
+
inner: source.slice(best.openIndex + 1, best.closeIndex),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Slice the value region of a `reporter:` key — the array body if it's an
|
|
231
|
+
* array, or the single string literal if it's a bare-string reporter. Returns
|
|
232
|
+
* the RAW-source substring (offsets translate 1:1), or undefined if there's no
|
|
233
|
+
* `reporter:` key outside strings/comments. This is the only place a tracelane
|
|
234
|
+
* reporter entry can legitimately live, so checking ONLY this region prevents
|
|
235
|
+
* a stray `"@tracelane/playwright"` string literal elsewhere in the file from
|
|
236
|
+
* false-positiving.
|
|
237
|
+
*/
|
|
238
|
+
function reporterValueRegion(source) {
|
|
239
|
+
// Array form first.
|
|
240
|
+
const block = findReporterArray(source);
|
|
241
|
+
if (block !== undefined)
|
|
242
|
+
return block.inner;
|
|
243
|
+
// Bare-string form: `reporter: '...'`.
|
|
244
|
+
const scan = stripStringsAndComments(source);
|
|
245
|
+
const re = /(?:^|[\s,{])(?:reporter|"reporter"|'reporter')\s*:\s*(['"])/g;
|
|
246
|
+
const m = re.exec(scan);
|
|
247
|
+
if (!m)
|
|
248
|
+
return undefined;
|
|
249
|
+
const quoteOpen = m.index + m[0].length - 1;
|
|
250
|
+
const quoteChar = source[quoteOpen];
|
|
251
|
+
if (quoteChar !== "'" && quoteChar !== '"')
|
|
252
|
+
return undefined;
|
|
253
|
+
let i = quoteOpen + 1;
|
|
254
|
+
while (i < source.length && source[i] !== quoteChar)
|
|
255
|
+
i += 1;
|
|
256
|
+
if (i >= source.length)
|
|
257
|
+
return undefined;
|
|
258
|
+
return source.slice(quoteOpen, i + 1);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* True if the source already registers the `@tracelane/playwright` reporter.
|
|
262
|
+
* Only the `reporter:` value region is inspected (see `reporterValueRegion`),
|
|
263
|
+
* so a `@tracelane/playwright` string literal elsewhere — or in a comment —
|
|
264
|
+
* never false-positives.
|
|
265
|
+
*/
|
|
266
|
+
export function hasTracelaneReporter(source) {
|
|
267
|
+
const region = reporterValueRegion(source);
|
|
268
|
+
if (region === undefined)
|
|
269
|
+
return false;
|
|
270
|
+
return /(['"])@tracelane\/playwright\1/.test(region);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Append the tracelane reporter entry as the LAST element of an existing
|
|
274
|
+
* reporter array. Covers:
|
|
275
|
+
*
|
|
276
|
+
* reporter: [] → reporter: [<entry>]
|
|
277
|
+
* reporter: [['list']] → reporter: [['list'], <entry>]
|
|
278
|
+
* reporter: [['list'],] → reporter: [['list'], <entry>] (trailing comma)
|
|
279
|
+
*
|
|
280
|
+
* Caller has already located `block` via `findReporterArray`.
|
|
281
|
+
*/
|
|
282
|
+
export function appendToReporterArray(source, block) {
|
|
283
|
+
const inner = block.inner;
|
|
284
|
+
const trimmedInner = inner.replace(/\s+$/, '');
|
|
285
|
+
const isEmpty = trimmedInner.trim().length === 0;
|
|
286
|
+
const hasTrailingComma = trimmedInner.endsWith(',');
|
|
287
|
+
let newInner;
|
|
288
|
+
if (isEmpty) {
|
|
289
|
+
newInner = TRACELANE_REPORTER_ENTRY;
|
|
290
|
+
}
|
|
291
|
+
else if (hasTrailingComma) {
|
|
292
|
+
newInner = `${trimmedInner} ${TRACELANE_REPORTER_ENTRY}`;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
newInner = `${trimmedInner}, ${TRACELANE_REPORTER_ENTRY}`;
|
|
296
|
+
}
|
|
297
|
+
return `${source.slice(0, block.openIndex + 1)}${newInner}${source.slice(block.closeIndex)}`;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Insert a `reporter: [<entry>]` line into a config object that has no
|
|
301
|
+
* `reporter:` key at all.
|
|
302
|
+
*
|
|
303
|
+
* Strategy: find the FIRST config object literal — either the object passed to
|
|
304
|
+
* `defineConfig({ ... })`, or an `export default { ... }` / `const config = {`
|
|
305
|
+
* literal — locate its outermost `{`/`}`, and insert the reporter key just
|
|
306
|
+
* after the opening brace. Returns undefined if no object literal is found
|
|
307
|
+
* (caller backs out to the manual snippet).
|
|
308
|
+
*
|
|
309
|
+
* Runs against the stripped buffer so an example in a doc-comment can't match.
|
|
310
|
+
*/
|
|
311
|
+
export function insertReporterKey(source) {
|
|
312
|
+
const scan = stripStringsAndComments(source);
|
|
313
|
+
// defineConfig({ ... }) | export default { ... } | const config ... = {
|
|
314
|
+
// | export const config ... = { | module.exports = {
|
|
315
|
+
const re = /(?:defineConfig\s*\(\s*|export\s+default\s*|export\s+const\s+\w+[^=]*=\s*|const\s+\w+[^=]*=\s*|module\.exports\s*=\s*)(\{)/;
|
|
316
|
+
const m = re.exec(scan);
|
|
317
|
+
if (!m)
|
|
318
|
+
return undefined;
|
|
319
|
+
const braceIndex = m.index + m[0].length - 1; // points at `{`
|
|
320
|
+
const closeIndex = findMatchingDelimiter(scan, braceIndex, '{', '}');
|
|
321
|
+
if (closeIndex === -1)
|
|
322
|
+
return undefined;
|
|
323
|
+
// Insert right after the opening brace, on its own line, matching the
|
|
324
|
+
// two-space indent typical of these configs.
|
|
325
|
+
const insertion = `\n reporter: [${TRACELANE_REPORTER_ENTRY}],`;
|
|
326
|
+
return `${source.slice(0, braceIndex + 1)}${insertion}${source.slice(braceIndex + 1)}`;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Promote a bare-string reporter (`reporter: 'list'`) into an array that keeps
|
|
330
|
+
* the original entry and adds ours: `reporter: ['list', <entry>]`. Returns
|
|
331
|
+
* undefined if no bare-string reporter is found.
|
|
332
|
+
*/
|
|
333
|
+
function promoteStringReporter(source) {
|
|
334
|
+
const scan = stripStringsAndComments(source);
|
|
335
|
+
// `reporter:` followed by a quote (string literal), NOT a `[`.
|
|
336
|
+
const re = /(?:^|[\s,{])(?:reporter|"reporter"|'reporter')\s*:\s*(['"])/g;
|
|
337
|
+
const m = re.exec(scan);
|
|
338
|
+
if (!m)
|
|
339
|
+
return undefined;
|
|
340
|
+
// The opening quote is at m.index + m[0].length - 1 (length-preserving).
|
|
341
|
+
const quoteOpen = m.index + m[0].length - 1;
|
|
342
|
+
const quoteChar = source[quoteOpen];
|
|
343
|
+
if (quoteChar !== "'" && quoteChar !== '"')
|
|
344
|
+
return undefined;
|
|
345
|
+
// Find the closing quote in the RAW source.
|
|
346
|
+
let i = quoteOpen + 1;
|
|
347
|
+
while (i < source.length && source[i] !== quoteChar)
|
|
348
|
+
i += 1;
|
|
349
|
+
if (i >= source.length)
|
|
350
|
+
return undefined;
|
|
351
|
+
const closeQuote = i;
|
|
352
|
+
const original = source.slice(quoteOpen, closeQuote + 1);
|
|
353
|
+
const replacement = `[${original}, ${TRACELANE_REPORTER_ENTRY}]`;
|
|
354
|
+
return `${source.slice(0, quoteOpen)}${replacement}${source.slice(closeQuote + 1)}`;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Manual-paste snippet shown when the editor backs out. The user adds the
|
|
358
|
+
* reporter tuple to their `reporter` array themselves. Single source of truth
|
|
359
|
+
* — init.ts's "restored from backup" path references this so the copy can't
|
|
360
|
+
* drift.
|
|
361
|
+
*/
|
|
362
|
+
export const MANUAL_SNIPPET = `// In playwright.config.*, register the tracelane reporter:
|
|
363
|
+
// reporter: [${TRACELANE_REPORTER_ENTRY}],
|
|
364
|
+
//
|
|
365
|
+
// ${FIXTURE_IMPORT_FOLLOWUP.split('\n').join('\n// ')}`;
|
|
366
|
+
/**
|
|
367
|
+
* The single high-level entrypoint. Given the current source of a
|
|
368
|
+
* playwright.config.*, produce the new source (with the tracelane reporter
|
|
369
|
+
* registered) — or fail cleanly with a manual snippet.
|
|
370
|
+
*
|
|
371
|
+
* Steps:
|
|
372
|
+
* 1. If the reporter is already registered, no-op (alreadyConfigured).
|
|
373
|
+
* 2. Append to an existing `reporter: [...]` array, OR
|
|
374
|
+
* 3. Promote a bare-string `reporter: 'x'` into an array, OR
|
|
375
|
+
* 4. Insert a new `reporter:` key into the config object literal.
|
|
376
|
+
* 5. Sanity-check the byte-count delta + presence of the marker string.
|
|
377
|
+
*/
|
|
378
|
+
export function applyPlaywrightEdit(originalSource) {
|
|
379
|
+
if (hasTracelaneReporter(originalSource)) {
|
|
380
|
+
return { ok: true, source: originalSource, alreadyConfigured: true };
|
|
381
|
+
}
|
|
382
|
+
let next;
|
|
383
|
+
const block = findReporterArray(originalSource);
|
|
384
|
+
if (block !== undefined) {
|
|
385
|
+
next = appendToReporterArray(originalSource, block);
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
// No array reporter. Try promoting a bare-string reporter first; if there
|
|
389
|
+
// isn't one either, insert a fresh reporter key.
|
|
390
|
+
next = promoteStringReporter(originalSource) ?? insertReporterKey(originalSource);
|
|
391
|
+
}
|
|
392
|
+
if (next === undefined) {
|
|
393
|
+
return {
|
|
394
|
+
ok: false,
|
|
395
|
+
reason: "Couldn't find a Playwright config object literal (defineConfig({...}) or export default {...}) to register the reporter into. The auto-edit was aborted — apply the snippet below manually.",
|
|
396
|
+
manualSnippet: MANUAL_SNIPPET,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
// Sanity check: did our edit do something plausible?
|
|
400
|
+
if (!hasTracelaneReporter(next)) {
|
|
401
|
+
return {
|
|
402
|
+
ok: false,
|
|
403
|
+
reason: 'Post-edit sanity check failed: @tracelane/playwright reporter entry missing.',
|
|
404
|
+
manualSnippet: MANUAL_SNIPPET,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
const delta = next.length - originalSource.length;
|
|
408
|
+
if (delta < EDIT_DELTA_MIN || delta > EDIT_DELTA_MAX) {
|
|
409
|
+
return {
|
|
410
|
+
ok: false,
|
|
411
|
+
reason: `Post-edit sanity check failed: byte delta ${delta} outside [${EDIT_DELTA_MIN}, ${EDIT_DELTA_MAX}] bounds.`,
|
|
412
|
+
manualSnippet: MANUAL_SNIPPET,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
return { ok: true, source: next, alreadyConfigured: false };
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=playwright-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright-editor.js","sourceRoot":"","sources":["../../src/lib/playwright-editor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tracelane/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.12",
|
|
4
4
|
"description": "tracelane scaffolding CLI. `npx @tracelane/cli init` detects your test runner (WDIO / Playwright / Cypress) and wires @tracelane/wdio into wdio.conf.* in one command — the published path from `npm install` + manual conf edit to a single npx invocation.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tracelane",
|