devharness 0.9.5 → 0.9.6
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/build/command-recorder.d.ts +22 -0
- package/build/command-recorder.d.ts.map +1 -1
- package/build/command-recorder.js +51 -8
- package/build/command-recorder.js.map +1 -1
- package/build/github/issue-actions.js +5 -5
- package/build/github/issue-actions.js.map +1 -1
- package/build/index.js +3 -0
- package/build/index.js.map +1 -1
- package/build/tool-response.d.ts +8 -0
- package/build/tool-response.d.ts.map +1 -1
- package/build/tool-response.js.map +1 -1
- package/build/tools/assert-tools.d.ts +6 -6
- package/build/tools/breakpoint-tools.d.ts +3 -3
- package/build/tools/click-validation-console-noise.test.d.ts +2 -0
- package/build/tools/click-validation-console-noise.test.d.ts.map +1 -0
- package/build/tools/click-validation-console-noise.test.js +103 -0
- package/build/tools/click-validation-console-noise.test.js.map +1 -0
- package/build/tools/console-tools.d.ts +6 -6
- package/build/tools/console-tools.d.ts.map +1 -1
- package/build/tools/console-tools.js +1 -0
- package/build/tools/console-tools.js.map +1 -1
- package/build/tools/execution-tools.d.ts +3 -3
- package/build/tools/input-tools.d.ts +3 -3
- package/build/tools/inspection-tools.d.ts +15 -15
- package/build/tools/interpolation-reverse.d.ts +26 -0
- package/build/tools/interpolation-reverse.d.ts.map +1 -0
- package/build/tools/interpolation-reverse.js +130 -0
- package/build/tools/interpolation-reverse.js.map +1 -0
- package/build/tools/interpolation-reverse.test.d.ts +2 -0
- package/build/tools/interpolation-reverse.test.d.ts.map +1 -0
- package/build/tools/interpolation-reverse.test.js +76 -0
- package/build/tools/interpolation-reverse.test.js.map +1 -0
- package/build/tools/network-tools.d.ts +9 -9
- package/build/tools/replay-create-templatize.test.d.ts +2 -0
- package/build/tools/replay-create-templatize.test.d.ts.map +1 -0
- package/build/tools/replay-create-templatize.test.js +103 -0
- package/build/tools/replay-create-templatize.test.js.map +1 -0
- package/build/tools/replay-executor.d.ts +4 -0
- package/build/tools/replay-executor.d.ts.map +1 -1
- package/build/tools/replay-executor.js +39 -10
- package/build/tools/replay-executor.js.map +1 -1
- package/build/tools/replay-tools.d.ts +18 -18
- package/build/tools/replay-tools.d.ts.map +1 -1
- package/build/tools/replay-tools.js +6 -5
- package/build/tools/replay-tools.js.map +1 -1
- package/build/tools/request-tools.d.ts +1 -1
- package/build/tools/storage-tools.d.ts +6 -6
- package/docs/messages.md +188 -1
- package/package.json +1 -1
- package/plugin/skills/devharness/SKILL.md +1 -1
- package/plugin/skills/devharness/references/sequences.md +6 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Click validation used to compare raw console error COUNTS before/after a
|
|
3
|
+
* click, so an unrelated error landing in the post-click window (e.g. a
|
|
4
|
+
* favicon 404) was indistinguishable from one the click actually caused.
|
|
5
|
+
* capturePreClickState/validateClickAction now diff actual entry ids and
|
|
6
|
+
* exclude known browser noise (favicon.ico) from what counts as "new".
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect } from 'vitest';
|
|
9
|
+
import { capturePreClickState, validateClickAction } from './replay-executor.js';
|
|
10
|
+
import { productionShaped } from '../test-support/fake-execute-tool-call.js';
|
|
11
|
+
const BASE_CONFIG = {
|
|
12
|
+
enabled: true,
|
|
13
|
+
validateNavigation: false,
|
|
14
|
+
requireDomChanges: false,
|
|
15
|
+
domChangesFailMode: 'warn',
|
|
16
|
+
failOnConsoleErrors: true,
|
|
17
|
+
consoleErrorsFailMode: 'error',
|
|
18
|
+
validateNetworkPayload: false,
|
|
19
|
+
networkFailMode: 'warn',
|
|
20
|
+
postClickDelayMs: 0,
|
|
21
|
+
};
|
|
22
|
+
function consoleResponse(entries) {
|
|
23
|
+
return {
|
|
24
|
+
content: [{ type: 'text', text: '' }],
|
|
25
|
+
_meta: {
|
|
26
|
+
console: {
|
|
27
|
+
totalCount: entries.length,
|
|
28
|
+
errorCount: entries.length,
|
|
29
|
+
warnCount: 0,
|
|
30
|
+
entries: entries.map(e => ({ id: e.id, type: 'error', ...(e.url && { url: e.url }) })),
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Fake ctx whose console responses switch from `before` to `after` the first
|
|
36
|
+
* time `console` is called a second time - mirrors pre-click vs post-click. */
|
|
37
|
+
function makeCtx(before, after) {
|
|
38
|
+
let callCount = 0;
|
|
39
|
+
const executeToolCall = productionShaped(async (tool, _params) => {
|
|
40
|
+
if (tool === 'console') {
|
|
41
|
+
callCount++;
|
|
42
|
+
return consoleResponse(callCount === 1 ? before : after);
|
|
43
|
+
}
|
|
44
|
+
return { content: [{ type: 'text', text: '' }] };
|
|
45
|
+
});
|
|
46
|
+
return { executeToolCall, commandRecorder: {}, connectionReason: 'test', logPrefix: 'test' };
|
|
47
|
+
}
|
|
48
|
+
describe('click validation - console error noise filtering', () => {
|
|
49
|
+
it('suppresses a new error that is purely a favicon 404', async () => {
|
|
50
|
+
const ctx = makeCtx([{ id: 'c-1' }], [{ id: 'c-1' }, { id: 'c-2', url: 'http://localhost:3000/favicon.ico' }]);
|
|
51
|
+
const pre = await capturePreClickState(ctx);
|
|
52
|
+
const result = await validateClickAction(ctx, pre, {}, BASE_CONFIG);
|
|
53
|
+
expect(result.valid).toBe(true);
|
|
54
|
+
expect(result.errors).toEqual([]);
|
|
55
|
+
expect(result.info.some(i => i.includes('unrelated browser noise'))).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it('still fails on a new error unrelated to any known noise pattern', async () => {
|
|
58
|
+
const ctx = makeCtx([{ id: 'c-1' }], [{ id: 'c-1' }, { id: 'c-2', url: 'http://localhost:3000/api/broken' }]);
|
|
59
|
+
const pre = await capturePreClickState(ctx);
|
|
60
|
+
const result = await validateClickAction(ctx, pre, {}, BASE_CONFIG);
|
|
61
|
+
expect(result.valid).toBe(false);
|
|
62
|
+
expect(result.errors[0]).toContain('1 new console error');
|
|
63
|
+
});
|
|
64
|
+
it('still fails when a genuine error accompanies a noise one (mixed)', async () => {
|
|
65
|
+
const ctx = makeCtx([{ id: 'c-1' }], [
|
|
66
|
+
{ id: 'c-1' },
|
|
67
|
+
{ id: 'c-2', url: 'http://localhost:3000/favicon.ico' },
|
|
68
|
+
{ id: 'c-3', url: 'http://localhost:3000/api/broken' },
|
|
69
|
+
]);
|
|
70
|
+
const pre = await capturePreClickState(ctx);
|
|
71
|
+
const result = await validateClickAction(ctx, pre, {}, BASE_CONFIG);
|
|
72
|
+
expect(result.valid).toBe(false);
|
|
73
|
+
expect(result.errors[0]).toContain('2 new console error');
|
|
74
|
+
});
|
|
75
|
+
it('respects consoleErrorsFailMode: warn for a genuine new error', async () => {
|
|
76
|
+
const ctx = makeCtx([{ id: 'c-1' }], [{ id: 'c-1' }, { id: 'c-2', url: 'http://localhost:3000/api/broken' }]);
|
|
77
|
+
const pre = await capturePreClickState(ctx);
|
|
78
|
+
const result = await validateClickAction(ctx, pre, {}, { ...BASE_CONFIG, consoleErrorsFailMode: 'warn' });
|
|
79
|
+
expect(result.valid).toBe(true);
|
|
80
|
+
expect(result.warnings[0]).toContain('1 new console error');
|
|
81
|
+
});
|
|
82
|
+
it('does not report anything when no new errors appear', async () => {
|
|
83
|
+
const ctx = makeCtx([{ id: 'c-1' }], [{ id: 'c-1' }]);
|
|
84
|
+
const pre = await capturePreClickState(ctx);
|
|
85
|
+
const result = await validateClickAction(ctx, pre, {}, BASE_CONFIG);
|
|
86
|
+
expect(result.valid).toBe(true);
|
|
87
|
+
expect(result.errors).toEqual([]);
|
|
88
|
+
expect(result.info).toEqual([]);
|
|
89
|
+
});
|
|
90
|
+
it('a query string on the favicon URL is still recognized as noise', async () => {
|
|
91
|
+
const ctx = makeCtx([{ id: 'c-1' }], [{ id: 'c-1' }, { id: 'c-2', url: 'http://localhost:3000/favicon.ico?v=2' }]);
|
|
92
|
+
const pre = await capturePreClickState(ctx);
|
|
93
|
+
const result = await validateClickAction(ctx, pre, {}, BASE_CONFIG);
|
|
94
|
+
expect(result.valid).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it('a similarly-named but different resource is NOT treated as noise', async () => {
|
|
97
|
+
const ctx = makeCtx([{ id: 'c-1' }], [{ id: 'c-1' }, { id: 'c-2', url: 'http://localhost:3000/api/favicon.ico/details' }]);
|
|
98
|
+
const pre = await capturePreClickState(ctx);
|
|
99
|
+
const result = await validateClickAction(ctx, pre, {}, BASE_CONFIG);
|
|
100
|
+
expect(result.valid).toBe(false);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=click-validation-console-noise.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click-validation-console-noise.test.js","sourceRoot":"","sources":["../../src/tools/click-validation-console-noise.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAG7E,MAAM,WAAW,GAA0B;IACzC,OAAO,EAAE,IAAI;IACb,kBAAkB,EAAE,KAAK;IACzB,iBAAiB,EAAE,KAAK;IACxB,kBAAkB,EAAE,MAAM;IAC1B,mBAAmB,EAAE,IAAI;IACzB,qBAAqB,EAAE,OAAO;IAC9B,sBAAsB,EAAE,KAAK;IAC7B,eAAe,EAAE,MAAM;IACvB,gBAAgB,EAAE,CAAC;CACpB,CAAC;AAIF,SAAS,eAAe,CAAC,OAAgB;IACvC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC9C,KAAK,EAAE;YACL,OAAO,EAAE;gBACP,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;aACvF;SACF;KACF,CAAC;AACJ,CAAC;AAED;gFACgF;AAChF,SAAS,OAAO,CAAC,MAAe,EAAE,KAAc;IAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAY,EAAE,OAA4B,EAAE,EAAE;QAC5F,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,SAAS,EAAE,CAAC;YACZ,OAAO,eAAe,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,EAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACtG,CAAC;AAED,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,OAAO,CACjB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACf,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,mCAAmC,EAAE,CAAC,CACzE,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,GAAG,GAAG,OAAO,CACjB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACf,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,kCAAkC,EAAE,CAAC,CACxE,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,GAAG,GAAG,OAAO,CACjB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACf;YACE,EAAE,EAAE,EAAE,KAAK,EAAE;YACb,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,mCAAmC,EAAE;YACvD,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,kCAAkC,EAAE;SACvD,CACF,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,GAAG,OAAO,CACjB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACf,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,kCAAkC,EAAE,CAAC,CACxE,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,CAAC;QAE1G,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,GAAG,GAAG,OAAO,CACjB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACf,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,uCAAuC,EAAE,CAAC,CAC7E,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,GAAG,GAAG,OAAO,CACjB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EACf,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,+CAA+C,EAAE,CAAC,CACrF,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -24,15 +24,15 @@ export declare function createConsoleTools(puppeteerManager: PuppeteerManager, c
|
|
|
24
24
|
reason: z.ZodOptional<z.ZodString>;
|
|
25
25
|
depth: z.ZodOptional<z.ZodNumber>;
|
|
26
26
|
}, "strict", z.ZodTypeAny, {
|
|
27
|
-
action: "search" | "clear" | "list" | "
|
|
27
|
+
action: "search" | "clear" | "list" | "recent" | "get" | "setObjectDepth";
|
|
28
28
|
connectionReason: string;
|
|
29
29
|
type?: string | undefined;
|
|
30
30
|
id?: string | undefined;
|
|
31
31
|
reason?: string | undefined;
|
|
32
32
|
count?: number | undefined;
|
|
33
33
|
full?: boolean | undefined;
|
|
34
|
-
pattern?: string | undefined;
|
|
35
34
|
limit?: number | undefined;
|
|
35
|
+
pattern?: string | undefined;
|
|
36
36
|
offset?: number | undefined;
|
|
37
37
|
textOffset?: number | undefined;
|
|
38
38
|
textLimit?: number | undefined;
|
|
@@ -40,15 +40,15 @@ export declare function createConsoleTools(puppeteerManager: PuppeteerManager, c
|
|
|
40
40
|
flags?: string | undefined;
|
|
41
41
|
depth?: number | undefined;
|
|
42
42
|
}, {
|
|
43
|
-
action: "search" | "clear" | "list" | "
|
|
43
|
+
action: "search" | "clear" | "list" | "recent" | "get" | "setObjectDepth";
|
|
44
44
|
connectionReason: string;
|
|
45
45
|
type?: string | undefined;
|
|
46
46
|
id?: string | undefined;
|
|
47
47
|
reason?: string | undefined;
|
|
48
48
|
count?: number | undefined;
|
|
49
49
|
full?: boolean | undefined;
|
|
50
|
-
pattern?: string | undefined;
|
|
51
50
|
limit?: number | undefined;
|
|
51
|
+
pattern?: string | undefined;
|
|
52
52
|
offset?: number | undefined;
|
|
53
53
|
textOffset?: number | undefined;
|
|
54
54
|
textLimit?: number | undefined;
|
|
@@ -63,15 +63,15 @@ export declare function createConsoleTools(puppeteerManager: PuppeteerManager, c
|
|
|
63
63
|
} | undefined;
|
|
64
64
|
};
|
|
65
65
|
handler: (args: {
|
|
66
|
-
action: "search" | "clear" | "list" | "
|
|
66
|
+
action: "search" | "clear" | "list" | "recent" | "get" | "setObjectDepth";
|
|
67
67
|
connectionReason: string;
|
|
68
68
|
type?: string | undefined;
|
|
69
69
|
id?: string | undefined;
|
|
70
70
|
reason?: string | undefined;
|
|
71
71
|
count?: number | undefined;
|
|
72
72
|
full?: boolean | undefined;
|
|
73
|
-
pattern?: string | undefined;
|
|
74
73
|
limit?: number | undefined;
|
|
74
|
+
pattern?: string | undefined;
|
|
75
75
|
offset?: number | undefined;
|
|
76
76
|
textOffset?: number | undefined;
|
|
77
77
|
textLimit?: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console-tools.d.ts","sourceRoot":"","sources":["../../src/tools/console-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAwB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"console-tools.d.ts","sourceRoot":"","sources":["../../src/tools/console-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAwB,MAAM,uBAAuB,CAAC;AA+Q7E,wBAAgB,kBAAkB,CAChC,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,cAAc,EAC9B,2BAA2B,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCxE"}
|
|
@@ -91,6 +91,7 @@ function buildListResponse(messages, headerText, action, monitor) {
|
|
|
91
91
|
warnCount: monitor.getCount('warn'),
|
|
92
92
|
truncatedCount,
|
|
93
93
|
totalTokens,
|
|
94
|
+
entries: messages.map(m => ({ id: m.id, type: m.type, ...(m.location?.url && { url: m.location.url }) })),
|
|
94
95
|
},
|
|
95
96
|
},
|
|
96
97
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console-tools.js","sourceRoot":"","sources":["../../src/tools/console-tools.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"console-tools.js","sourceRoot":"","sources":["../../src/tools/console-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,10 +19,10 @@ retryPendingRestart?: (port: number) => void): {
|
|
|
19
19
|
action: z.ZodEnum<["pause", "resume", "stepOver", "stepInto", "stepOut", "acknowledge"]>;
|
|
20
20
|
connectionReason: z.ZodOptional<z.ZodString>;
|
|
21
21
|
}, "strict", z.ZodTypeAny, {
|
|
22
|
-
action: "acknowledge" | "
|
|
22
|
+
action: "acknowledge" | "resume" | "pause" | "stepOver" | "stepInto" | "stepOut";
|
|
23
23
|
connectionReason?: string | undefined;
|
|
24
24
|
}, {
|
|
25
|
-
action: "acknowledge" | "
|
|
25
|
+
action: "acknowledge" | "resume" | "pause" | "stepOver" | "stepInto" | "stepOut";
|
|
26
26
|
connectionReason?: string | undefined;
|
|
27
27
|
}>;
|
|
28
28
|
inputSchema: import("zod-to-json-schema").JsonSchema7Type & {
|
|
@@ -32,7 +32,7 @@ retryPendingRestart?: (port: number) => void): {
|
|
|
32
32
|
} | undefined;
|
|
33
33
|
};
|
|
34
34
|
handler: (args: {
|
|
35
|
-
action: "acknowledge" | "
|
|
35
|
+
action: "acknowledge" | "resume" | "pause" | "stepOver" | "stepInto" | "stepOut";
|
|
36
36
|
connectionReason?: string | undefined;
|
|
37
37
|
}, abortSignal?: AbortSignal) => Promise<any>;
|
|
38
38
|
};
|
|
@@ -74,13 +74,13 @@ export declare function createInputTools(puppeteerManager: PuppeteerManager, cdp
|
|
|
74
74
|
y: number;
|
|
75
75
|
} | undefined;
|
|
76
76
|
x?: number | undefined;
|
|
77
|
-
delay?: number | undefined;
|
|
78
77
|
y?: number | undefined;
|
|
79
78
|
durationMs?: number | undefined;
|
|
80
79
|
from?: {
|
|
81
80
|
x: number;
|
|
82
81
|
y: number;
|
|
83
82
|
} | undefined;
|
|
83
|
+
delay?: number | undefined;
|
|
84
84
|
append?: boolean | undefined;
|
|
85
85
|
handleModals?: boolean | undefined;
|
|
86
86
|
dismissStrategy?: "close" | "remove" | "auto" | "accept" | "reject" | undefined;
|
|
@@ -105,13 +105,13 @@ export declare function createInputTools(puppeteerManager: PuppeteerManager, cdp
|
|
|
105
105
|
y: number;
|
|
106
106
|
} | undefined;
|
|
107
107
|
x?: number | undefined;
|
|
108
|
-
delay?: number | undefined;
|
|
109
108
|
y?: number | undefined;
|
|
110
109
|
durationMs?: number | undefined;
|
|
111
110
|
from?: {
|
|
112
111
|
x: number;
|
|
113
112
|
y: number;
|
|
114
113
|
} | undefined;
|
|
114
|
+
delay?: number | undefined;
|
|
115
115
|
append?: boolean | undefined;
|
|
116
116
|
handleModals?: boolean | undefined;
|
|
117
117
|
dismissStrategy?: "close" | "remove" | "auto" | "accept" | "reject" | undefined;
|
|
@@ -143,13 +143,13 @@ export declare function createInputTools(puppeteerManager: PuppeteerManager, cdp
|
|
|
143
143
|
y: number;
|
|
144
144
|
} | undefined;
|
|
145
145
|
x?: number | undefined;
|
|
146
|
-
delay?: number | undefined;
|
|
147
146
|
y?: number | undefined;
|
|
148
147
|
durationMs?: number | undefined;
|
|
149
148
|
from?: {
|
|
150
149
|
x: number;
|
|
151
150
|
y: number;
|
|
152
151
|
} | undefined;
|
|
152
|
+
delay?: number | undefined;
|
|
153
153
|
append?: boolean | undefined;
|
|
154
154
|
handleModals?: boolean | undefined;
|
|
155
155
|
dismissStrategy?: "close" | "remove" | "auto" | "accept" | "reject" | undefined;
|
|
@@ -46,41 +46,41 @@ export declare function createInspectionTools(cdpManager: CDPManager, sourceMapH
|
|
|
46
46
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
47
47
|
functionName: z.ZodOptional<z.ZodString>;
|
|
48
48
|
}, "strict", z.ZodTypeAny, {
|
|
49
|
-
action: "
|
|
49
|
+
action: "evaluateExpression" | "getCallStack" | "getVariables" | "searchCode" | "searchFunctions";
|
|
50
50
|
filter?: string | undefined;
|
|
51
51
|
awaitPromise?: boolean | undefined;
|
|
52
52
|
expression?: string | undefined;
|
|
53
|
-
functionName?: string | undefined;
|
|
54
53
|
connectionReason?: string | undefined;
|
|
55
54
|
callFrameId?: string | undefined;
|
|
55
|
+
functionName?: string | undefined;
|
|
56
|
+
limit?: number | undefined;
|
|
57
|
+
saveAs?: string | undefined;
|
|
58
|
+
pattern?: string | undefined;
|
|
56
59
|
includeGlobal?: boolean | undefined;
|
|
57
60
|
expandObjects?: boolean | undefined;
|
|
58
61
|
maxDepth?: number | undefined;
|
|
59
62
|
maxTokens?: number | undefined;
|
|
60
|
-
saveAs?: string | undefined;
|
|
61
|
-
pattern?: string | undefined;
|
|
62
63
|
caseSensitive?: boolean | undefined;
|
|
63
64
|
isRegex?: boolean | undefined;
|
|
64
65
|
urlFilter?: string | undefined;
|
|
65
|
-
limit?: number | undefined;
|
|
66
66
|
}, {
|
|
67
|
-
action: "
|
|
67
|
+
action: "evaluateExpression" | "getCallStack" | "getVariables" | "searchCode" | "searchFunctions";
|
|
68
68
|
filter?: string | undefined;
|
|
69
69
|
awaitPromise?: boolean | undefined;
|
|
70
70
|
expression?: string | undefined;
|
|
71
|
-
functionName?: string | undefined;
|
|
72
71
|
connectionReason?: string | undefined;
|
|
73
72
|
callFrameId?: string | undefined;
|
|
73
|
+
functionName?: string | undefined;
|
|
74
|
+
limit?: number | undefined;
|
|
75
|
+
saveAs?: string | undefined;
|
|
76
|
+
pattern?: string | undefined;
|
|
74
77
|
includeGlobal?: boolean | undefined;
|
|
75
78
|
expandObjects?: boolean | undefined;
|
|
76
79
|
maxDepth?: number | undefined;
|
|
77
80
|
maxTokens?: number | undefined;
|
|
78
|
-
saveAs?: string | undefined;
|
|
79
|
-
pattern?: string | undefined;
|
|
80
81
|
caseSensitive?: boolean | undefined;
|
|
81
82
|
isRegex?: boolean | undefined;
|
|
82
83
|
urlFilter?: string | undefined;
|
|
83
|
-
limit?: number | undefined;
|
|
84
84
|
}>;
|
|
85
85
|
inputSchema: import("zod-to-json-schema").JsonSchema7Type & {
|
|
86
86
|
$schema?: string | undefined;
|
|
@@ -89,23 +89,23 @@ export declare function createInspectionTools(cdpManager: CDPManager, sourceMapH
|
|
|
89
89
|
} | undefined;
|
|
90
90
|
};
|
|
91
91
|
handler: (args: {
|
|
92
|
-
action: "
|
|
92
|
+
action: "evaluateExpression" | "getCallStack" | "getVariables" | "searchCode" | "searchFunctions";
|
|
93
93
|
filter?: string | undefined;
|
|
94
94
|
awaitPromise?: boolean | undefined;
|
|
95
95
|
expression?: string | undefined;
|
|
96
|
-
functionName?: string | undefined;
|
|
97
96
|
connectionReason?: string | undefined;
|
|
98
97
|
callFrameId?: string | undefined;
|
|
98
|
+
functionName?: string | undefined;
|
|
99
|
+
limit?: number | undefined;
|
|
100
|
+
saveAs?: string | undefined;
|
|
101
|
+
pattern?: string | undefined;
|
|
99
102
|
includeGlobal?: boolean | undefined;
|
|
100
103
|
expandObjects?: boolean | undefined;
|
|
101
104
|
maxDepth?: number | undefined;
|
|
102
105
|
maxTokens?: number | undefined;
|
|
103
|
-
saveAs?: string | undefined;
|
|
104
|
-
pattern?: string | undefined;
|
|
105
106
|
caseSensitive?: boolean | undefined;
|
|
106
107
|
isRegex?: boolean | undefined;
|
|
107
108
|
urlFilter?: string | undefined;
|
|
108
|
-
limit?: number | undefined;
|
|
109
109
|
}, abortSignal?: AbortSignal) => Promise<any>;
|
|
110
110
|
};
|
|
111
111
|
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inverse of interpolation.ts: given values a `saveAs` step already
|
|
3
|
+
* captured earlier in the same history, find literal values in a later
|
|
4
|
+
* step's params that came from those captures and rewrite them back to
|
|
5
|
+
* `{{var:name.path}}` tokens - what a person hand-templatizing a recorded
|
|
6
|
+
* sequence does today (see references/sequences.md).
|
|
7
|
+
*
|
|
8
|
+
* Two match shapes, both driven by exact string/number equality (never
|
|
9
|
+
* fuzzy): a param leaf whose ENTIRE value equals a captured value anywhere
|
|
10
|
+
* in its tree, and a captured value appearing as a SUBSTRING inside a larger
|
|
11
|
+
* string leaf (e.g. an id embedded in a CSS selector). The substring case is
|
|
12
|
+
* pattern-matching inside arbitrary text, so it additionally guards against
|
|
13
|
+
* common short values (small numbers, HTTP-status-shaped numbers, booleans)
|
|
14
|
+
* that would otherwise false-positive against unrelated params.
|
|
15
|
+
*/
|
|
16
|
+
export interface CaptureEntry {
|
|
17
|
+
name: string;
|
|
18
|
+
value: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Rewrite literal values in `params` that match an earlier `saveAs` capture
|
|
22
|
+
* back into `{{var:name.path}}` references. `captures` must only contain
|
|
23
|
+
* steps that precede this one in the sequence being built.
|
|
24
|
+
*/
|
|
25
|
+
export declare function substituteCapturedValues(params: Record<string, any>, captures: CaptureEntry[]): Record<string, any>;
|
|
26
|
+
//# sourceMappingURL=interpolation-reverse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolation-reverse.d.ts","sourceRoot":"","sources":["../../src/tools/interpolation-reverse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAwGD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAGnH"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inverse of interpolation.ts: given values a `saveAs` step already
|
|
3
|
+
* captured earlier in the same history, find literal values in a later
|
|
4
|
+
* step's params that came from those captures and rewrite them back to
|
|
5
|
+
* `{{var:name.path}}` tokens - what a person hand-templatizing a recorded
|
|
6
|
+
* sequence does today (see references/sequences.md).
|
|
7
|
+
*
|
|
8
|
+
* Two match shapes, both driven by exact string/number equality (never
|
|
9
|
+
* fuzzy): a param leaf whose ENTIRE value equals a captured value anywhere
|
|
10
|
+
* in its tree, and a captured value appearing as a SUBSTRING inside a larger
|
|
11
|
+
* string leaf (e.g. an id embedded in a CSS selector). The substring case is
|
|
12
|
+
* pattern-matching inside arbitrary text, so it additionally guards against
|
|
13
|
+
* common short values (small numbers, HTTP-status-shaped numbers, booleans)
|
|
14
|
+
* that would otherwise false-positive against unrelated params.
|
|
15
|
+
*/
|
|
16
|
+
const MAX_DEPTH = 6;
|
|
17
|
+
/** Whole-value match: any string/number, however short - it's an exact
|
|
18
|
+
* equality on the ENTIRE leaf, not a substring, so the false-positive risk
|
|
19
|
+
* a length floor exists to prevent doesn't apply here. */
|
|
20
|
+
const MIN_WHOLE_STRING_LEN = 1;
|
|
21
|
+
/** Substring match: a captured value gets pattern-matched against arbitrary
|
|
22
|
+
* text, so short/common values need a floor - "2" appearing inside a
|
|
23
|
+
* string is not evidence it came from a capture. */
|
|
24
|
+
const MIN_EMBED_LEN = 4;
|
|
25
|
+
/** Numbers common enough by coincidence (HTTP statuses, small counters,
|
|
26
|
+
* booleans-as-0/1) that matching them proves nothing about provenance. */
|
|
27
|
+
const COMMON_NUMBER_BLOCKLIST = new Set([
|
|
28
|
+
0, 1, 2, 3, 4, 5, 10, 100,
|
|
29
|
+
200, 201, 202, 204, 301, 302, 304, 400, 401, 403, 404, 405, 409, 422, 429, 500, 502, 503, 504,
|
|
30
|
+
]);
|
|
31
|
+
function isSubstitutableNumber(n) {
|
|
32
|
+
return Number.isFinite(n) && !COMMON_NUMBER_BLOCKLIST.has(n);
|
|
33
|
+
}
|
|
34
|
+
/** DFS for a path to a leaf inside `tree` that strictly equals `target`. */
|
|
35
|
+
function findPath(tree, target, path = [], depth = 0) {
|
|
36
|
+
if (tree === target)
|
|
37
|
+
return path;
|
|
38
|
+
if (depth >= MAX_DEPTH || tree === null || typeof tree !== 'object')
|
|
39
|
+
return null;
|
|
40
|
+
for (const key of Object.keys(tree)) {
|
|
41
|
+
const found = findPath(tree[key], target, [...path, key], depth + 1);
|
|
42
|
+
if (found)
|
|
43
|
+
return found;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function pathToVarToken(name, path) {
|
|
48
|
+
let out = name;
|
|
49
|
+
for (const seg of path) {
|
|
50
|
+
out += /^[^.[\]]+$/.test(seg) ? `.${seg}` : `['${seg}']`;
|
|
51
|
+
}
|
|
52
|
+
return `{{var:${out}}}`;
|
|
53
|
+
}
|
|
54
|
+
/** Try a whole-leaf match (the entire param value equals a captured value). */
|
|
55
|
+
function matchWhole(value, captures) {
|
|
56
|
+
if (typeof value === 'string' && value.length < MIN_WHOLE_STRING_LEN)
|
|
57
|
+
return null;
|
|
58
|
+
if (typeof value === 'number' && !isSubstitutableNumber(value))
|
|
59
|
+
return null;
|
|
60
|
+
for (const capture of captures) {
|
|
61
|
+
const path = findPath(capture.value, value);
|
|
62
|
+
if (path)
|
|
63
|
+
return pathToVarToken(capture.name, path);
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
function collectLeaves(tree, path = [], depth = 0, out = []) {
|
|
68
|
+
if (depth >= MAX_DEPTH || tree === null || tree === undefined)
|
|
69
|
+
return out;
|
|
70
|
+
if (typeof tree === 'string') {
|
|
71
|
+
if (tree.length >= MIN_EMBED_LEN)
|
|
72
|
+
out.push({ path, str: tree });
|
|
73
|
+
}
|
|
74
|
+
else if (typeof tree === 'number') {
|
|
75
|
+
if (isSubstitutableNumber(tree) && String(tree).length >= MIN_EMBED_LEN)
|
|
76
|
+
out.push({ path, str: String(tree) });
|
|
77
|
+
}
|
|
78
|
+
else if (typeof tree === 'object') {
|
|
79
|
+
for (const key of Object.keys(tree)) {
|
|
80
|
+
collectLeaves(tree[key], [...path, key], depth + 1, out);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
/** Replace every occurrence of a capture's leaf values inside `str`, longest
|
|
86
|
+
* match first so a longer id doesn't get partially clobbered by a shorter
|
|
87
|
+
* one nested inside it. */
|
|
88
|
+
function substituteEmbedded(str, capture) {
|
|
89
|
+
const leaves = collectLeaves(capture.value).sort((a, b) => b.str.length - a.str.length);
|
|
90
|
+
let result = str;
|
|
91
|
+
for (const leaf of leaves) {
|
|
92
|
+
if (result.includes(leaf.str)) {
|
|
93
|
+
result = result.split(leaf.str).join(pathToVarToken(capture.name, leaf.path));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
function walk(value, captures) {
|
|
99
|
+
if (Array.isArray(value))
|
|
100
|
+
return value.map(item => walk(item, captures));
|
|
101
|
+
if (value !== null && typeof value === 'object') {
|
|
102
|
+
const out = {};
|
|
103
|
+
for (const key of Object.keys(value))
|
|
104
|
+
out[key] = walk(value[key], captures);
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
108
|
+
const whole = matchWhole(value, captures);
|
|
109
|
+
if (whole)
|
|
110
|
+
return whole;
|
|
111
|
+
if (typeof value === 'string') {
|
|
112
|
+
let result = value;
|
|
113
|
+
for (const capture of captures)
|
|
114
|
+
result = substituteEmbedded(result, capture);
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Rewrite literal values in `params` that match an earlier `saveAs` capture
|
|
122
|
+
* back into `{{var:name.path}}` references. `captures` must only contain
|
|
123
|
+
* steps that precede this one in the sequence being built.
|
|
124
|
+
*/
|
|
125
|
+
export function substituteCapturedValues(params, captures) {
|
|
126
|
+
if (captures.length === 0)
|
|
127
|
+
return params;
|
|
128
|
+
return walk(params, captures);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=interpolation-reverse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolation-reverse.js","sourceRoot":"","sources":["../../src/tools/interpolation-reverse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolation-reverse.test.d.ts","sourceRoot":"","sources":["../../src/tools/interpolation-reverse.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { substituteCapturedValues } from './interpolation-reverse.js';
|
|
3
|
+
import { interpolateParams } from './interpolation.js';
|
|
4
|
+
describe('substituteCapturedValues', () => {
|
|
5
|
+
it('rewrites a whole-value literal that matches a captured value', () => {
|
|
6
|
+
const captures = [
|
|
7
|
+
{ name: 'mint', value: { ok: true, status: 200, body: { url: 'https://app.test/mint/abc123def' } } },
|
|
8
|
+
];
|
|
9
|
+
const params = { action: 'goto', url: 'https://app.test/mint/abc123def' };
|
|
10
|
+
expect(substituteCapturedValues(params, captures)).toEqual({
|
|
11
|
+
action: 'goto',
|
|
12
|
+
url: '{{var:mint.body.url}}',
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
it('rewrites a literal embedded inside a larger string (e.g. a CSS selector)', () => {
|
|
16
|
+
const captures = [{ name: 'personId', value: 48213 }];
|
|
17
|
+
const params = { selector: '[data-row-key="48213"]' };
|
|
18
|
+
expect(substituteCapturedValues(params, captures)).toEqual({
|
|
19
|
+
selector: '[data-row-key="{{var:personId}}"]',
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
it('emits a bare {{var:name}} token when the capture itself is the leaf (no nesting)', () => {
|
|
23
|
+
const captures = [{ name: 'personId', value: 48213 }];
|
|
24
|
+
const params = { id: 48213 };
|
|
25
|
+
expect(substituteCapturedValues(params, captures)).toEqual({ id: '{{var:personId}}' });
|
|
26
|
+
});
|
|
27
|
+
it('does not substitute a small/common number even if it exactly matches a capture', () => {
|
|
28
|
+
const captures = [{ name: 'mint', value: { status: 200 } }];
|
|
29
|
+
const params = { retryStatus: 200 };
|
|
30
|
+
expect(substituteCapturedValues(params, captures)).toEqual({ retryStatus: 200 });
|
|
31
|
+
});
|
|
32
|
+
it('does not substitute booleans', () => {
|
|
33
|
+
const captures = [{ name: 'mint', value: { ok: true } }];
|
|
34
|
+
const params = { enabled: true };
|
|
35
|
+
expect(substituteCapturedValues(params, captures)).toEqual({ enabled: true });
|
|
36
|
+
});
|
|
37
|
+
it('does not substitute a short embedded value below the length floor', () => {
|
|
38
|
+
const captures = [{ name: 'code', value: 'ab' }];
|
|
39
|
+
const params = { path: '/x/ab/y' };
|
|
40
|
+
expect(substituteCapturedValues(params, captures)).toEqual({ path: '/x/ab/y' });
|
|
41
|
+
});
|
|
42
|
+
it('leaves unrelated literals untouched', () => {
|
|
43
|
+
const captures = [{ name: 'mint', value: { body: { url: 'https://app.test/mint/abc123def' } } }];
|
|
44
|
+
const params = { action: 'goto', url: 'https://app.test/other-page' };
|
|
45
|
+
expect(substituteCapturedValues(params, captures)).toEqual(params);
|
|
46
|
+
});
|
|
47
|
+
it('walks arrays and nested objects', () => {
|
|
48
|
+
const captures = [{ name: 'personId', value: 48213 }];
|
|
49
|
+
const params = { rows: [{ id: 48213 }, { id: 999999 }] };
|
|
50
|
+
expect(substituteCapturedValues(params, captures)).toEqual({
|
|
51
|
+
rows: [{ id: '{{var:personId}}' }, { id: 999999 }],
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
it('prefers the earliest capture on a value collision', () => {
|
|
55
|
+
const captures = [
|
|
56
|
+
{ name: 'first', value: 'shared-value-123' },
|
|
57
|
+
{ name: 'second', value: 'shared-value-123' },
|
|
58
|
+
];
|
|
59
|
+
const params = { x: 'shared-value-123' };
|
|
60
|
+
expect(substituteCapturedValues(params, captures)).toEqual({ x: '{{var:first}}' });
|
|
61
|
+
});
|
|
62
|
+
it('is a no-op with no captures', () => {
|
|
63
|
+
const params = { url: 'https://app.test/mint/abc123def' };
|
|
64
|
+
expect(substituteCapturedValues(params, [])).toBe(params);
|
|
65
|
+
});
|
|
66
|
+
it('produces tokens that interpolateParams resolves back to the original value', () => {
|
|
67
|
+
const captures = [
|
|
68
|
+
{ name: 'mint', value: { ok: true, status: 200, body: { url: 'https://app.test/mint/abc123def' } } },
|
|
69
|
+
];
|
|
70
|
+
const params = { url: 'https://app.test/mint/abc123def' };
|
|
71
|
+
const substituted = substituteCapturedValues(params, captures);
|
|
72
|
+
const store = { mint: captures[0].value };
|
|
73
|
+
expect(interpolateParams(substituted, store, 0).url).toBe('https://app.test/mint/abc123def');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=interpolation-reverse.test.js.map
|