@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,165 +0,0 @@
1
- /**
2
- * Create direct navigation interactions for same-origin links discovered on
3
- * the current page. These are placed in the "Direct Navigations" surface
4
- * which runs as execution group 0 (before hover/content interactions), so
5
- * discovered pages get short dependency chains.
6
- *
7
- * Navigation interactions never have a dependencyTestInteractionId — they
8
- * navigate directly via goto.
9
- *
10
- * Items are deduplicated by relative path. Action URLs (add-to-cart, etc.)
11
- * are not navigated directly but their base page path is discovered.
12
- */
13
- export async function generateNavigationTestInteractions(analyzer, context) {
14
- const { api, runnerId, testEnvironmentId, sizeClass, uid, bundleRun } = context;
15
- // Only generate for discovery runs that have a navigation surface
16
- if (!context.navigationSurface || !bundleRun)
17
- return;
18
- const navSurfaceId = context.navigationSurface.id;
19
- // Filter to navigation items with valid same-origin hrefs
20
- const navItems = context.actionableItems.filter(item => {
21
- if (item.actionKind !== "navigate" || !item.href)
22
- return false;
23
- // Skip anchors, mailto, tel, javascript
24
- if (item.href === "#" ||
25
- item.href.startsWith("#") ||
26
- item.href.startsWith("mailto:") ||
27
- item.href.startsWith("tel:") ||
28
- item.href.startsWith("javascript:")) {
29
- return false;
30
- }
31
- // Skip absolute URLs pointing to external domains. Relative paths
32
- // (e.g. "/intent/tweet") are kept — if the site links to a relative
33
- // path that 404s, that is a genuine broken-link bug.
34
- if (isExternalAbsoluteUrl(item.href, context.siteOrigin))
35
- return false;
36
- const path = extractRelativePath(item.href);
37
- if (!path)
38
- return false;
39
- // Skip current page
40
- if (path === context.currentPath)
41
- return false;
42
- // Skip paths outside the scan scope boundary
43
- if (context.scanScopePath && !path.startsWith(context.scanScopePath)) {
44
- return false;
45
- }
46
- return true;
47
- });
48
- if (navItems.length === 0)
49
- return;
50
- // Deduplicate navigation targets:
51
- // - Every unique base path (pathname without query string) is navigated
52
- // so that all distinct pages are discovered.
53
- // - Query-string variants of the same base path are capped at
54
- // MAX_QUERY_VARIANTS to avoid exploding on filter/sort/pagination links.
55
- const MAX_QUERY_VARIANTS = 2;
56
- const seenPaths = new Set();
57
- seenPaths.add(context.currentPath);
58
- // Track how many query-string variants we've accepted per base path
59
- const queryVariantCounts = new Map();
60
- const navPaths = [];
61
- for (const item of navItems) {
62
- const path = extractRelativePath(item.href);
63
- if (!path || seenPaths.has(path))
64
- continue;
65
- // For action URLs (e.g. /my-cart/?ec_action=addtocart), don't
66
- // navigate to the action URL itself (which triggers side effects),
67
- // but DO discover the base page path (e.g. /my-cart/).
68
- if (isActionUrl(path)) {
69
- const basePath = extractBasePath(path);
70
- if (basePath && basePath !== "/" && !seenPaths.has(basePath)) {
71
- seenPaths.add(basePath);
72
- navPaths.push(basePath);
73
- }
74
- continue;
75
- }
76
- const basePath = extractBasePath(path);
77
- const hasQuery = path.includes("?");
78
- if (hasQuery && basePath) {
79
- // Always ensure the base path itself is queued first
80
- if (!seenPaths.has(basePath)) {
81
- seenPaths.add(basePath);
82
- navPaths.push(basePath);
83
- }
84
- // Cap query-string variants per base path
85
- const count = queryVariantCounts.get(basePath) ?? 0;
86
- if (count >= MAX_QUERY_VARIANTS)
87
- continue;
88
- queryVariantCounts.set(basePath, count + 1);
89
- }
90
- seenPaths.add(path);
91
- navPaths.push(path);
92
- }
93
- if (navPaths.length === 0)
94
- return;
95
- // Get the open surface run for Direct Navigations
96
- const surfaceRuns = await api.getOpenTestSurfaceRuns(bundleRun.id);
97
- const navSurfaceRun = surfaceRuns.find((sr) => sr.testSurfaceId === navSurfaceId);
98
- if (!navSurfaceRun)
99
- return;
100
- const batchItems = [];
101
- for (const path of navPaths) {
102
- const navInteraction = analyzer.buildNavigationTestInteraction(path, sizeClass, uid);
103
- batchItems.push({
104
- runnerId,
105
- testSurfaceId: navSurfaceId,
106
- testInteraction: navInteraction,
107
- testEnvironmentId,
108
- testSurfaceRunId: navSurfaceRun.id,
109
- });
110
- }
111
- if (batchItems.length > 0) {
112
- await api.ensureTestInteractionBatch(batchItems);
113
- }
114
- // Do NOT reconcile — other navigation interactions (from hover-click
115
- // discovery or scan bootstrap) should not be retired.
116
- }
117
- /**
118
- * Returns true when href is an absolute URL pointing to a different origin
119
- * than the current site. Relative paths like "/intent/tweet" return false
120
- * (they should be tested — if the site links to them, a 404 is a real bug).
121
- */
122
- function isExternalAbsoluteUrl(href, siteOrigin) {
123
- if (!/^https?:\/\//i.test(href))
124
- return false;
125
- try {
126
- const parsed = new URL(href);
127
- if (!siteOrigin)
128
- return true;
129
- return parsed.origin !== new URL(siteOrigin).origin;
130
- }
131
- catch {
132
- return false;
133
- }
134
- }
135
- function extractRelativePath(href) {
136
- try {
137
- const url = new URL(href, "http://placeholder");
138
- return url.pathname + url.search;
139
- }
140
- catch {
141
- return null;
142
- }
143
- }
144
- /**
145
- * Detect URLs that trigger server-side actions (add to cart, delete, etc.)
146
- * rather than navigating to a viewable page.
147
- */
148
- function isActionUrl(path) {
149
- return /[?&](ec_action|action|add_to_cart|remove|delete)=/i.test(path);
150
- }
151
- /**
152
- * Extract the base page path from an action URL by stripping the query string.
153
- * e.g. "/my-cart/?ec_action=addtocart&model_number=123" → "/my-cart/"
154
- */
155
- function extractBasePath(path) {
156
- try {
157
- const url = new URL(path, "http://placeholder");
158
- const base = url.pathname;
159
- return base || null;
160
- }
161
- catch {
162
- return null;
163
- }
164
- }
165
- //# sourceMappingURL=navigation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/navigation.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,QAAa,EACb,OAAwB;IAExB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GACnE,OAAO,CAAC;IAEV,kEAAkE;IAClE,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,CAAC,SAAS;QAAE,OAAO;IAErD,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAElD,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACrD,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/D,wCAAwC;QACxC,IACE,IAAI,CAAC,IAAI,KAAK,GAAG;YACjB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EACnC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mEAAmE;QACnE,oEAAoE;QACpE,qDAAqD;QACrD,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACvE,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,oBAAoB;QACpB,IAAI,IAAI,KAAK,OAAO,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAC/C,6CAA6C;QAC7C,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACrE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,kCAAkC;IAClC,wEAAwE;IACxE,+CAA+C;IAC/C,8DAA8D;IAC9D,2EAA2E;IAC3E,MAAM,kBAAkB,GAAG,CAAC,CAAC;IAE7B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnC,oEAAoE;IACpE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAE3C,8DAA8D;QAC9D,mEAAmE;QACnE,uDAAuD;QACvD,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,QAAQ,IAAI,QAAQ,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7D,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACzB,qDAAqD;YACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;YACD,0CAA0C;YAC1C,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,KAAK,IAAI,kBAAkB;gBAAE,SAAS;YAC1C,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,kDAAkD;IAClD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CACpC,CAAC,EAA6B,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,KAAK,YAAY,CACrE,CAAC;IACF,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,QAAQ,CAAC,8BAA8B,CAC5D,IAAI,EACJ,SAAS,EACT,GAAG,CACJ,CAAC;QACF,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ;YACR,aAAa,EAAE,YAAY;YAC3B,eAAe,EAAE,cAAc;YAC/B,iBAAiB;YACjB,gBAAgB,EAAE,aAAa,CAAC,EAAE;SACnC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,qEAAqE;IACrE,sDAAsD;AACxD,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,IAAY,EACZ,UAA8B;IAE9B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAC7B,OAAO,MAAM,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,oDAAoD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC1B,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { GeneratorOutput } from "@sudobility/testomniac_types";
2
- import type { AnalyzerContext } from "../types";
3
- export declare function generateRenderTestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=render.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CAqC1B"}
@@ -1,31 +0,0 @@
1
- export async function generateRenderTestInteractions(analyzer, context) {
2
- const { runnerId, testEnvironmentId, sizeClass, uid } = context;
3
- const surfaceTitle = `Render: ${context.currentPath}`;
4
- const testInteraction = analyzer.buildRenderTestInteraction(context.currentPath, sizeClass, uid, context.currentPageStateId, context.pageId);
5
- return {
6
- creates: [
7
- {
8
- testSurface: {
9
- title: surfaceTitle,
10
- description: `Render validation for ${context.currentPath}`,
11
- startingPageStateId: context.currentPageStateId,
12
- startingPath: context.currentPath,
13
- sizeClass,
14
- priority: 5,
15
- surface_tags: ["render"],
16
- uid,
17
- },
18
- interactions: [
19
- {
20
- runnerId,
21
- testInteraction,
22
- testEnvironmentId,
23
- },
24
- ],
25
- desiredKeys: [analyzer.getGeneratedKey(testInteraction)],
26
- },
27
- ],
28
- reconciles: [],
29
- };
30
- }
31
- //# sourceMappingURL=render.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/render.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,QAAa,EACb,OAAwB;IAExB,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAChE,MAAM,YAAY,GAAG,WAAW,OAAO,CAAC,WAAW,EAAE,CAAC;IAEtD,MAAM,eAAe,GAAG,QAAQ,CAAC,0BAA0B,CACzD,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,WAAW,EAAE;oBACX,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,yBAAyB,OAAO,CAAC,WAAW,EAAE;oBAC3D,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;oBAC/C,YAAY,EAAE,OAAO,CAAC,WAAW;oBACjC,SAAS;oBACT,QAAQ,EAAE,CAAC;oBACX,YAAY,EAAE,CAAC,QAAQ,CAAC;oBACxB,GAAG;iBACJ;gBACD,YAAY,EAAE;oBACZ;wBACE,QAAQ;wBACR,eAAe;wBACf,iBAAiB;qBAClB;iBACF;gBACD,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;aACzD;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 generateScaffoldTestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=scaffolds.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffolds.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/scaffolds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC,CAsF1B"}
@@ -1,64 +0,0 @@
1
- export async function generateScaffoldTestInteractions(analyzer, context) {
2
- const { api, runnerId, testEnvironmentId, sizeClass, uid } = context;
3
- const processedSurfaceTitles = new Set();
4
- const creates = [];
5
- const reconciles = [];
6
- for (const scaffold of context.scaffolds) {
7
- const scaffoldItems = analyzer.selectRepresentativeItems(analyzer.getScaffoldSurfaceItems(context, scaffold));
8
- const surfaceTitle = `Scaffold: ${scaffold.type}`;
9
- processedSurfaceTitles.add(surfaceTitle);
10
- if (scaffoldItems.length === 0) {
11
- // Empty scaffold — reconcile-only with no desired keys
12
- reconciles.push({
13
- surfaceTitle,
14
- desiredKeys: [],
15
- dependencyTestInteractionId: context.currentTestInteractionId,
16
- });
17
- continue;
18
- }
19
- const desiredKeys = [];
20
- const batchItems = [];
21
- for (const item of scaffoldItems) {
22
- const testInteraction = analyzer.shouldUseDirectControlInteraction(item)
23
- ? analyzer.buildControlInteractionTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId)
24
- : analyzer.buildHoverTestInteraction(item, context.currentPath, sizeClass, uid, context.currentPageStateId, context.currentTestInteractionId);
25
- desiredKeys.push(analyzer.getGeneratedKey(testInteraction));
26
- batchItems.push({
27
- runnerId,
28
- testSurfaceId: 0,
29
- testInteraction,
30
- testEnvironmentId,
31
- });
32
- }
33
- creates.push({
34
- testSurface: {
35
- title: surfaceTitle,
36
- description: `Tests for ${scaffold.type} scaffold`,
37
- startingPageStateId: context.currentPageStateId,
38
- startingPath: context.currentPath,
39
- sizeClass,
40
- priority: 3,
41
- surface_tags: ["scaffold", scaffold.type],
42
- uid,
43
- },
44
- interactions: batchItems,
45
- desiredKeys,
46
- dependencyTestInteractionId: context.currentTestInteractionId,
47
- });
48
- }
49
- // Find existing scaffold surfaces not present on the current page and
50
- // add reconcile-only entries so their stale interactions get retired.
51
- const existingSurfaces = await api.getTestSurfacesByRunner(runnerId);
52
- for (const surface of existingSurfaces.filter((item) => item.title.startsWith("Scaffold: "))) {
53
- if (!processedSurfaceTitles.has(surface.title)) {
54
- reconciles.push({
55
- surfaceTitle: surface.title,
56
- surfaceId: surface.id,
57
- desiredKeys: [],
58
- dependencyTestInteractionId: context.currentTestInteractionId,
59
- });
60
- }
61
- }
62
- return { creates, reconciles };
63
- }
64
- //# sourceMappingURL=scaffolds.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffolds.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/scaffolds.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,QAAa,EACb,OAAwB;IAExB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IACjD,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,MAAM,UAAU,GAA+B,EAAE,CAAC;IAElD,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,yBAAyB,CACtD,QAAQ,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,CACpD,CAAC;QAEF,MAAM,YAAY,GAAG,aAAa,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,uDAAuD;YACvD,UAAU,CAAC,IAAI,CAAC;gBACd,YAAY;gBACZ,WAAW,EAAE,EAAE;gBACf,2BAA2B,EAAE,OAAO,CAAC,wBAAwB;aAC9D,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,UAAU,GAAqC,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,eAAe,GAAG,QAAQ,CAAC,iCAAiC,CAAC,IAAI,CAAC;gBACtE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAC7C,IAAI,EACJ,OAAO,CAAC,WAAW,EACnB,SAAS,EACT,GAAG,EACH,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,wBAAwB,CACjC;gBACH,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;YACN,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;YAC5D,UAAU,CAAC,IAAI,CAAC;gBACd,QAAQ;gBACR,aAAa,EAAE,CAAC;gBAChB,eAAe;gBACf,iBAAiB;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,WAAW,EAAE;gBACX,KAAK,EAAE,YAAY;gBACnB,WAAW,EAAE,aAAa,QAAQ,CAAC,IAAI,WAAW;gBAClD,mBAAmB,EAAE,OAAO,CAAC,kBAAkB;gBAC/C,YAAY,EAAE,OAAO,CAAC,WAAW;gBACjC,SAAS;gBACT,QAAQ,EAAE,CAAC;gBACX,YAAY,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;gBACzC,GAAG;aACJ;YACD,YAAY,EAAE,UAAU;YACxB,WAAW;YACX,2BAA2B,EAAE,OAAO,CAAC,wBAAwB;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,MAAM,GAAG,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACrE,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAC1D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CACpC,EAAE,CAAC;QACF,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC;gBACd,YAAY,EAAE,OAAO,CAAC,KAAK;gBAC3B,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,WAAW,EAAE,EAAE;gBACf,2BAA2B,EAAE,OAAO,CAAC,wBAAwB;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { GeneratorOutput } from "@sudobility/testomniac_types";
2
- import type { AnalyzerContext } from "../types";
3
- export declare function generateSemanticJourneyTestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=semantic-journeys.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-journeys.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/semantic-journeys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,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,CA0C1B"}
@@ -1,37 +0,0 @@
1
- export async function generateSemanticJourneyTestInteractions(analyzer, context) {
2
- const journeys = analyzer.buildSemanticJourneyTestInteractions(context);
3
- const surfaceTitle = `Journeys: ${context.currentPath}`;
4
- if (journeys.length === 0) {
5
- return {
6
- creates: [],
7
- reconciles: [{ surfaceTitle, desiredKeys: [] }],
8
- };
9
- }
10
- const { runnerId, testEnvironmentId } = context;
11
- const batchItems = journeys.map((journey) => ({
12
- runnerId,
13
- testSurfaceId: 0,
14
- testInteraction: journey,
15
- testEnvironmentId,
16
- }));
17
- return {
18
- creates: [
19
- {
20
- testSurface: {
21
- title: surfaceTitle,
22
- description: `Semantic multi-step journeys from ${context.currentPath}`,
23
- startingPageStateId: context.currentPageStateId,
24
- startingPath: context.currentPath,
25
- sizeClass: context.sizeClass,
26
- priority: 6,
27
- surface_tags: ["e2e", "semantic-journey"],
28
- uid: context.uid,
29
- },
30
- interactions: batchItems,
31
- desiredKeys: journeys.map((journey) => analyzer.getGeneratedKey(journey)),
32
- },
33
- ],
34
- reconciles: [],
35
- };
36
- }
37
- //# sourceMappingURL=semantic-journeys.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-journeys.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/semantic-journeys.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,uCAAuC,CAC3D,QAAa,EACb,OAAwB;IAExB,MAAM,QAAQ,GAAG,QAAQ,CAAC,oCAAoC,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,aAAa,OAAO,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,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,GAAG,OAAO,CAAC;IAEhD,MAAM,UAAU,GAAqC,QAAQ,CAAC,GAAG,CAC/D,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;QACjB,QAAQ;QACR,aAAa,EAAE,CAAC;QAChB,eAAe,EAAE,OAAO;QACxB,iBAAiB;KAClB,CAAC,CACH,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,WAAW,EAAE;oBACX,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,qCAAqC,OAAO,CAAC,WAAW,EAAE;oBACvE,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,KAAK,EAAE,kBAAkB,CAAC;oBACzC,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB;gBACD,YAAY,EAAE,UAAU;gBACxB,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CACzC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAClC;aACF;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 generateVariantTestInteractions(analyzer: any, context: AnalyzerContext): Promise<GeneratorOutput>;
4
- //# sourceMappingURL=variants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AACtC,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,CAwE1B"}
@@ -1,60 +0,0 @@
1
- export async function generateVariantTestInteractions(analyzer, context) {
2
- const allTests = analyzer.buildVariantTestInteractions(context);
3
- // Filter out interactions whose replay selector was already generated
4
- // under a different URL variant of the same base path.
5
- const tests = [];
6
- for (const test of allTests) {
7
- const selector = test.steps?.[0]?.action?.path;
8
- const actionType = test.steps?.[0]?.action?.actionType;
9
- if (!selector || !actionType) {
10
- tests.push(test);
11
- continue;
12
- }
13
- const alreadyGenerated = await analyzer.hasGeneratedSelectorForBasePath(context.currentPath, actionType, selector);
14
- if (!alreadyGenerated) {
15
- tests.push(test);
16
- }
17
- }
18
- const surfaceTitle = `Variants: ${context.currentPath}`;
19
- if (tests.length === 0) {
20
- return {
21
- creates: [],
22
- reconciles: [{ surfaceTitle, desiredKeys: [] }],
23
- };
24
- }
25
- const { runnerId, testEnvironmentId } = context;
26
- const batchItems = [];
27
- for (const test of tests) {
28
- batchItems.push({
29
- runnerId,
30
- testSurfaceId: 0,
31
- testInteraction: test,
32
- testEnvironmentId,
33
- });
34
- const selector = test.steps?.[0]?.action?.path;
35
- const actionType = test.steps?.[0]?.action?.actionType;
36
- if (selector && actionType) {
37
- await analyzer.markGeneratedSelectorForBasePath(context.currentPath, actionType, selector);
38
- }
39
- }
40
- return {
41
- creates: [
42
- {
43
- testSurface: {
44
- title: surfaceTitle,
45
- description: `Variant and option state checks for ${context.currentPath}`,
46
- startingPageStateId: context.currentPageStateId,
47
- startingPath: context.currentPath,
48
- sizeClass: context.sizeClass,
49
- priority: 2,
50
- surface_tags: ["variant", "option"],
51
- uid: context.uid,
52
- },
53
- interactions: batchItems,
54
- desiredKeys: tests.map((test) => analyzer.getGeneratedKey(test)),
55
- },
56
- ],
57
- reconciles: [],
58
- };
59
- }
60
- //# sourceMappingURL=variants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"variants.js","sourceRoot":"","sources":["../../../../src/analyzer/page-analyzer/generators/variants.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,QAAa,EACb,OAAwB;IAExB,MAAM,QAAQ,GAAG,QAAQ,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEhE,sEAAsE;IACtE,uDAAuD;IACvD,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC;QACvD,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,+BAA+B,CACrE,OAAO,CAAC,WAAW,EACnB,UAAU,EACV,QAAQ,CACT,CAAC;QACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,OAAO,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,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,GAAG,OAAO,CAAC;IAEhD,MAAM,UAAU,GAAqC,EAAE,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC;YACd,QAAQ;YACR,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,IAAI;YACrB,iBAAiB;SAClB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC;QACvD,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,QAAQ,CAAC,gCAAgC,CAC7C,OAAO,CAAC,WAAW,EACnB,UAAU,EACV,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,WAAW,EAAE;oBACX,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,uCAAuC,OAAO,CAAC,WAAW,EAAE;oBACzE,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,SAAS,EAAE,QAAQ,CAAC;oBACnC,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB;gBACD,YAAY,EAAE,UAAU;gBACxB,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;aACtE;SACF;QACD,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC"}