@sudobility/testomniac_runner_service 0.1.172 → 0.1.173

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 (45) hide show
  1. package/dist/browser/performance-snapshot.d.ts +27 -0
  2. package/dist/browser/performance-snapshot.d.ts.map +1 -0
  3. package/dist/browser/performance-snapshot.js +75 -0
  4. package/dist/browser/performance-snapshot.js.map +1 -0
  5. package/dist/expertise/accessibility-expertise.d.ts +4 -0
  6. package/dist/expertise/accessibility-expertise.d.ts.map +1 -1
  7. package/dist/expertise/accessibility-expertise.js +132 -1
  8. package/dist/expertise/accessibility-expertise.js.map +1 -1
  9. package/dist/expertise/content-expertise.d.ts +5 -0
  10. package/dist/expertise/content-expertise.d.ts.map +1 -1
  11. package/dist/expertise/content-expertise.js +193 -1
  12. package/dist/expertise/content-expertise.js.map +1 -1
  13. package/dist/expertise/page-health-outcomes.d.ts +5 -0
  14. package/dist/expertise/page-health-outcomes.d.ts.map +1 -0
  15. package/dist/expertise/page-health-outcomes.js +16 -0
  16. package/dist/expertise/page-health-outcomes.js.map +1 -0
  17. package/dist/expertise/performance-expertise.d.ts +10 -0
  18. package/dist/expertise/performance-expertise.d.ts.map +1 -1
  19. package/dist/expertise/performance-expertise.js +245 -1
  20. package/dist/expertise/performance-expertise.js.map +1 -1
  21. package/dist/expertise/rule-id.d.ts +4 -0
  22. package/dist/expertise/rule-id.d.ts.map +1 -0
  23. package/dist/expertise/rule-id.js +7 -0
  24. package/dist/expertise/rule-id.js.map +1 -0
  25. package/dist/expertise/security-expertise.d.ts +4 -0
  26. package/dist/expertise/security-expertise.d.ts.map +1 -1
  27. package/dist/expertise/security-expertise.js +116 -1
  28. package/dist/expertise/security-expertise.js.map +1 -1
  29. package/dist/expertise/seo-expertise.d.ts +7 -0
  30. package/dist/expertise/seo-expertise.d.ts.map +1 -1
  31. package/dist/expertise/seo-expertise.js +169 -6
  32. package/dist/expertise/seo-expertise.js.map +1 -1
  33. package/dist/expertise/tester-expertise.d.ts.map +1 -1
  34. package/dist/expertise/tester-expertise.js +96 -41
  35. package/dist/expertise/tester-expertise.js.map +1 -1
  36. package/dist/expertise/types.d.ts +6 -1
  37. package/dist/expertise/types.d.ts.map +1 -1
  38. package/dist/expertise/ui-expertise.d.ts +4 -0
  39. package/dist/expertise/ui-expertise.d.ts.map +1 -1
  40. package/dist/expertise/ui-expertise.js +103 -1
  41. package/dist/expertise/ui-expertise.js.map +1 -1
  42. package/dist/orchestrator/test-interaction-executor.d.ts.map +1 -1
  43. package/dist/orchestrator/test-interaction-executor.js +60 -70
  44. package/dist/orchestrator/test-interaction-executor.js.map +1 -1
  45. package/package.json +3 -3
