@sudobility/testomniac_runner_service 0.1.140 → 0.1.145

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 (102) hide show
  1. package/CLAUDE.md +35 -24
  2. package/dist/adapter.d.ts +12 -0
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/analyzer/page-analyzer/index.d.ts +4 -154
  5. package/dist/analyzer/page-analyzer/index.d.ts.map +1 -1
  6. package/dist/analyzer/page-analyzer/index.js +112 -2535
  7. package/dist/analyzer/page-analyzer/index.js.map +1 -1
  8. package/dist/analyzer/page-analyzer/types.d.ts +0 -1
  9. package/dist/analyzer/page-analyzer/types.d.ts.map +1 -1
  10. package/dist/api/client.d.ts +4 -7
  11. package/dist/api/client.d.ts.map +1 -1
  12. package/dist/api/client.js +6 -22
  13. package/dist/api/client.js.map +1 -1
  14. package/dist/browser/network-idle.d.ts +37 -0
  15. package/dist/browser/network-idle.d.ts.map +1 -0
  16. package/dist/browser/network-idle.js +72 -0
  17. package/dist/browser/network-idle.js.map +1 -0
  18. package/dist/index.d.ts +1 -4
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -5
  21. package/dist/index.js.map +1 -1
  22. package/dist/orchestrator/login-manager.d.ts +2 -11
  23. package/dist/orchestrator/login-manager.d.ts.map +1 -1
  24. package/dist/orchestrator/login-manager.js.map +1 -1
  25. package/dist/orchestrator/runner.d.ts.map +1 -1
  26. package/dist/orchestrator/runner.js +23 -8
  27. package/dist/orchestrator/runner.js.map +1 -1
  28. package/dist/orchestrator/settle-for-read.d.ts +9 -0
  29. package/dist/orchestrator/settle-for-read.d.ts.map +1 -0
  30. package/dist/orchestrator/settle-for-read.js +10 -0
  31. package/dist/orchestrator/settle-for-read.js.map +1 -0
  32. package/dist/orchestrator/test-interaction-executor.d.ts.map +1 -1
  33. package/dist/orchestrator/test-interaction-executor.js +84 -88
  34. package/dist/orchestrator/test-interaction-executor.js.map +1 -1
  35. package/dist/scanner/login-detector.d.ts +2 -14
  36. package/dist/scanner/login-detector.d.ts.map +1 -1
  37. package/dist/scanner/login-detector.js.map +1 -1
  38. package/package.json +4 -18
  39. package/dist/ai/analyzer.d.ts +0 -17
  40. package/dist/ai/analyzer.d.ts.map +0 -1
  41. package/dist/ai/analyzer.js +0 -55
  42. package/dist/ai/analyzer.js.map +0 -1
  43. package/dist/ai/input-generator.d.ts +0 -9
  44. package/dist/ai/input-generator.d.ts.map +0 -1
  45. package/dist/ai/input-generator.js +0 -20
  46. package/dist/ai/input-generator.js.map +0 -1
  47. package/dist/ai/persona-generator.d.ts +0 -7
  48. package/dist/ai/persona-generator.d.ts.map +0 -1
  49. package/dist/ai/persona-generator.js +0 -23
  50. package/dist/ai/persona-generator.js.map +0 -1
  51. package/dist/ai/use-case-generator.d.ts +0 -7
  52. package/dist/ai/use-case-generator.d.ts.map +0 -1
  53. package/dist/ai/use-case-generator.js +0 -23
  54. package/dist/ai/use-case-generator.js.map +0 -1
  55. package/dist/analyzer/page-analyzer/generators/content.d.ts +0 -4
  56. package/dist/analyzer/page-analyzer/generators/content.d.ts.map +0 -1
  57. package/dist/analyzer/page-analyzer/generators/content.js +0 -63
  58. package/dist/analyzer/page-analyzer/generators/content.js.map +0 -1
  59. package/dist/analyzer/page-analyzer/generators/dialogs.d.ts +0 -4
  60. package/dist/analyzer/page-analyzer/generators/dialogs.d.ts.map +0 -1
  61. package/dist/analyzer/page-analyzer/generators/dialogs.js +0 -46
  62. package/dist/analyzer/page-analyzer/generators/dialogs.js.map +0 -1
  63. package/dist/analyzer/page-analyzer/generators/e2e.d.ts +0 -4
  64. package/dist/analyzer/page-analyzer/generators/e2e.d.ts.map +0 -1
  65. package/dist/analyzer/page-analyzer/generators/e2e.js +0 -37
  66. package/dist/analyzer/page-analyzer/generators/e2e.js.map +0 -1
  67. package/dist/analyzer/page-analyzer/generators/forms.d.ts +0 -4
  68. package/dist/analyzer/page-analyzer/generators/forms.d.ts.map +0 -1
  69. package/dist/analyzer/page-analyzer/generators/forms.js +0 -95
  70. package/dist/analyzer/page-analyzer/generators/forms.js.map +0 -1
  71. package/dist/analyzer/page-analyzer/generators/hover-follow-up.d.ts +0 -4
  72. package/dist/analyzer/page-analyzer/generators/hover-follow-up.d.ts.map +0 -1
  73. package/dist/analyzer/page-analyzer/generators/hover-follow-up.js +0 -140
  74. package/dist/analyzer/page-analyzer/generators/hover-follow-up.js.map +0 -1
  75. package/dist/analyzer/page-analyzer/generators/keyboard-disclosure.d.ts +0 -4
  76. package/dist/analyzer/page-analyzer/generators/keyboard-disclosure.d.ts.map +0 -1
  77. package/dist/analyzer/page-analyzer/generators/keyboard-disclosure.js +0 -61
  78. package/dist/analyzer/page-analyzer/generators/keyboard-disclosure.js.map +0 -1
  79. package/dist/analyzer/page-analyzer/generators/login.d.ts +0 -15
  80. package/dist/analyzer/page-analyzer/generators/login.d.ts.map +0 -1
  81. package/dist/analyzer/page-analyzer/generators/login.js +0 -218
  82. package/dist/analyzer/page-analyzer/generators/login.js.map +0 -1
  83. package/dist/analyzer/page-analyzer/generators/navigation.d.ts +0 -15
  84. package/dist/analyzer/page-analyzer/generators/navigation.d.ts.map +0 -1
  85. package/dist/analyzer/page-analyzer/generators/navigation.js +0 -165
  86. package/dist/analyzer/page-analyzer/generators/navigation.js.map +0 -1
  87. package/dist/analyzer/page-analyzer/generators/render.d.ts +0 -4
  88. package/dist/analyzer/page-analyzer/generators/render.d.ts.map +0 -1
  89. package/dist/analyzer/page-analyzer/generators/render.js +0 -31
  90. package/dist/analyzer/page-analyzer/generators/render.js.map +0 -1
  91. package/dist/analyzer/page-analyzer/generators/scaffolds.d.ts +0 -4
  92. package/dist/analyzer/page-analyzer/generators/scaffolds.d.ts.map +0 -1
  93. package/dist/analyzer/page-analyzer/generators/scaffolds.js +0 -64
  94. package/dist/analyzer/page-analyzer/generators/scaffolds.js.map +0 -1
  95. package/dist/analyzer/page-analyzer/generators/semantic-journeys.d.ts +0 -4
  96. package/dist/analyzer/page-analyzer/generators/semantic-journeys.d.ts.map +0 -1
  97. package/dist/analyzer/page-analyzer/generators/semantic-journeys.js +0 -37
  98. package/dist/analyzer/page-analyzer/generators/semantic-journeys.js.map +0 -1
  99. package/dist/analyzer/page-analyzer/generators/variants.d.ts +0 -4
  100. package/dist/analyzer/page-analyzer/generators/variants.d.ts.map +0 -1
  101. package/dist/analyzer/page-analyzer/generators/variants.js +0 -60
  102. package/dist/analyzer/page-analyzer/generators/variants.js.map +0 -1
