@aplaytest/runner-playwright 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/api-fixtures.d.ts +71 -0
  3. package/dist/api-fixtures.d.ts.map +1 -0
  4. package/dist/api-fixtures.js +162 -0
  5. package/dist/api-fixtures.js.map +1 -0
  6. package/dist/assemble.d.ts +86 -0
  7. package/dist/assemble.d.ts.map +1 -0
  8. package/dist/assemble.js +176 -0
  9. package/dist/assemble.js.map +1 -0
  10. package/dist/bind.d.ts +43 -0
  11. package/dist/bind.d.ts.map +1 -0
  12. package/dist/bind.js +112 -0
  13. package/dist/bind.js.map +1 -0
  14. package/dist/fixtures.d.ts +54 -0
  15. package/dist/fixtures.d.ts.map +1 -0
  16. package/dist/fixtures.js +210 -0
  17. package/dist/fixtures.js.map +1 -0
  18. package/dist/index.d.ts +31 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +24 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/reporter.d.ts +79 -0
  23. package/dist/reporter.d.ts.map +1 -0
  24. package/dist/reporter.js +277 -0
  25. package/dist/reporter.js.map +1 -0
  26. package/dist/sidecar.d.ts +134 -0
  27. package/dist/sidecar.d.ts.map +1 -0
  28. package/dist/sidecar.js +111 -0
  29. package/dist/sidecar.js.map +1 -0
  30. package/dist/spawn.d.ts +57 -0
  31. package/dist/spawn.d.ts.map +1 -0
  32. package/dist/spawn.js +170 -0
  33. package/dist/spawn.js.map +1 -0
  34. package/dist/steps.d.ts +45 -0
  35. package/dist/steps.d.ts.map +1 -0
  36. package/dist/steps.js +106 -0
  37. package/dist/steps.js.map +1 -0
  38. package/dist-cjs/.tsbuildinfo +1 -0
  39. package/dist-cjs/api-fixtures.js +166 -0
  40. package/dist-cjs/api-fixtures.js.map +1 -0
  41. package/dist-cjs/assemble.js +181 -0
  42. package/dist-cjs/assemble.js.map +1 -0
  43. package/dist-cjs/bind.js +117 -0
  44. package/dist-cjs/bind.js.map +1 -0
  45. package/dist-cjs/fixtures.js +215 -0
  46. package/dist-cjs/fixtures.js.map +1 -0
  47. package/dist-cjs/index.js +64 -0
  48. package/dist-cjs/index.js.map +1 -0
  49. package/dist-cjs/package.json +3 -0
  50. package/dist-cjs/reporter.js +282 -0
  51. package/dist-cjs/reporter.js.map +1 -0
  52. package/dist-cjs/sidecar.js +116 -0
  53. package/dist-cjs/sidecar.js.map +1 -0
  54. package/dist-cjs/spawn.js +174 -0
  55. package/dist-cjs/spawn.js.map +1 -0
  56. package/dist-cjs/steps.js +112 -0
  57. package/dist-cjs/steps.js.map +1 -0
  58. package/package.json +51 -0
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * Extract the page-object call trail from Playwright's step tree.
4
+ *
5
+ * This is what turns "the selector [data-testid=gym-card-name] did not resolve"
6
+ * into "gymsPage.expectCardData({ name: 'Blackwater Valley BJJ' }) failed".
7
+ * The first says where the test looked; the second says what it WANTED — which
8
+ * is the input the healing engine actually reasons over.
9
+ *
10
+ * The trail arrives for free when page objects are bound through a wrapper
11
+ * that calls `test.step()`. No spec changes, no extra reporting channel.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.parseStepTitle = parseStepTitle;
15
+ exports.domainStringArgs = domainStringArgs;
16
+ exports.extractSteps = extractSteps;
17
+ exports.findFailingStep = findFailingStep;
18
+ /** `gymsPage.expectCardData({ name: 'X' })` → object / method / args preview. */
19
+ const CALL_PATTERN = /^([A-Za-z_$][\w$]*)\.([A-Za-z_$][\w$]*)\((.*)\)$/s;
20
+ function parseStepTitle(title) {
21
+ const match = CALL_PATTERN.exec(title.trim());
22
+ if (match === null)
23
+ return null;
24
+ const [, pageObject, method, argsPreview] = match;
25
+ if (pageObject === undefined || method === undefined)
26
+ return null;
27
+ return { pageObject, method, argsPreview: argsPreview ?? '' };
28
+ }
29
+ /**
30
+ * Domain string arguments from a step title — the accessible names, search
31
+ * terms, and labels the test was looking for. Tier-0 candidate generation
32
+ * matches these against the page's ARIA tree, which is why a page object that
33
+ * takes domain values rather than selectors pays off here.
34
+ */
35
+ function domainStringArgs(argsPreview) {
36
+ const out = [];
37
+ // Match any quote-delimited run, THEN filter. A length constraint inside the
38
+ // pattern lets the engine pair a closing quote with the next opening one —
39
+ // `'a', 'Cork'` would yield the separator `", "` as an "argument", quietly
40
+ // feeding junk into candidate matching.
41
+ const literal = /'([^']*)'|"([^"]*)"/g;
42
+ let match;
43
+ while ((match = literal.exec(argsPreview)) !== null) {
44
+ const value = match[1] ?? match[2];
45
+ if (value !== undefined && isDomainValue(value))
46
+ out.push(value);
47
+ }
48
+ return [...new Set(out)];
49
+ }
50
+ /** Two or more characters, containing at least one letter or digit. */
51
+ function isDomainValue(value) {
52
+ const trimmed = value.trim();
53
+ return trimmed.length >= 2 && /[\p{L}\p{N}]/u.test(trimmed);
54
+ }
55
+ const USER_STEP_CATEGORIES = new Set(['test.step']);
56
+ /** Flatten the step tree into an ordered trail of user-authored steps. */
57
+ function extractSteps(steps) {
58
+ const out = [];
59
+ const walk = (nodes) => {
60
+ for (const node of nodes) {
61
+ if (USER_STEP_CATEGORIES.has(node.category)) {
62
+ const parsed = parseStepTitle(node.title);
63
+ out.push({
64
+ pageObject: parsed?.pageObject ?? '(unknown)',
65
+ method: parsed?.method ?? node.title,
66
+ args: parsed === null ? [] : domainStringArgs(parsed.argsPreview),
67
+ startedAt: node.startTime.toISOString(),
68
+ durationMs: node.duration,
69
+ failed: node.error !== undefined && node.error !== null,
70
+ });
71
+ }
72
+ walk(node.steps);
73
+ }
74
+ };
75
+ walk(steps);
76
+ return out;
77
+ }
78
+ /**
79
+ * The DEEPEST failing step, not the first.
80
+ *
81
+ * Playwright marks every ancestor of a failure as failed too, so the outermost
82
+ * failed step is usually the whole test body — useless. The innermost one is
83
+ * the actual call that broke.
84
+ */
85
+ function findFailingStep(steps) {
86
+ let deepest = null;
87
+ const walk = (nodes, depth) => {
88
+ for (const node of nodes) {
89
+ const failed = node.error !== undefined && node.error !== null;
90
+ if (failed && USER_STEP_CATEGORIES.has(node.category)) {
91
+ const parsed = parseStepTitle(node.title);
92
+ if (deepest === null || depth > deepest.depth) {
93
+ deepest = {
94
+ depth,
95
+ record: {
96
+ pageObject: parsed?.pageObject ?? '(unknown)',
97
+ method: parsed?.method ?? node.title,
98
+ args: parsed === null ? [] : domainStringArgs(parsed.argsPreview),
99
+ startedAt: node.startTime.toISOString(),
100
+ durationMs: node.duration,
101
+ failed: true,
102
+ },
103
+ };
104
+ }
105
+ }
106
+ walk(node.steps, depth + 1);
107
+ }
108
+ };
109
+ walk(steps, 0);
110
+ return deepest === null ? null : deepest.record;
111
+ }
112
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../src/steps.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@aplaytest/runner-playwright",
3
+ "version": "0.1.0",
4
+ "description": "Playwright adapter: reporter plugin, error parsing, step extraction, evidence assembly",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist-cjs/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist-cjs/index.js"
14
+ },
15
+ "./reporter": {
16
+ "types": "./dist/reporter.d.ts",
17
+ "import": "./dist/reporter.js",
18
+ "require": "./dist-cjs/reporter.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "dist-cjs"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc --build",
27
+ "test": "vitest run"
28
+ },
29
+ "dependencies": {
30
+ "@aplaytest/core": "^0.1.0",
31
+ "zod": "^4.3.6"
32
+ },
33
+ "peerDependencies": {
34
+ "@playwright/test": ">=1.55.0"
35
+ },
36
+ "devDependencies": {
37
+ "@playwright/test": "1.61.0"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/ianoflynnautomation/aplaytest.git",
45
+ "directory": "packages/runner-playwright"
46
+ },
47
+ "homepage": "https://github.com/ianoflynnautomation/aplaytest#readme",
48
+ "bugs": {
49
+ "url": "https://github.com/ianoflynnautomation/aplaytest/issues"
50
+ }
51
+ }