@@ -0,0 +1,27 @@
1
+ import type { BrowserAdapter } from "../adapter";
2
+ export interface PerformanceResourceSummary {
3
+ name: string;
4
+ initiatorType: string;
5
+ durationMs: number;
6
+ transferSizeBytes: number;
7
+ renderBlockingStatus?: string;
8
+ }
9
+ export interface PerformanceSnapshot {
10
+ ttfbMs: number | null;
11
+ domContentLoadedMs: number | null;
12
+ loadEventMs: number | null;
13
+ resourceCount: number;
14
+ totalTransferSizeBytes: number;
15
+ scriptTransferSizeBytes: number;
16
+ stylesheetTransferSizeBytes: number;
17
+ imageTransferSizeBytes: number;
18
+ slowResources: PerformanceResourceSummary[];
19
+ largestResources: PerformanceResourceSummary[];
20
+ duplicateResourceUrls: Array<{
21
+ url: string;
22
+ count: number;
23
+ }>;
24
+ renderBlockingResourceCount: number;
25
+ }
26
+ export declare function capturePerformanceSnapshot(adapter: BrowserAdapter): Promise<PerformanceSnapshot>;
27
+ //# sourceMappingURL=performance-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-snapshot.d.ts","sourceRoot":"","sources":["../../src/browser/performance-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,2BAA2B,EAAE,MAAM,CAAC;IACpC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,0BAA0B,EAAE,CAAC;IAC5C,gBAAgB,EAAE,0BAA0B,EAAE,CAAC;IAC/C,qBAAqB,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,2BAA2B,EAAE,MAAM,CAAC;CACrC;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAmG9B"}
@@ -0,0 +1,75 @@
1
+ export async function capturePerformanceSnapshot(adapter) {
2
+ return adapter.evaluate(() => {
3
+ const round = (value) => Math.round(value);
4
+ const navigation = performance.getEntriesByType("navigation")[0];
5
+ const resources = performance.getEntriesByType("resource");
6
+ const summarize = (entry) => ({
7
+ name: entry.name,
8
+ initiatorType: entry.initiatorType || "other",
9
+ durationMs: round(entry.duration),
10
+ transferSizeBytes: entry.transferSize || 0,
11
+ renderBlockingStatus: "renderBlockingStatus" in entry
12
+ ? String(entry.renderBlockingStatus ?? "")
13
+ : undefined,
14
+ });
15
+ const byUrl = new Map();
16
+ let totalTransferSizeBytes = 0;
17
+ let scriptTransferSizeBytes = 0;
18
+ let stylesheetTransferSizeBytes = 0;
19
+ let imageTransferSizeBytes = 0;
20
+ let renderBlockingResourceCount = 0;
21
+ for (const entry of resources) {
22
+ byUrl.set(entry.name, (byUrl.get(entry.name) ?? 0) + 1);
23
+ totalTransferSizeBytes += entry.transferSize || 0;
24
+ if (entry.initiatorType === "script") {
25
+ scriptTransferSizeBytes += entry.transferSize || 0;
26
+ }
27
+ if (entry.initiatorType === "link" || entry.initiatorType === "css") {
28
+ stylesheetTransferSizeBytes += entry.transferSize || 0;
29
+ }
30
+ if (entry.initiatorType === "img" || entry.initiatorType === "image") {
31
+ imageTransferSizeBytes += entry.transferSize || 0;
32
+ }
33
+ const maybeBlocking = entry;
34
+ if (maybeBlocking.renderBlockingStatus === "blocking") {
35
+ renderBlockingResourceCount += 1;
36
+ }
37
+ }
38
+ const slowResources = resources
39
+ .filter(entry => entry.duration > 1500)
40
+ .sort((a, b) => b.duration - a.duration)
41
+ .slice(0, 5)
42
+ .map(summarize);
43
+ const largestResources = resources
44
+ .filter(entry => (entry.transferSize || 0) > 0)
45
+ .sort((a, b) => (b.transferSize || 0) - (a.transferSize || 0))
46
+ .slice(0, 5)
47
+ .map(summarize);
48
+ const duplicateResourceUrls = Array.from(byUrl.entries())
49
+ .filter(([, count]) => count > 1)
50
+ .sort(([, left], [, right]) => right - left)
51
+ .slice(0, 5)
52
+ .map(([url, count]) => ({ url, count }));
53
+ return {
54
+ ttfbMs: navigation
55
+ ? round(navigation.responseStart - navigation.requestStart)
56
+ : null,
57
+ domContentLoadedMs: navigation
58
+ ? round(navigation.domContentLoadedEventEnd - navigation.startTime)
59
+ : null,
60
+ loadEventMs: navigation
61
+ ? round(navigation.loadEventEnd - navigation.startTime)
62
+ : null,
63
+ resourceCount: resources.length,
64
+ totalTransferSizeBytes,
65
+ scriptTransferSizeBytes,
66
+ stylesheetTransferSizeBytes,
67
+ imageTransferSizeBytes,
68
+ slowResources,
69
+ largestResources,
70
+ duplicateResourceUrls,
71
+ renderBlockingResourceCount,
72
+ };
73
+ });
74
+ }
75
+ //# sourceMappingURL=performance-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-snapshot.js","sourceRoot":"","sources":["../../src/browser/performance-snapshot.ts"],"names":[],"mappings":"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"}
@@ -9,5 +9,9 @@ export declare class AccessibilityExpertise implements Expertise {
9
9
  private checkDialogLabelling;
10
10
  private checkPositiveTabindex;
11
11
  private checkAutoplayMedia;
12
+ private checkInteractiveNames;
13
+ private checkAriaReferences;
14
+ private checkClickableSemantics;
15
+ private checkEmptyLinks;
12
16
  }
13
17
  //# sourceMappingURL=accessibility-expertise.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accessibility-expertise.d.ts","sourceRoot":"","sources":["../../src/expertise/accessibility-expertise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAMpE,qBAAa,sBAAuB,YAAW,SAAS;IACtD,IAAI,SAAmB;IAEvB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,EAAE;IAc9C,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,kBAAkB;CAuB3B"}