@@ -1,55 +0,0 @@
1
- import { generatePersonas } from "./persona-generator";
2
- import { generateUseCases } from "./use-case-generator";
3
- import { generateInputValues } from "./input-generator";
4
- export async function runAiAnalysis(options) {
5
- const { runnerId, productId, forms, openaiClient: client, api } = options;
6
- const pages = await api.getPagesByRunner(runnerId);
7
- const pageContents = [];
8
- for (const page of pages) {
9
- const states = await api.getPageStates(page.id);
10
- for (const state of states) {
11
- if (state.contentText && state.contentText.trim().length > 50) {
12
- pageContents.push(`[${page.relativePath}]\n${state.contentText.slice(0, 1000)}`);
13
- }
14
- }
15
- }
16
- if (pageContents.length === 0)
17
- return;
18
- const summaryResponse = await client.chat.completions.create({
19
- model: "gpt-4o",
20
- messages: [
21
- {
22
- role: "user",
23
- content: `Summarize this website in 2-3 sentences based on these page contents:\n\n${pageContents
24
- .slice(0, 5)
25
- .map(c => c.slice(0, 500))
26
- .join("\n\n")}`,
27
- },
28
- ],
29
- temperature: 0.3,
30
- });
31
- const siteSummary = summaryResponse.choices[0].message.content || "Unknown website";
32
- const personaResults = await generatePersonas(client, siteSummary, pageContents);
33
- const personaNames = [];
34
- const useCaseNames = [];
35
- for (const pr of personaResults) {
36
- const persona = await api.createPersona(productId, pr.name, pr.description);
37
- personaNames.push(pr.name);
38
- const ucResults = await generateUseCases(client, pr.name, pr.description, siteSummary, pageContents);
39
- for (const ucr of ucResults) {
40
- const useCase = await api.createUseCase(persona.id, ucr.name, ucr.description);
41
- useCaseNames.push(ucr.name);
42
- for (const form of forms) {
43
- const textFields = form.fields.filter(f => ["text", "email", "tel", "url", "search", "textarea"].includes(f.type));
44
- if (textFields.length === 0)
45
- continue;
46
- const ivResults = await generateInputValues(client, pr.name, ucr.name, textFields);
47
- for (const iv of ivResults) {
48
- await api.createInputValue(useCase.id, iv.fieldSelector, iv.fieldName, iv.value);
49
- }
50
- }
51
- }
52
- }
53
- options.onComplete?.(personaNames, useCaseNames);
54
- }
55
- //# sourceMappingURL=analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/ai/analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type OpenAI from "openai";
2
- import type { FormField } from "../domain/types";
3
- export interface InputValueResult {
4
- fieldSelector: string;
5
- fieldName: string;
6
- value: string;
7
- }
8
- export declare function generateInputValues(client: OpenAI, personaName: string, useCaseName: string, fields: FormField[]): Promise<InputValueResult[]>;
9
- //# sourceMappingURL=input-generator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input-generator.d.ts","sourceRoot":"","sources":["../../src/ai/input-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,EAAE,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB7B"}
@@ -1,20 +0,0 @@
1
- export async function generateInputValues(client, personaName, useCaseName, fields) {
2
- const fieldDescriptions = fields
3
- .map(f => `selector: "${f.selector}", name: "${f.name}", type: "${f.type}", label: "${f.label}", required: ${f.required}${f.options ? `, options: [${f.options.join(", ")}]` : ""}`)
4
- .join("\n");
5
- const prompt = `For the persona "${personaName}" performing the use case "${useCaseName}", generate realistic form input values for these fields:
6
-
7
- ${fieldDescriptions}
8
-
9
- Respond with a JSON object with a "values" key containing an array of objects with "fieldSelector", "fieldName", and "value" fields. Use realistic data appropriate for this persona and use case.`;
10
- const response = await client.chat.completions.create({
11
- model: "gpt-4o",
12
- messages: [{ role: "user", content: prompt }],
13
- response_format: { type: "json_object" },
14
- temperature: 0.3,
15
- });
16
- const content = response.choices[0].message.content || '{"values":[]}';
17
- const parsed = JSON.parse(content);
18
- return parsed.values || parsed.inputValues || [];
19
- }
20
- //# sourceMappingURL=input-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input-generator.js","sourceRoot":"","sources":["../../src/ai/input-generator.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,WAAmB,EACnB,WAAmB,EACnB,MAAmB;IAEnB,MAAM,iBAAiB,GAAG,MAAM;SAC7B,GAAG,CACF,CAAC,CAAC,EAAE,CACF,cAAc,CAAC,CAAC,QAAQ,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5K;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,oBAAoB,WAAW,8BAA8B,WAAW;;EAEvF,iBAAiB;;mMAEgL,CAAC;IAElM,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACpD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7C,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;QACxC,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;AACnD,CAAC"}
@@ -1,7 +0,0 @@
1
- import type OpenAI from "openai";
2
- export interface PersonaResult {
3
- name: string;
4
- description: string;
5
- }
6
- export declare function generatePersonas(client: OpenAI, siteSummary: string, pageContents: string[]): Promise<PersonaResult[]>;
7
- //# sourceMappingURL=persona-generator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona-generator.d.ts","sourceRoot":"","sources":["../../src/ai/persona-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAuB1B"}
@@ -1,23 +0,0 @@
1
- export async function generatePersonas(client, siteSummary, pageContents) {
2
- const prompt = `You are analyzing a website. Based on the following site content, identify the distinct types of users (personas) who would use this site. For each persona, provide a name and a brief description.
3
-
4
- Site summary: ${siteSummary}
5
-
6
- Page contents (sampled):
7
- ${pageContents
8
- .slice(0, 10)
9
- .map((c, i) => `Page ${i + 1}: ${c.slice(0, 500)}`)
10
- .join("\n\n")}
11
-
12
- Respond with a JSON object with a "personas" key containing an array of objects with "name" and "description" fields. Minimum 1 persona, maximum 5.`;
13
- const response = await client.chat.completions.create({
14
- model: "gpt-4o",
15
- messages: [{ role: "user", content: prompt }],
16
- response_format: { type: "json_object" },
17
- temperature: 0.3,
18
- });
19
- const content = response.choices[0].message.content || '{"personas":[]}';
20
- const parsed = JSON.parse(content);
21
- return parsed.personas || [];
22
- }
23
- //# sourceMappingURL=persona-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona-generator.js","sourceRoot":"","sources":["../../src/ai/persona-generator.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,WAAmB,EACnB,YAAsB;IAEtB,MAAM,MAAM,GAAG;;gBAED,WAAW;;;EAGzB,YAAY;SACX,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;SAClD,IAAI,CAAC,MAAM,CAAC;;oJAEqI,CAAC;IAEnJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACpD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7C,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;QACxC,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC/B,CAAC"}
@@ -1,7 +0,0 @@
1
- import type OpenAI from "openai";
2
- export interface UseCaseResult {
3
- name: string;
4
- description: string;
5
- }
6
- export declare function generateUseCases(client: OpenAI, personaName: string, personaDescription: string, siteSummary: string, pageContents: string[]): Promise<UseCaseResult[]>;
7
- //# sourceMappingURL=use-case-generator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-case-generator.d.ts","sourceRoot":"","sources":["../../src/ai/use-case-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAC1B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAuB1B"}
@@ -1,23 +0,0 @@
1
- export async function generateUseCases(client, personaName, personaDescription, siteSummary, pageContents) {
2
- const prompt = `For the persona "${personaName}" (${personaDescription}) on this website, identify specific use cases — goals this user would try to accomplish.
3
-
4
- Site summary: ${siteSummary}
5
-
6
- Pages available:
7
- ${pageContents
8
- .slice(0, 10)
9
- .map((c, i) => `Page ${i + 1}: ${c.slice(0, 300)}`)
10
- .join("\n\n")}
11
-
12
- Respond with a JSON object with a "useCases" key containing an array of objects with "name" and "description" fields. 2-8 use cases.`;
13
- const response = await client.chat.completions.create({
14
- model: "gpt-4o",
15
- messages: [{ role: "user", content: prompt }],
16
- response_format: { type: "json_object" },
17
- temperature: 0.3,
18
- });
19
- const content = response.choices[0].message.content || '{"useCases":[]}';
20
- const parsed = JSON.parse(content);
21
- return parsed.useCases || parsed.use_cases || [];
22
- }
23
- //# sourceMappingURL=use-case-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-case-generator.js","sourceRoot":"","sources":["../../src/ai/use-case-generator.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,WAAmB,EACnB,kBAA0B,EAC1B,WAAmB,EACnB,YAAsB;IAEtB,MAAM,MAAM,GAAG,oBAAoB,WAAW,MAAM,kBAAkB;;gBAExD,WAAW;;;EAGzB,YAAY;SACX,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;SAClD,IAAI,CAAC,MAAM,CAAC;;qIAEsH,CAAC;IAEpI,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACpD,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7C,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;QACxC,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;AACnD,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { GeneratorOutput } from "@sudobility/testomniac_types";
2
- import type { AnalyzerContext } from "../types";
3
- export declare function generateContentTestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=content.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,+BAA+B,CACnD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CA6F1B"}
@@ -1,63 +0,0 @@
1
- import { buildReplaySelectorFromActionableItem } from "../../../browser/replay-selector";
2
- export async function generateContentTestInteractions(analyzer, context) {
3
- const { runnerId, testEnvironmentId, sizeClass, uid } = context;
4
- const contentItems = analyzer.selectRepresentativeItems(context.actionableItems.filter((item) => item.scaffoldId == null && analyzer.isSurfaceCandidate(item)));
5
- const surfaceTitle = `Page: ${context.currentPath}`;
6
- if (contentItems.length === 0) {
7
- return {
8
- creates: [],
9
- reconciles: [
10
- {
11
- surfaceTitle,
12
- desiredKeys: [],
13
- dependencyTestInteractionId: context.currentTestInteractionId,
14
- },
15
- ],
16
- };
17
- }
18
- const desiredKeys = [];
19
- const batchItems = [];
20
- for (const item of contentItems) {
21
- // Skip interactions for shared layout elements already tested under
22
- // a different URL variant of the same base path.
23
- const replaySelector = buildReplaySelectorFromActionableItem(item);
24
- const actionType = analyzer.shouldUseDirectControlInteraction(item)
25
- ? "control"
26
- : "hover";
27
- if (await analyzer.hasGeneratedSelectorForBasePath(context.currentPath, actionType, replaySelector)) {
28
- continue;
29
- }
30
- const testInteraction = actionType === "control"
31
- ? analyzer.buildControlInteractionTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId)
32
- : analyzer.buildHoverTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId);
33
- desiredKeys.push(analyzer.getGeneratedKey(testInteraction));
34
- batchItems.push({
35
- runnerId,
36
- testSurfaceId: 0,
37
- testInteraction,
38
- testEnvironmentId,
39
- });
40
- await analyzer.markGeneratedSelectorForBasePath(context.currentPath, actionType, replaySelector);
41
- }
42
- return {
43
- creates: [
44
- {
45
- testSurface: {
46
- title: surfaceTitle,
47
- description: `Tests for page content at ${context.currentPath}`,
48
- startingPageStateId: context.currentPageStateId,
49
- startingPath: context.currentPath,
50
- sizeClass,
51
- priority: 1,
52
- surface_tags: ["page-content"],
53
- uid,
54
- },
55
- interactions: batchItems,
56
- desiredKeys,
57
- dependencyTestInteractionId: context.currentTestInteractionId,
58
- },
59
- ],
60
- reconciles: [],
61
- };
62
- }
63
- //# sourceMappingURL=content.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/content.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qCAAqC,EAAE,MAAM,kCAAkC,CAAC;AAGzF,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,QAAa,EACb,OAAwB;IAExB,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAEhE,MAAM,YAAY,GAAG,QAAQ,CAAC,yBAAyB,CACrD,OAAO,CAAC,eAAe,CAAC,MAAM,CAC5B,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAC/D,CACF,CAAC;IACF,MAAM,YAAY,GAAG,SAAS,OAAO,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,EAAE;YACX,UAAU,EAAE;gBACV;oBACE,YAAY;oBACZ,WAAW,EAAE,EAAE;oBACf,2BAA2B,EAAE,OAAO,CAAC,wBAAwB;iBAC9D;aACF;SACF,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,UAAU,GAAqC,EAAE,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,oEAAoE;QACpE,iDAAiD;QACjD,MAAM,cAAc,GAAG,qCAAqC,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,iCAAiC,CAAC,IAAI,CAAC;YACjE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC;QACZ,IACE,MAAM,QAAQ,CAAC,+BAA+B,CAC5C,OAAO,CAAC,WAAW,EACnB,UAAU,EACV,cAAc,CACf,EACD,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GACnB,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAC7C,IAAI,EACJ,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,wBAAwB,CACjC;YACH,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAChC,IAAI,EACJ,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,wBAAwB,CACjC,CAAC;QACR,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5D,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ;YACR,aAAa,EAAE,CAAC;YAChB,eAAe;YACf,iBAAiB;SAClB,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,gCAAgC,CAC7C,OAAO,CAAC,WAAW,EACnB,UAAU,EACV,cAAc,CACf,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,WAAW,EAAE;oBACX,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,6BAA6B,OAAO,CAAC,WAAW,EAAE;oBAC/D,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;oBAC/C,YAAY,EAAE,OAAO,CAAC,WAAW;oBACjC,SAAS;oBACT,QAAQ,EAAE,CAAC;oBACX,YAAY,EAAE,CAAC,cAAc,CAAC;oBAC9B,GAAG;iBACJ;gBACD,YAAY,EAAE,UAAU;gBACxB,WAAW;gBACX,2BAA2B,EAAE,OAAO,CAAC,wBAAwB;aAC9D;SACF;QACD,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { GeneratorOutput } from "@sudobility/testomniac_types";
2
- import type { AnalyzerContext } from "../types";
3
- export declare function generateDialogLifecycleTestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=dialogs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialogs.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/dialogs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,uCAAuC,CAC3D,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CAyE1B"}
@@ -1,46 +0,0 @@
1
- export async function generateDialogLifecycleTestInteractions(analyzer, context) {
2
- const surfaceTitle = `Dialogs: ${context.currentPath}`;
3
- if (!analyzer.pageHasOpenDialog(context.html)) {
4
- return {
5
- creates: [],
6
- reconciles: [{ surfaceTitle, desiredKeys: [] }],
7
- };
8
- }
9
- const closeCandidates = analyzer.selectRepresentativeItems(context.actionableItems.filter((item) => item.visible &&
10
- !item.disabled &&
11
- item.selector &&
12
- analyzer.isDialogCloseItem(item)));
13
- const tests = [];
14
- for (const item of closeCandidates) {
15
- tests.push(analyzer.buildDialogCloseTestInteraction(item, context.currentPath, context.sizeClass, context.uid, context.currentPageStateId));
16
- }
17
- tests.push(analyzer.buildEscapeDialogTestInteraction(context.currentPath, context.sizeClass, context.uid, context.currentPageStateId));
18
- const { runnerId, testEnvironmentId } = context;
19
- const desiredKeys = tests.map((test) => analyzer.getGeneratedKey(test));
20
- const batchItems = tests.map((test) => ({
21
- runnerId,
22
- testSurfaceId: 0,
23
- testInteraction: test,
24
- testEnvironmentId,
25
- }));
26
- return {
27
- creates: [
28
- {
29
- testSurface: {
30
- title: surfaceTitle,
31
- description: `Dialog lifecycle checks for ${context.currentPath}`,
32
- startingPageStateId: context.currentPageStateId,
33
- startingPath: context.currentPath,
34
- sizeClass: context.sizeClass,
35
- priority: 4,
36
- surface_tags: ["dialog"],
37
- uid: context.uid,
38
- },
39
- interactions: batchItems,
40
- desiredKeys,
41
- },
42
- ],
43
- reconciles: [],
44
- };
45
- }
46
- //# sourceMappingURL=dialogs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/dialogs.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,uCAAuC,CAC3D,QAAa,EACb,OAAwB;IAExB,MAAM,YAAY,GAAG,YAAY,OAAO,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,QAAQ,CAAC,yBAAyB,CACxD,OAAO,CAAC,eAAe,CAAC,MAAM,CAC5B,CAAC,IAAS,EAAE,EAAE,CACZ,IAAI,CAAC,OAAO;QACZ,CAAC,IAAI,CAAC,QAAQ;QACd,IAAI,CAAC,QAAQ;QACb,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CACnC,CACF,CAAC;IAEF,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,+BAA+B,CACtC,IAAI,EACJ,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,kBAAkB,CAC3B,CACF,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,gCAAgC,CACvC,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,kBAAkB,CAC3B,CACF,CAAC;IAEF,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAEhD,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAqB,EAAE,EAAE,CACtD,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAC/B,CAAC;IACF,MAAM,UAAU,GAAqC,KAAK,CAAC,GAAG,CAC5D,CAAC,IAAqB,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ;QACR,aAAa,EAAE,CAAC;QAChB,eAAe,EAAE,IAAI;QACrB,iBAAiB;KAClB,CAAC,CACH,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,WAAW,EAAE;oBACX,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,+BAA+B,OAAO,CAAC,WAAW,EAAE;oBACjE,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;oBAC/C,YAAY,EAAE,OAAO,CAAC,WAAW;oBACjC,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,QAAQ,EAAE,CAAC;oBACX,YAAY,EAAE,CAAC,QAAQ,CAAC;oBACxB,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB;gBACD,YAAY,EAAE,UAAU;gBACxB,WAAW;aACZ;SACF;QACD,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { GeneratorOutput } from "@sudobility/testomniac_types";
2
- import type { AnalyzerContext } from "../types";
3
- export declare function generateE2ETestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=e2e.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/e2e.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CA4C1B"}
@@ -1,37 +0,0 @@
1
- export async function generateE2ETestInteractions(analyzer, context) {
2
- const surfaceTitle = `Dependency Journeys: ${context.currentPath}`;
3
- if (context.journeySteps.length < 2) {
4
- return {
5
- creates: [],
6
- reconciles: [{ surfaceTitle, desiredKeys: [] }],
7
- };
8
- }
9
- const { runnerId, testEnvironmentId, sizeClass, uid } = context;
10
- const e2e = analyzer.buildE2ETestInteraction(context.currentPath, sizeClass, uid, context.currentPageStateId, context.journeySteps);
11
- return {
12
- creates: [
13
- {
14
- testSurface: {
15
- title: surfaceTitle,
16
- description: `Dependency-derived journeys reaching ${context.currentPath}`,
17
- startingPageStateId: context.currentPageStateId,
18
- startingPath: context.currentPath,
19
- sizeClass,
20
- priority: 2,
21
- surface_tags: ["e2e"],
22
- uid,
23
- },
24
- interactions: [
25
- {
26
- runnerId,
27
- testInteraction: e2e,
28
- testEnvironmentId,
29
- },
30
- ],
31
- desiredKeys: [analyzer.getGeneratedKey(e2e)],
32
- },
33
- ],
34
- reconciles: [],
35
- };
36
- }
37
- //# sourceMappingURL=e2e.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"e2e.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/e2e.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,QAAa,EACb,OAAwB;IAExB,MAAM,YAAY,GAAG,wBAAwB,OAAO,CAAC,WAAW,EAAE,CAAC;IACnE,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAEhE,MAAM,GAAG,GAAG,QAAQ,CAAC,uBAAuB,CAC1C,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,YAAY,CACrB,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,WAAW,EAAE;oBACX,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,wCAAwC,OAAO,CAAC,WAAW,EAAE;oBAC1E,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;oBAC/C,YAAY,EAAE,OAAO,CAAC,WAAW;oBACjC,SAAS;oBACT,QAAQ,EAAE,CAAC;oBACX,YAAY,EAAE,CAAC,KAAK,CAAC;oBACrB,GAAG;iBACJ;gBACD,YAAY,EAAE;oBACZ;wBACE,QAAQ;wBACR,eAAe,EAAE,GAAG;wBACpB,iBAAiB;qBAClB;iBACF;gBACD,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;aAC7C;SACF;QACD,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { GeneratorOutput } from "@sudobility/testomniac_types";
2
- import type { AnalyzerContext } from "../types";
3
- export declare function generateFormTestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=forms.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CAuK1B"}
@@ -1,95 +0,0 @@
1
- export async function generateFormTestInteractions(analyzer, context) {
2
- const surfaceTitle = `Forms: ${context.currentPath}`;
3
- if (context.forms.length === 0) {
4
- return {
5
- creates: [],
6
- reconciles: [{ surfaceTitle, desiredKeys: [] }],
7
- };
8
- }
9
- const { runnerId, testEnvironmentId, sizeClass, uid } = context;
10
- const desiredKeys = [];
11
- const batchItems = [];
12
- for (let index = 0; index < context.forms.length; index++) {
13
- const form = context.forms[index];
14
- const formType = analyzer.identifyFormType(form, context.currentPath);
15
- const formLabel = analyzer.describeForm(form, index);
16
- // Skip forms already tested under a different URL variant of the same
17
- // base path (e.g. login sidebar form on /store/ vs /store/?pricepoint=3).
18
- if (await analyzer.hasGeneratedSelectorForBasePath(context.currentPath, "form", formLabel)) {
19
- continue;
20
- }
21
- const validValues = analyzer.planFormValues(form, context.actionableItems);
22
- if (analyzer.isSearchForm(form)) {
23
- const searchTests = analyzer.buildSearchTestInteractions(form, formLabel, context.currentPath, sizeClass, uid, context.currentPageStateId, validValues, context.actionableItems);
24
- for (const searchTest of searchTests) {
25
- desiredKeys.push(analyzer.getGeneratedKey(searchTest));
26
- batchItems.push({
27
- runnerId,
28
- testSurfaceId: 0, // filled by server
29
- testInteraction: searchTest,
30
- testEnvironmentId,
31
- });
32
- }
33
- continue;
34
- }
35
- const positive = analyzer.buildFormTestInteraction(form, formLabel, formType, context.currentPath, sizeClass, uid, context.currentPageStateId, validValues);
36
- desiredKeys.push(analyzer.getGeneratedKey(positive));
37
- batchItems.push({
38
- runnerId,
39
- testSurfaceId: 0, // filled by server
40
- testInteraction: positive,
41
- testEnvironmentId,
42
- });
43
- for (const field of form.fields.filter((field) => analyzer.isNegativeCandidateField(field))) {
44
- const negative = analyzer.buildNegativeFormTestInteraction(form, formLabel, formType, field, context.currentPath, sizeClass, uid, context.currentPageStateId, validValues);
45
- desiredKeys.push(analyzer.getGeneratedKey(negative));
46
- batchItems.push({
47
- runnerId,
48
- testSurfaceId: 0,
49
- testInteraction: negative,
50
- testEnvironmentId,
51
- });
52
- const correction = analyzer.buildFormCorrectionTestInteraction(form, formLabel, formType, field, context.currentPath, sizeClass, uid, context.currentPageStateId, validValues);
53
- desiredKeys.push(analyzer.getGeneratedKey(correction));
54
- batchItems.push({
55
- runnerId,
56
- testSurfaceId: 0,
57
- testInteraction: correction,
58
- testEnvironmentId,
59
- });
60
- }
61
- if (analyzer.isPasswordScenario(formType, form)) {
62
- const passwordTests = analyzer.buildPasswordTestInteractions(form, formLabel, formType, context.currentPath, sizeClass, uid, context.currentPageStateId, validValues, analyzer.detectPasswordRequirements(analyzer.extractVisibleText(context.html)));
63
- for (const passwordTest of passwordTests) {
64
- desiredKeys.push(analyzer.getGeneratedKey(passwordTest));
65
- batchItems.push({
66
- runnerId,
67
- testSurfaceId: 0,
68
- testInteraction: passwordTest,
69
- testEnvironmentId,
70
- });
71
- }
72
- }
73
- await analyzer.markGeneratedSelectorForBasePath(context.currentPath, "form", formLabel);
74
- }
75
- return {
76
- creates: [
77
- {
78
- testSurface: {
79
- title: surfaceTitle,
80
- description: `Form workflows for ${context.currentPath}`,
81
- startingPageStateId: context.currentPageStateId,
82
- startingPath: context.currentPath,
83
- sizeClass,
84
- priority: 2,
85
- surface_tags: ["form"],
86
- uid,
87
- },
88
- interactions: batchItems,
89
- desiredKeys,
90
- },
91
- ],
92
- reconciles: [],
93
- };
94
- }
95
- //# sourceMappingURL=forms.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/forms.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { TestInteraction } from "@sudobility/testomniac_types";
2
- import type { AnalyzerContext } from "../types";
3
- export declare function generateHoverFollowUpCases(analyzer: any, testInteraction: TestInteraction, context: AnalyzerContext): Promise<void>;
4
- //# sourceMappingURL=hover-follow-up.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hover-follow-up.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/hover-follow-up.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,GAAG,EACb,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAuLf"}