1
+ {"version":3,"file":"accessibility-expertise.d.ts","sourceRoot":"","sources":["../../src/expertise/accessibility-expertise.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAyCpE,qBAAa,sBAAuB,YAAW,SAAS;IACtD,IAAI,SAAmB;IAEvB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,EAAE;IAwB9C,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,uBAAuB;IA4B/B,OAAO,CAAC,eAAe;CA6BxB"}
@@ -1,3 +1,26 @@
1
+ import { ExpertiseRuleId } from "@sudobility/testomniac_types";
2
+ import { outcomesFromPageHealth } from "./page-health-outcomes";
3
+ import { applyRuleIds } from "./rule-id";
4
+ const ACCESSIBILITY_PAGE_HEALTH_RULE_IDS = {
5
+ empty_link: ExpertiseRuleId.AccessibilityPageHealthEmptyLink,
6
+ broken_anchor: ExpertiseRuleId.AccessibilityPageHealthBrokenAnchor,
7
+ unlabeled_button: ExpertiseRuleId.AccessibilityPageHealthUnlabeledButton,
8
+ small_touch_target: ExpertiseRuleId.AccessibilityPageHealthSmallTouchTarget,
9
+ };
10
+ const ACCESSIBILITY_RULE_IDS = {
11
+ "Document should declare a language": ExpertiseRuleId.AccessibilityDocumentLanguage,
12
+ "Page should expose a main landmark for screen readers": ExpertiseRuleId.AccessibilityMainLandmark,
13
+ "Page should expose only one main landmark": ExpertiseRuleId.AccessibilityMainLandmark,
14
+ "Form controls should have accessible labels": ExpertiseRuleId.AccessibilityFormLabels,
15
+ "Images should have alt text or be explicitly decorative": ExpertiseRuleId.AccessibilityImageAltCoverage,
16
+ "Dialogs should be labelled for assistive technologies": ExpertiseRuleId.AccessibilityDialogLabelling,
17
+ "Elements should not use positive tabindex values (disrupts natural tab order)": ExpertiseRuleId.AccessibilityPositiveTabindex,
18
+ "Media should not autoplay with sound": ExpertiseRuleId.AccessibilityAutoplayMedia,
19
+ "Interactive controls should have accessible names": ExpertiseRuleId.AccessibilityInteractiveNames,
20
+ "ARIA references should point to existing element IDs": ExpertiseRuleId.AccessibilityAriaReferences,
21
+ "Clickable non-semantic elements should expose role and keyboard focus": ExpertiseRuleId.AccessibilityClickableSemantics,
22
+ "Links should not be empty for assistive technologies": ExpertiseRuleId.AccessibilityEmptyLinks,
23
+ };
1
24
  function countMatches(html, regex) {
2
25
  return html.match(regex)?.length ?? 0;
3
26
  }
@@ -12,7 +35,12 @@ export class AccessibilityExpertise {
12
35
  outcomes.push(this.checkDialogLabelling(context.html));
13
36
  outcomes.push(this.checkPositiveTabindex(context.html));
14
37
  outcomes.push(this.checkAutoplayMedia(context.html));
15
- return outcomes;
38
+ outcomes.push(this.checkInteractiveNames(context.html));
39
+ outcomes.push(this.checkAriaReferences(context.html));
40
+ outcomes.push(this.checkClickableSemantics(context.html));
41
+ outcomes.push(this.checkEmptyLinks(context.html));
42
+ outcomes.push(...outcomesFromPageHealth(context.pageHealthIssues, ACCESSIBILITY_PAGE_HEALTH_RULE_IDS));
43
+ return applyRuleIds(outcomes, ACCESSIBILITY_RULE_IDS);
16
44
  }
17
45
  checkDocumentLanguage(html) {
18
46
  const hasLang = /<html\b[^>]*\blang=["'][^"']+["']/i.test(html);
@@ -184,5 +212,108 @@ export class AccessibilityExpertise {
184
212
  priority: 3,
185
213
  };
186
214
  }
215
+ checkInteractiveNames(html) {
216
+ const controls = html.match(/<(button|a)\b[^>]*>[\s\S]*?<\/(button|a)>/gi) ?? [];
217
+ const unnamed = controls.filter(control => {
218
+ const visibleText = control
219
+ .replace(/<svg[\s\S]*?<\/svg>/gi, " ")
220
+ .replace(/<[^>]+>/g, " ")
221
+ .replace(/\s+/g, " ")
222
+ .trim();
223
+ return (visibleText.length === 0 &&
224
+ !/\baria-label=["'][^"']+["']/i.test(control) &&
225
+ !/\baria-labelledby=["'][^"']+["']/i.test(control) &&
226
+ !/\btitle=["'][^"']+["']/i.test(control));
227
+ });
228
+ if (unnamed.length > 0) {
229
+ return {
230
+ expected: "Interactive controls should have accessible names",
231
+ observed: `${unnamed.length} button/link control(s) have no visible text or accessible label`,
232
+ result: "warning",
233
+ priority: 4,
234
+ };
235
+ }
236
+ return {
237
+ expected: "Interactive controls should have accessible names",
238
+ observed: "All detected button/link controls have accessible names",
239
+ result: "pass",
240
+ priority: 4,
241
+ };
242
+ }
243
+ checkAriaReferences(html) {
244
+ const idMatches = html.match(/\bid=["']([^"']+)["']/gi) ?? [];
245
+ const ids = new Set(idMatches.map(m => m.replace(/^id=["']|["']$/gi, "")));
246
+ const references = html.match(/\baria-(?:labelledby|describedby)=["']([^"']+)["']/gi) ?? [];
247
+ const missing = [];
248
+ for (const ref of references) {
249
+ const values = ref
250
+ .match(/=["']([^"']+)["']/)?.[1]
251
+ ?.split(/\s+/)
252
+ .filter(Boolean) ?? [];
253
+ for (const value of values) {
254
+ if (!ids.has(value))
255
+ missing.push(value);
256
+ }
257
+ }
258
+ if (missing.length > 0) {
259
+ return {
260
+ expected: "ARIA references should point to existing element IDs",
261
+ observed: `${missing.length} missing ARIA reference(s): ${missing.slice(0, 3).join(", ")}`,
262
+ result: "warning",
263
+ priority: 4,
264
+ };
265
+ }
266
+ return {
267
+ expected: "ARIA references should point to existing element IDs",
268
+ observed: "All ARIA references resolve to existing IDs",
269
+ result: "pass",
270
+ priority: 4,
271
+ };
272
+ }
273
+ checkClickableSemantics(html) {
274
+ const clickable = html.match(/<(div|span)\b[^>]*(onclick=|role=["']button["']|class=["'][^"']*(button|btn|clickable)[^"']*["'])[^>]*>/gi) ?? [];
275
+ const inaccessible = clickable.filter(item => !/\brole=["']button["']/i.test(item) ||
276
+ !/\btabindex=["']0["']/i.test(item));
277
+ if (inaccessible.length > 0) {
278
+ return {
279
+ expected: "Clickable non-semantic elements should expose role and keyboard focus",
280
+ observed: `${inaccessible.length} clickable-looking div/span element(s) lack role="button" or tabindex="0"`,
281
+ result: "warning",
282
+ priority: 4,
283
+ };
284
+ }
285
+ return {
286
+ expected: "Clickable non-semantic elements should expose role and keyboard focus",
287
+ observed: "No inaccessible clickable div/span elements detected",
288
+ result: "pass",
289
+ priority: 4,
290
+ };
291
+ }
292
+ checkEmptyLinks(html) {
293
+ const links = html.match(/<a\b[^>]*href=["'][^"']*["'][^>]*>[\s\S]*?<\/a>/gi) ?? [];
294
+ const empty = links.filter(link => {
295
+ const text = link
296
+ .replace(/<[^>]+>/g, " ")
297
+ .replace(/\s+/g, " ")
298
+ .trim();
299
+ return (text.length === 0 &&
300
+ !/\baria-label=["'][^"']+["']/i.test(link) &&
301
+ !/\baria-labelledby=["'][^"']+["']/i.test(link));
302
+ });
303
+ if (empty.length > 0) {
304
+ return {
305
+ expected: "Links should not be empty for assistive technologies",
306
+ observed: `${empty.length} link(s) have no text or accessible label`,
307
+ result: "warning",
308
+ priority: 4,
309
+ };
310
+ }
311
+ return {
312
+ expected: "Links should not be empty for assistive technologies",
313
+ observed: "No empty links detected",
314
+ result: "pass",
315
+ priority: 4,
316
+ };
317
+ }
187
318
  }
188
319
  //# sourceMappingURL=accessibility-expertise.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accessibility-expertise.js","sourceRoot":"","sources":["../../src/expertise/accessibility-expertise.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accessibility-expertise.js","sourceRoot":"","sources":["../../src/expertise/accessibility-expertise.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,13 @@ export declare class ContentExpertise implements Expertise {
7
7
  private checkPlaceholderContent;
8
8
  private checkImageAltCoverage;
9
9
  private checkBrokenLinkPatterns;
10
+ private checkPlaceholderLinks;
11
+ private checkWeakImageAltText;
10
12
  private checkLabelContextMismatch;
11
13
  private checkCurrencyConsistency;
14
+ private checkDuplicateCtaDestinations;
15
+ private checkContactPageCompleteness;
16
+ private checkProductCardEssentials;
12
17
  private checkLanguageConsistency;
13
18
  private checkDuplicateIds;
14
19
  private checkHeadingHierarchy;
@@ -1 +1 @@
1
- {"version":3,"file":"content-expertise.d.ts","sourceRoot":"","sources":["../../src/expertise/content-expertise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAWpE,qBAAa,gBAAiB,YAAW,SAAS;IAChD,IAAI,SAAa;IAEjB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,EAAE;IAoB9C,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,uBAAuB;IA2B/B,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,uBAAuB;IAkC/B,OAAO,CAAC,yBAAyB;IA2CjC,OAAO,CAAC,wBAAwB;IAgDhC,OAAO,CAAC,wBAAwB;IA6ChC,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,CAAC,uBAAuB;CA6BhC"}
1
+ {"version":3,"file":"content-expertise.d.ts","sourceRoot":"","sources":["../../src/expertise/content-expertise.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAiEpE,qBAAa,gBAAiB,YAAW,SAAS;IAChD,IAAI,SAAa;IAEjB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,EAAE;IAiC9C,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,uBAAuB;IA2B/B,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,uBAAuB;IAkC/B,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,yBAAyB;IA2CjC,OAAO,CAAC,wBAAwB;IAgDhC,OAAO,CAAC,6BAA6B;IAsCrC,OAAO,CAAC,4BAA4B;IA4CpC,OAAO,CAAC,0BAA0B;IAuClC,OAAO,CAAC,wBAAwB;IA6ChC,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,CAAC,uBAAuB;CA6BhC"}
@@ -1,3 +1,42 @@
1
+ import { ExpertiseRuleId } from "@sudobility/testomniac_types";
2
+ import { outcomesFromPageHealth } from "./page-health-outcomes";
3
+ import { applyRuleIds } from "./rule-id";
4
+ const CONTENT_PAGE_HEALTH_RULE_IDS = {
5
+ broken_image: ExpertiseRuleId.ContentPageHealthBrokenImage,
6
+ broken_link_pattern: ExpertiseRuleId.ContentPageHealthBrokenLinkPattern,
7
+ cart_math_error: ExpertiseRuleId.ContentPageHealthCartMath,
8
+ grammar_error: ExpertiseRuleId.ContentPageHealthGrammar,
9
+ defunct_service: ExpertiseRuleId.ContentPageHealthDefunctService,
10
+ missing_price: ExpertiseRuleId.ContentPageHealthMissingPrice,
11
+ invalid_price: ExpertiseRuleId.ContentPageHealthInvalidPrice,
12
+ invalid_discount: ExpertiseRuleId.ContentPageHealthInvalidDiscount,
13
+ invalid_rating: ExpertiseRuleId.ContentPageHealthInvalidRating,
14
+ placeholder_text: ExpertiseRuleId.ContentPageHealthPlaceholderText,
15
+ price_format_error: ExpertiseRuleId.ContentPageHealthPriceFormat,
16
+ empty_product_page: ExpertiseRuleId.ContentPageHealthEmptyProductPage,
17
+ missing_product_image: ExpertiseRuleId.ContentPageHealthMissingProductImage,
18
+ missing_stock_info: ExpertiseRuleId.ContentPageHealthMissingStockInfo,
19
+ };
20
+ const CONTENT_RULE_IDS = {
21
+ "Page should contain meaningful body content": ExpertiseRuleId.ContentMeaningfulBodyText,
22
+ "Page should have exactly one H1 heading": ExpertiseRuleId.ContentSingleH1,
23
+ "Page content should not contain placeholder copy": ExpertiseRuleId.ContentPlaceholderCopy,
24
+ "Images should provide alt text": ExpertiseRuleId.ContentImageAltCoverage,
25
+ "Links should not contain URL typos or malformed paths": ExpertiseRuleId.ContentBrokenLinkPatterns,
26
+ "Links should point to real destinations": ExpertiseRuleId.ContentPlaceholderLinks,
27
+ "Image alt text should describe meaningful images": ExpertiseRuleId.ContentWeakImageAltText,
28
+ "Form option labels should match the product context": ExpertiseRuleId.ContentLabelContextMismatch,
29
+ "Currency display should match selected currency": ExpertiseRuleId.ContentCurrencyConsistency,
30
+ "Repeated call-to-action labels should not point to different destinations": ExpertiseRuleId.ContentDuplicateCtaDestinations,
31
+ "Contact pages should include a concrete contact method": ExpertiseRuleId.ContentContactPageCompleteness,
32
+ "Repeated product cards should include title, image, and price": ExpertiseRuleId.ContentProductCardEssentials,
33
+ "Primary UI text should stay in a consistent language": ExpertiseRuleId.ContentLanguageConsistency,
34
+ "Element IDs should be unique within the page": ExpertiseRuleId.ContentDuplicateIds,
35
+ "Heading levels should not skip hierarchy levels": ExpertiseRuleId.ContentHeadingHierarchy,
36
+ "Page should not contain hardcoded development or staging URLs": ExpertiseRuleId.ContentHardcodedDevUrls,
37
+ "Copyright year should be current": ExpertiseRuleId.ContentOutdatedCopyright,
38
+ "Form labels should reference existing element IDs": ExpertiseRuleId.ContentOrphanedFormLabels,
39
+ };
1
40
  function stripHtml(html) {
2
41
  return html
3
42
  .replace(/<script[\s\S]*?<\/script>/gi, " ")
@@ -16,14 +55,20 @@ export class ContentExpertise {
16
55
  outcomes.push(this.checkImageAltCoverage(context.html));
17
56
  outcomes.push(this.checkLanguageConsistency(context.html));
18
57
  outcomes.push(this.checkBrokenLinkPatterns(context.html));
58
+ outcomes.push(this.checkPlaceholderLinks(context.html));
59
+ outcomes.push(this.checkWeakImageAltText(context.html));
19
60
  outcomes.push(this.checkLabelContextMismatch(context.html));
20
61
  outcomes.push(this.checkCurrencyConsistency(context.html));
62
+ outcomes.push(this.checkDuplicateCtaDestinations(context.html));
63
+ outcomes.push(this.checkContactPageCompleteness(context.html, context.currentUrl));
64
+ outcomes.push(this.checkProductCardEssentials(context.html));
21
65
  outcomes.push(this.checkDuplicateIds(context.html));
22
66
  outcomes.push(this.checkHeadingHierarchy(context.html));
23
67
  outcomes.push(this.checkHardcodedDevUrls(context.html));
24
68
  outcomes.push(this.checkOutdatedCopyright(context.html));
25
69
  outcomes.push(this.checkOrphanedFormLabels(context.html));
26
- return outcomes;
70
+ outcomes.push(...outcomesFromPageHealth(context.pageHealthIssues, CONTENT_PAGE_HEALTH_RULE_IDS));
71
+ return applyRuleIds(outcomes, CONTENT_RULE_IDS);
27
72
  }
28
73
  checkMeaningfulBodyText(html) {
29
74
  const text = stripHtml(html);
@@ -147,6 +192,50 @@ export class ContentExpertise {
147
192
  priority: 2,
148
193
  };
149
194
  }
195
+ checkPlaceholderLinks(html) {
196
+ const hrefMatches = html.match(/\bhref=["']([^"']*)["']/gi) ?? [];
197
+ const placeholders = hrefMatches.filter(match => {
198
+ const href = match.replace(/^href=["']|["']$/gi, "").trim();
199
+ return (href === "" || href === "#" || /^javascript:void\(0\)$/i.test(href));
200
+ });
201
+ if (placeholders.length > 0) {
202
+ return {
203
+ expected: "Links should point to real destinations",
204
+ observed: `${placeholders.length} placeholder link(s) found`,
205
+ result: "warning",
206
+ priority: 3,
207
+ };
208
+ }
209
+ return {
210
+ expected: "Links should point to real destinations",
211
+ observed: "No placeholder links detected",
212
+ result: "pass",
213
+ priority: 3,
214
+ };
215
+ }
216
+ checkWeakImageAltText(html) {
217
+ const images = html.match(/<img\b[^>]*>/gi) ?? [];
218
+ const weak = images.filter(image => {
219
+ const alt = image.match(/\balt\s*=\s*["']([^"']*)["']/i)?.[1]?.trim();
220
+ if (!alt)
221
+ return false;
222
+ return /^(image|photo|picture|logo|img|placeholder|untitled)$/i.test(alt);
223
+ });
224
+ if (weak.length > 0) {
225
+ return {
226
+ expected: "Image alt text should describe meaningful images",
227
+ observed: `${weak.length} image(s) use generic alt text`,
228
+ result: "warning",
229
+ priority: 4,
230
+ };
231
+ }
232
+ return {
233
+ expected: "Image alt text should describe meaningful images",
234
+ observed: "No generic image alt text detected",
235
+ result: "pass",
236
+ priority: 4,
237
+ };
238
+ }
150
239
  checkLabelContextMismatch(html) {
151
240
  // Detect option labels that don't match the product context
152
241
  // e.g., "Select Shirt Size" on a coat/jacket product page
@@ -217,6 +306,109 @@ export class ContentExpertise {
217
306
  priority: 1,
218
307
  };
219
308
  }
309
+ checkDuplicateCtaDestinations(html) {
310
+ const anchors = html.match(/<a\b[^>]*href=["'][^"']+["'][^>]*>[\s\S]*?<\/a>/gi) ?? [];
311
+ const destinationsByText = new Map();
312
+ for (const anchor of anchors) {
313
+ const href = anchor.match(/\bhref=["']([^"']+)["']/i)?.[1]?.trim();
314
+ const text = anchor
315
+ .replace(/<[^>]+>/g, " ")
316
+ .replace(/\s+/g, " ")
317
+ .trim();
318
+ if (!href || text.length < 3)
319
+ continue;
320
+ const key = text.toLowerCase();
321
+ const destinations = destinationsByText.get(key) ?? new Set();
322
+ destinations.add(href);
323
+ destinationsByText.set(key, destinations);
324
+ }
325
+ const ambiguous = Array.from(destinationsByText.entries()).filter(([text, destinations]) => destinations.size > 1 && text.length < 30);
326
+ if (ambiguous.length > 0) {
327
+ const [text, destinations] = ambiguous[0];
328
+ return {
329
+ expected: "Repeated call-to-action labels should not point to different destinations",
330
+ observed: `"${text}" points to ${destinations.size} different destinations`,
331
+ result: "warning",
332
+ priority: 3,
333
+ };
334
+ }
335
+ return {
336
+ expected: "Repeated call-to-action labels should not point to different destinations",
337
+ observed: "No ambiguous repeated call-to-action labels detected",
338
+ result: "pass",
339
+ priority: 3,
340
+ };
341
+ }
342
+ checkContactPageCompleteness(html, currentUrl) {
343
+ const text = stripHtml(html).toLowerCase();
344
+ let path = "";
345
+ try {
346
+ path = currentUrl ? new URL(currentUrl).pathname.toLowerCase() : "";
347
+ }
348
+ catch {
349
+ path = "";
350
+ }
351
+ const looksLikeContact = path.includes("contact") ||
352
+ /\b(contact us|get in touch|support)\b/i.test(text);
353
+ if (!looksLikeContact) {
354
+ return {
355
+ expected: "Contact pages should include a concrete contact method",
356
+ observed: "Page does not look like a contact page",
357
+ result: "pass",
358
+ priority: 3,
359
+ };
360
+ }
361
+ const hasContactMethod = /mailto:/i.test(html) ||
362
+ /tel:/i.test(html) ||
363
+ /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i.test(html) ||
364
+ /\+?\d[\d\s().-]{7,}\d/.test(text) ||
365
+ /<form\b/i.test(html);
366
+ if (!hasContactMethod) {
367
+ return {
368
+ expected: "Contact pages should include a concrete contact method",
369
+ observed: "Contact page has no email, phone, or form detected",
370
+ result: "warning",
371
+ priority: 3,
372
+ };
373
+ }
374
+ return {
375
+ expected: "Contact pages should include a concrete contact method",
376
+ observed: "Contact page includes email, phone, or a form",
377
+ result: "pass",
378
+ priority: 3,
379
+ };
380
+ }
381
+ checkProductCardEssentials(html) {
382
+ const cardMatches = html.match(/<[^>]+class=["'][^"']*(product|card|item)[^"']*["'][^>]*>[\s\S]{0,2500}?<\/[^>]+>/gi) ?? [];
383
+ if (cardMatches.length < 2) {
384
+ return {
385
+ expected: "Repeated product cards should include title, image, and price",
386
+ observed: "No repeated product-card pattern detected",
387
+ result: "pass",
388
+ priority: 3,
389
+ };
390
+ }
391
+ const incomplete = cardMatches.filter(card => {
392
+ const hasImage = /<img\b/i.test(card);
393
+ const hasPrice = /(?:[$€£]\s?\d|\d+(?:\.\d{2})?\s?(?:USD|EUR|GBP))/i.test(stripHtml(card));
394
+ const hasTitle = /<(h2|h3|h4)\b/i.test(card) || /\btitle=/i.test(card);
395
+ return !hasImage || !hasPrice || !hasTitle;
396
+ });
397
+ if (incomplete.length > 0) {
398
+ return {
399
+ expected: "Repeated product cards should include title, image, and price",
400
+ observed: `${incomplete.length} of ${cardMatches.length} product-like card(s) are missing title, image, or price`,
401
+ result: "warning",
402
+ priority: 3,
403
+ };
404
+ }
405
+ return {
406
+ expected: "Repeated product cards should include title, image, and price",
407
+ observed: `All ${cardMatches.length} product-like card(s) include essentials`,
408
+ result: "pass",
409
+ priority: 3,
410
+ };
411
+ }
220
412
  checkLanguageConsistency(html) {
221
413
  const langMatch = html.match(/<html\b[^>]*\blang=["']([^"']+)["']/i);
222
414
  const lang = (langMatch?.[1] ?? "").toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"content-expertise.js","sourceRoot":"","sources":["../../src/expertise/content-expertise.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,OAAO,gBAAgB;IAC3B,IAAI,GAAG,SAAS,CAAC;IAEjB,QAAQ,CAAC,OAAyB;QAChC,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACtB,OAAO;gBACL,QAAQ,EAAE,6CAA6C;gBACvD,QAAQ,EAAE,QAAQ,IAAI,CAAC,MAAM,2CAA2C;gBACxE,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,6CAA6C;YACvD,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,sCAAsC;YAC9D,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,IAAI,EAAE,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,QAAQ,EAAE,yCAAyC;gBACnD,QAAQ,EAAE,8BAA8B;gBACxC,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,QAAQ,EAAE,yCAAyC;gBACnD,QAAQ,EAAE,wBAAwB;gBAClC,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,yCAAyC;YACnD,QAAQ,EAAE,SAAS,OAAO,CAAC,MAAM,cAAc;YAC/C,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAC1C,MAAM,mBAAmB,GAAG;YAC1B,cAAc;YACd,WAAW;YACX,cAAc;YACd,cAAc;YACd,mBAAmB;SACpB,CAAC;QACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAExE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,QAAQ,EAAE,kDAAkD;gBAC5D,QAAQ,EAAE,uCAAuC,OAAO,EAAE;gBAC1D,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,kDAAkD;YAC5D,QAAQ,EAAE,sCAAsC;YAChD,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,IAAY;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,QAAQ,EAAE,gCAAgC;gBAC1C,QAAQ,EAAE,gCAAgC;gBAC1C,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAC9B,KAAK,CAAC,EAAE,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CACpD,CAAC;QACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,QAAQ,EAAE,gCAAgC;gBAC1C,QAAQ,EAAE,GAAG,UAAU,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,gCAAgC;gBAClF,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,gCAAgC;YAC1C,QAAQ,EAAE,OAAO,MAAM,CAAC,MAAM,4BAA4B;YAC1D,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAC1C,gDAAgD;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YACrD,mEAAmE;YACnE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,qCAAqC,CAAC,CAAC;YACjE,CAAC;YACD,qFAAqF;YACrF,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC9C,sGAAsG;YACxG,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,QAAQ,EAAE,uDAAuD;gBACjE,QAAQ,EAAE,SAAS,UAAU,CAAC,MAAM,wBAAwB,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC/F,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,uDAAuD;YACjE,QAAQ,EAAE,sCAAsC;YAChD,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAAC,IAAY;QAC5C,4DAA4D;QAC5D,0DAA0D;QAC1D,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,iDAAiD;QACjD,MAAM,SAAS,GAAG,CAChB,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CACtD,CAAC,WAAW,EAAE,CAAC;QAChB,IACE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,CAAC,oCAAoC,CAAC,IAAI,CAAC,SAAS,CAAC,EACrD,CAAC;YACD,MAAM,WAAW,GACf,IAAI;iBACD,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3C,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;iBACxB,IAAI,EAAE,IAAI,SAAS,CAAC;YACzB,UAAU,CAAC,IAAI,CACb,iCAAiC,WAAW,gBAAgB,CAC7D,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,uCAAuC;QAEvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,QAAQ,EAAE,qDAAqD;gBAC/D,QAAQ,EAAE,mBAAmB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACpD,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,qDAAqD;YAC/D,QAAQ,EAAE,sCAAsC;YAChD,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAAC,IAAY;QAC3C,8DAA8D;QAC9D,MAAM,cAAc,GAClB,IAAI;aACD,KAAK,CACJ,sEAAsE,CACvE,EAAE,CAAC,CAAC,CAAC;YACN,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QAErB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;gBACL,QAAQ,EAAE,iDAAiD;gBAC3D,QAAQ,EAAE,+BAA+B;gBACzC,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,gBAAgB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;QAEtD,uDAAuD;QACvD,IAAI,gBAAgB,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,OAAO;gBACL,QAAQ,EAAE,iDAAiD;gBAC3D,QAAQ,EAAE,4BAA4B,gBAAgB,0CAA0C;gBAChG,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,IAAI,gBAAgB,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,OAAO;gBACL,QAAQ,EAAE,iDAAiD;gBAC3D,QAAQ,EAAE,4BAA4B,gBAAgB,0CAA0C;gBAChG,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,iDAAiD;YAC3D,QAAQ,EAAE,mDAAmD;YAC7D,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAAC,IAAY;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,MAAM,cAAc,GAAG;YACrB,aAAa;YACb,UAAU;YACV,QAAQ;YACR,SAAS;YACT,SAAS;YACT,UAAU;YACV,SAAS;SACV,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAChD,MAAM,cAAc,GAAG;YACrB,QAAQ;YACR,SAAS;YACT,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,UAAU;YACV,aAAa;SACd,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAEzC,IACE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,CAAC;YAC9C,cAAc,CAAC,MAAM,GAAG,CAAC,EACzB,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,sDAAsD;gBAChE,QAAQ,EAAE,8CAA8C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACnF,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,sDAAsD;YAChE,QAAQ,EAAE,mDAAmD;YAC7D,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,IAAY;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAChD,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO;gBACL,QAAQ,EAAE,8CAA8C;gBACxD,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,2BAA2B,IAAI,EAAE;gBAC7D,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,8CAA8C;YACxD,QAAQ,EAAE,4BAA4B;YACtC,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,IAAY;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAE3E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,QAAQ,EAAE,iDAAiD;gBAC3D,QAAQ,EAAE,QAAQ,MAAM,CAAC,MAAM,mBAAmB;gBAClD,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO;gBACL,QAAQ,EAAE,iDAAiD;gBAC3D,QAAQ,EAAE,6BAA6B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACpE,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,iDAAiD;YAC3D,QAAQ,EAAE,iCAAiC;YAC3C,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,IAAY;QACxC,MAAM,WAAW,GAAG;YAClB,4BAA4B;YAC5B,+BAA+B;YAC/B,6BAA6B;YAC7B,qCAAqC;YACrC,wDAAwD;SACzD,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,QAAQ,EACN,+DAA+D;oBACjE,QAAQ,EAAE,0BAA0B,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;oBAC3D,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,CAAC;iBACZ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,+DAA+D;YACzE,QAAQ,EAAE,gCAAgC;YAC1C,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,IAAY;QACzC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,kDAAkD,CACnD,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;gBACL,QAAQ,EAAE,kCAAkC;gBAC5C,QAAQ,EAAE,8BAA8B;gBACxC,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,QAAQ,EAAE,kCAAkC;gBAC5C,QAAQ,EAAE,qBAAqB,OAAO,qBAAqB,WAAW,EAAE;gBACxE,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,kCAAkC;YAC5C,QAAQ,EAAE,mBAAmB,OAAO,cAAc;YAClD,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC;QACrE,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC1C,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CACnC,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CACtD,CAAC;QAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,QAAQ,EAAE,mDAAmD;gBAC7D,QAAQ,EAAE,GAAG,QAAQ,CAAC,MAAM,yCAAyC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACtG,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,mDAAmD;YAC7D,QAAQ,EAAE,6CAA6C;YACvD,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"content-expertise.js","sourceRoot":"","sources":["../../src/expertise/content-expertise.ts"],"names":[],"mappings":"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"}