@elementor/editor-audits 4.4.0-1106 → 4.4.0-1107
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +343 -255
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +340 -252
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
- package/src/audits/accessibility-statement.ts +39 -0
- package/src/audits/accessibility-widget.ts +41 -0
- package/src/audits/google-consent-mode.ts +4 -7
- package/src/components/violation-cta-button.tsx +3 -2
- package/src/components/violation-row.tsx +13 -4
- package/src/register-audits.ts +4 -0
- package/src/runner.ts +6 -2
- package/src/types.ts +6 -0
- package/src/utils/scan-accessibility-widgets.ts +7 -0
package/dist/index.mjs
CHANGED
|
@@ -103,8 +103,8 @@ async function requestPageContext(documentId, imageSizeRequests, allowNonceRetry
|
|
|
103
103
|
|
|
104
104
|
// src/registry.ts
|
|
105
105
|
var registry = /* @__PURE__ */ new Map();
|
|
106
|
-
function registerAudit(
|
|
107
|
-
registry.set(
|
|
106
|
+
function registerAudit(audit25) {
|
|
107
|
+
registry.set(audit25.id, audit25);
|
|
108
108
|
}
|
|
109
109
|
function getRegisteredAudits() {
|
|
110
110
|
return Array.from(registry.values());
|
|
@@ -141,8 +141,8 @@ var CATEGORY_LABELS = {
|
|
|
141
141
|
import { __ as __2 } from "@wordpress/i18n";
|
|
142
142
|
|
|
143
143
|
// src/utils/is-scored-audit.ts
|
|
144
|
-
function isScoredAudit(
|
|
145
|
-
return
|
|
144
|
+
function isScoredAudit(audit25) {
|
|
145
|
+
return audit25.weight > 0;
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
// src/utils/sort-failed-audits.ts
|
|
@@ -198,8 +198,8 @@ function auditStatusDisplayCounts(report) {
|
|
|
198
198
|
let pass = 0;
|
|
199
199
|
let skipped = 0;
|
|
200
200
|
let totalViolations = 0;
|
|
201
|
-
for (const { audit:
|
|
202
|
-
if (!isScoredAudit(
|
|
201
|
+
for (const { audit: audit25, result } of report.auditResults) {
|
|
202
|
+
if (!isScoredAudit(audit25)) {
|
|
203
203
|
continue;
|
|
204
204
|
}
|
|
205
205
|
switch (result.status) {
|
|
@@ -249,16 +249,16 @@ function computeReport(documentId, results) {
|
|
|
249
249
|
const accumulators = Object.fromEntries(
|
|
250
250
|
ALL_CATEGORIES.map((c) => [c, { totalWeight: 0, passedWeight: 0, total: 0, failed: 0 }])
|
|
251
251
|
);
|
|
252
|
-
for (const { audit:
|
|
252
|
+
for (const { audit: audit25, result } of results) {
|
|
253
253
|
if (result.status === "skipped") {
|
|
254
254
|
continue;
|
|
255
255
|
}
|
|
256
|
-
for (const category of
|
|
256
|
+
for (const category of audit25.categories) {
|
|
257
257
|
const acc = accumulators[category];
|
|
258
258
|
acc.total++;
|
|
259
|
-
acc.totalWeight +=
|
|
259
|
+
acc.totalWeight += audit25.weight;
|
|
260
260
|
if (result.status === "pass") {
|
|
261
|
-
acc.passedWeight +=
|
|
261
|
+
acc.passedWeight += audit25.weight;
|
|
262
262
|
} else {
|
|
263
263
|
acc.failed++;
|
|
264
264
|
}
|
|
@@ -282,6 +282,27 @@ function computeReport(documentId, results) {
|
|
|
282
282
|
};
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
+
// src/utils/fetch-rendered-html.ts
|
|
286
|
+
var FETCH_TIMEOUT_MS = 1e4;
|
|
287
|
+
async function fetchRenderedHtml(url) {
|
|
288
|
+
if (!url) {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
const timeoutController = new AbortController();
|
|
292
|
+
const timeoutId = setTimeout(() => timeoutController.abort(), FETCH_TIMEOUT_MS);
|
|
293
|
+
try {
|
|
294
|
+
const response = await fetch(url, { credentials: "omit", signal: timeoutController.signal });
|
|
295
|
+
if (!response.ok) {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
return await response.text();
|
|
299
|
+
} catch {
|
|
300
|
+
return null;
|
|
301
|
+
} finally {
|
|
302
|
+
clearTimeout(timeoutId);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
285
306
|
// src/utils/atomic-background-image-sources.ts
|
|
286
307
|
import { getElementStyles } from "@elementor/editor-elements";
|
|
287
308
|
import {
|
|
@@ -553,14 +574,17 @@ async function runPageAudit(documentId) {
|
|
|
553
574
|
const imageSizeRequests = extractImageSizeRequests(tree);
|
|
554
575
|
const pageContext = await fetchPageContext(documentId, imageSizeRequests);
|
|
555
576
|
const elements = { documentId, tree };
|
|
556
|
-
const kit = await
|
|
557
|
-
|
|
577
|
+
const [kit, renderedHtml] = await Promise.all([
|
|
578
|
+
readKitSnapshot(pageContext.kit_id),
|
|
579
|
+
fetchRenderedHtml(pageContext.frontend_url)
|
|
580
|
+
]);
|
|
581
|
+
const ctx = { documentId, elements, pageContext, kit, renderedHtml };
|
|
558
582
|
const registered = getRegisteredAudits();
|
|
559
583
|
const auditResults = await Promise.all(
|
|
560
|
-
registered.map(async (
|
|
561
|
-
const { evaluate: _evaluate, ...meta } =
|
|
584
|
+
registered.map(async (audit25) => {
|
|
585
|
+
const { evaluate: _evaluate, ...meta } = audit25;
|
|
562
586
|
try {
|
|
563
|
-
const result = await
|
|
587
|
+
const result = await audit25.evaluate(ctx);
|
|
564
588
|
return { audit: meta, result };
|
|
565
589
|
} catch (error) {
|
|
566
590
|
const reason = error instanceof Error ? error.message : "unknown-error";
|
|
@@ -1022,13 +1046,13 @@ function SeverityIcon({ severity }) {
|
|
|
1022
1046
|
// src/components/violation-cta-button.tsx
|
|
1023
1047
|
import * as React9 from "react";
|
|
1024
1048
|
import { Button as Button3 } from "@elementor/ui";
|
|
1025
|
-
function ViolationCtaButton({ ctaLabel, externalUrl }) {
|
|
1049
|
+
function ViolationCtaButton({ ctaLabel, externalUrl, variant = "outlined" }) {
|
|
1026
1050
|
const handleClick = (event) => {
|
|
1027
1051
|
event.stopPropagation();
|
|
1028
1052
|
event.preventDefault();
|
|
1029
1053
|
window.open(externalUrl, "_blank", "noopener");
|
|
1030
1054
|
};
|
|
1031
|
-
return /* @__PURE__ */ React9.createElement(Button3, { variant
|
|
1055
|
+
return /* @__PURE__ */ React9.createElement(Button3, { variant, color: "secondary", size: "small", onClick: handleClick }, ctaLabel);
|
|
1032
1056
|
}
|
|
1033
1057
|
|
|
1034
1058
|
// src/components/violation-icons.tsx
|
|
@@ -1060,13 +1084,13 @@ function ViolationIcon({ violation, widgetIcon }) {
|
|
|
1060
1084
|
function SkipReasonTooltip({ reason }) {
|
|
1061
1085
|
return /* @__PURE__ */ React11.createElement(Tooltip3, { title: reason, placement: "top" }, /* @__PURE__ */ React11.createElement(Box7, { "aria-label": reason, component: "span", sx: { display: "inline-flex", alignItems: "center" } }, /* @__PURE__ */ React11.createElement(HelpIcon, { fontSize: "small", color: "action" })));
|
|
1062
1086
|
}
|
|
1063
|
-
function StatusIndicator({ audit:
|
|
1087
|
+
function StatusIndicator({ audit: audit25, violations }) {
|
|
1064
1088
|
if (violations) {
|
|
1065
|
-
return /* @__PURE__ */ React11.createElement(React11.Fragment, null, isScoredAudit(
|
|
1089
|
+
return /* @__PURE__ */ React11.createElement(React11.Fragment, null, isScoredAudit(audit25) && /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", color: "text.secondary", fontWeight: "bold" }, violations.length), /* @__PURE__ */ React11.createElement(SeverityIcon, { severity: audit25.severity }));
|
|
1066
1090
|
}
|
|
1067
1091
|
return /* @__PURE__ */ React11.createElement(CheckIcon, { fontSize: "small", color: "success" });
|
|
1068
1092
|
}
|
|
1069
|
-
function ViolationRow({ audit:
|
|
1093
|
+
function ViolationRow({ audit: audit25, skipReason, violations }) {
|
|
1070
1094
|
const [expanded, setExpanded] = useState3(false);
|
|
1071
1095
|
const toggleExpanded = () => setExpanded((value) => !value);
|
|
1072
1096
|
return /* @__PURE__ */ React11.createElement(Box7, { sx: { borderBottom: 1, borderColor: "divider", paddingBlock: 0.5 } }, /* @__PURE__ */ React11.createElement(Box7, { sx: { display: "flex", alignItems: "center", gap: 0.5 } }, /* @__PURE__ */ React11.createElement(
|
|
@@ -1082,8 +1106,8 @@ function ViolationRow({ audit: audit23, skipReason, violations }) {
|
|
|
1082
1106
|
},
|
|
1083
1107
|
onClick: toggleExpanded
|
|
1084
1108
|
},
|
|
1085
|
-
/* @__PURE__ */ React11.createElement(Typography6, { variant: "body2", sx: { flex: 1 } },
|
|
1086
|
-
!skipReason && /* @__PURE__ */ React11.createElement(StatusIndicator, { audit:
|
|
1109
|
+
/* @__PURE__ */ React11.createElement(Typography6, { variant: "body2", sx: { flex: 1 } }, audit25.title),
|
|
1110
|
+
!skipReason && /* @__PURE__ */ React11.createElement(StatusIndicator, { audit: audit25, violations })
|
|
1087
1111
|
), skipReason && /* @__PURE__ */ React11.createElement(SkipReasonTooltip, { reason: skipReason }), /* @__PURE__ */ React11.createElement(
|
|
1088
1112
|
IconButton5,
|
|
1089
1113
|
{
|
|
@@ -1109,7 +1133,7 @@ function ViolationRow({ audit: audit23, skipReason, violations }) {
|
|
|
1109
1133
|
icon: /* @__PURE__ */ React11.createElement(AlertCircleIcon2, { fontSize: "small", color: "secondary", "aria-hidden": true })
|
|
1110
1134
|
},
|
|
1111
1135
|
/* @__PURE__ */ React11.createElement(AlertTitle, null, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", component: "p", color: "text.primary", fontWeight: "bold" }, __11("What's the issue", "elementor"))),
|
|
1112
|
-
/* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", component: "p", color: "text.secondary" },
|
|
1136
|
+
/* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", component: "p", color: "text.secondary" }, audit25.description)
|
|
1113
1137
|
), /* @__PURE__ */ React11.createElement(
|
|
1114
1138
|
Alert,
|
|
1115
1139
|
{
|
|
@@ -1118,7 +1142,7 @@ function ViolationRow({ audit: audit23, skipReason, violations }) {
|
|
|
1118
1142
|
icon: /* @__PURE__ */ React11.createElement(BulbIcon2, { fontSize: "small", color: "info", "aria-hidden": true })
|
|
1119
1143
|
},
|
|
1120
1144
|
/* @__PURE__ */ React11.createElement(AlertTitle, null, /* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", component: "p", color: "text.primary", fontWeight: "bold" }, __11("How to resolve", "elementor"))),
|
|
1121
|
-
/* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", component: "p", color: "text.secondary" },
|
|
1145
|
+
/* @__PURE__ */ React11.createElement(Typography6, { variant: "caption", component: "p", color: "text.secondary" }, audit25.fixHint)
|
|
1122
1146
|
)), violations && violations.length > 0 && /* @__PURE__ */ React11.createElement(Box7, { role: "list", sx: { paddingBlockEnd: 1, paddingInlineStart: 2 } }, violations.map((violation, idx) => {
|
|
1123
1147
|
const widgetIcon = violation.elementId ? getElementIcon(violation.elementId) : null;
|
|
1124
1148
|
const elementTitle = violation.elementId ? getElementTitle(violation.elementId) : null;
|
|
@@ -1154,13 +1178,20 @@ function ViolationRow({ audit: audit23, skipReason, violations }) {
|
|
|
1154
1178
|
prompt: violation.angiePrompt ?? buildAngiePrompt(rowLabel)
|
|
1155
1179
|
}
|
|
1156
1180
|
),
|
|
1157
|
-
violation.ctaLabel && violation.externalUrl ? /* @__PURE__ */ React11.createElement(
|
|
1181
|
+
violation.ctaLabel && violation.externalUrl ? /* @__PURE__ */ React11.createElement(Box7, { sx: { display: "flex", alignItems: "center", gap: 0.5 } }, /* @__PURE__ */ React11.createElement(
|
|
1158
1182
|
ViolationCtaButton,
|
|
1159
1183
|
{
|
|
1160
1184
|
ctaLabel: violation.ctaLabel,
|
|
1161
1185
|
externalUrl: violation.externalUrl
|
|
1162
1186
|
}
|
|
1163
|
-
)
|
|
1187
|
+
), violation.secondaryCtaLabel && violation.secondaryCtaUrl && /* @__PURE__ */ React11.createElement(
|
|
1188
|
+
ViolationCtaButton,
|
|
1189
|
+
{
|
|
1190
|
+
ctaLabel: violation.secondaryCtaLabel,
|
|
1191
|
+
externalUrl: violation.secondaryCtaUrl,
|
|
1192
|
+
variant: "text"
|
|
1193
|
+
}
|
|
1194
|
+
)) : /* @__PURE__ */ React11.createElement(
|
|
1164
1195
|
EyeIcon,
|
|
1165
1196
|
{
|
|
1166
1197
|
className: "violation-hover-icon",
|
|
@@ -1258,17 +1289,17 @@ import { __ as __14 } from "@wordpress/i18n";
|
|
|
1258
1289
|
var ALL_SEVERITIES = ["error", "warning", "info"];
|
|
1259
1290
|
function countSeverities(report, category) {
|
|
1260
1291
|
const counts = { error: 0, warning: 0, info: 0 };
|
|
1261
|
-
for (const { audit:
|
|
1292
|
+
for (const { audit: audit25, result } of report.auditResults) {
|
|
1262
1293
|
if (result.status !== "fail") {
|
|
1263
1294
|
continue;
|
|
1264
1295
|
}
|
|
1265
|
-
if (category && !
|
|
1296
|
+
if (category && !audit25.categories.includes(category)) {
|
|
1266
1297
|
continue;
|
|
1267
1298
|
}
|
|
1268
|
-
if (!isScoredAudit(
|
|
1299
|
+
if (!isScoredAudit(audit25)) {
|
|
1269
1300
|
continue;
|
|
1270
1301
|
}
|
|
1271
|
-
counts[
|
|
1302
|
+
counts[audit25.severity] += result.violations.length;
|
|
1272
1303
|
}
|
|
1273
1304
|
return counts;
|
|
1274
1305
|
}
|
|
@@ -1952,16 +1983,93 @@ var audit = {
|
|
|
1952
1983
|
}
|
|
1953
1984
|
};
|
|
1954
1985
|
|
|
1955
|
-
// src/audits/
|
|
1986
|
+
// src/audits/accessibility-statement.ts
|
|
1956
1987
|
import { __ as __26 } from "@wordpress/i18n";
|
|
1957
1988
|
var audit2 = {
|
|
1958
|
-
id: "audits/
|
|
1959
|
-
title: __26("
|
|
1989
|
+
id: "audits/accessibility-statement",
|
|
1990
|
+
title: __26("Create an accessibility statement", "elementor"),
|
|
1960
1991
|
description: __26(
|
|
1992
|
+
"An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility.",
|
|
1993
|
+
"elementor"
|
|
1994
|
+
),
|
|
1995
|
+
fixHint: __26("Use Ally to create and publish an accessibility statement for your site.", "elementor"),
|
|
1996
|
+
categories: ["accessibility"],
|
|
1997
|
+
severity: "info",
|
|
1998
|
+
weight: 1,
|
|
1999
|
+
evaluate: (ctx) => {
|
|
2000
|
+
const isReady = ctx.pageContext.ally_plugin_active;
|
|
2001
|
+
if (isReady && ctx.pageContext.ally_accessibility_statement_created) {
|
|
2002
|
+
return { status: "pass" };
|
|
2003
|
+
}
|
|
2004
|
+
return {
|
|
2005
|
+
status: "fail",
|
|
2006
|
+
violations: [
|
|
2007
|
+
{
|
|
2008
|
+
auditId: audit2.id,
|
|
2009
|
+
label: __26("No accessibility statement has been created for this site.", "elementor"),
|
|
2010
|
+
externalUrl: isReady ? ctx.pageContext.ally_accessibility_statement_url : ctx.pageContext.ally_plugin_url,
|
|
2011
|
+
ctaLabel: isReady ? __26("Create", "elementor") : void 0,
|
|
2012
|
+
secondaryCtaLabel: __26("Learn more", "elementor"),
|
|
2013
|
+
secondaryCtaUrl: "https://go.elementor.com/acc-plg-learn-more"
|
|
2014
|
+
}
|
|
2015
|
+
]
|
|
2016
|
+
};
|
|
2017
|
+
}
|
|
2018
|
+
};
|
|
2019
|
+
|
|
2020
|
+
// src/audits/accessibility-widget.ts
|
|
2021
|
+
import { __ as __27 } from "@wordpress/i18n";
|
|
2022
|
+
|
|
2023
|
+
// src/utils/scan-accessibility-widgets.ts
|
|
2024
|
+
var ACCESSIBILITY_WIDGET_SCRIPT_SOURCES = ["cdn.elementor.com/a11y/widget.js"];
|
|
2025
|
+
function hasAccessibilityWidgetScript(html) {
|
|
2026
|
+
return ACCESSIBILITY_WIDGET_SCRIPT_SOURCES.some((src) => html.includes(src));
|
|
2027
|
+
}
|
|
2028
|
+
|
|
2029
|
+
// src/audits/accessibility-widget.ts
|
|
2030
|
+
var audit3 = {
|
|
2031
|
+
id: "audits/accessibility-widget",
|
|
2032
|
+
title: __27("Add an accessibility widget", "elementor"),
|
|
2033
|
+
description: __27("Make your site more inclusive by adding an accessibility widget.", "elementor"),
|
|
2034
|
+
fixHint: __27("Activate Ally\u2019s accessibility widget to give visitors on-page accessibility tools.", "elementor"),
|
|
2035
|
+
categories: ["accessibility"],
|
|
2036
|
+
severity: "info",
|
|
2037
|
+
weight: 1,
|
|
2038
|
+
evaluate: (ctx) => {
|
|
2039
|
+
if (!ctx.pageContext.frontend_url) {
|
|
2040
|
+
return { status: "skipped", reason: __27("Page is not published.", "elementor") };
|
|
2041
|
+
}
|
|
2042
|
+
if (!ctx.renderedHtml) {
|
|
2043
|
+
return { status: "skipped", reason: __27("Could not fetch the published page.", "elementor") };
|
|
2044
|
+
}
|
|
2045
|
+
if (hasAccessibilityWidgetScript(ctx.renderedHtml)) {
|
|
2046
|
+
return { status: "pass" };
|
|
2047
|
+
}
|
|
2048
|
+
const isReady = ctx.pageContext.ally_plugin_active;
|
|
2049
|
+
return {
|
|
2050
|
+
status: "fail",
|
|
2051
|
+
violations: [
|
|
2052
|
+
{
|
|
2053
|
+
auditId: audit3.id,
|
|
2054
|
+
label: __27("No accessibility widget is active on this site.", "elementor"),
|
|
2055
|
+
externalUrl: isReady ? ctx.pageContext.ally_widget_settings_url : ctx.pageContext.ally_plugin_url,
|
|
2056
|
+
ctaLabel: __27("Activate", "elementor")
|
|
2057
|
+
}
|
|
2058
|
+
]
|
|
2059
|
+
};
|
|
2060
|
+
}
|
|
2061
|
+
};
|
|
2062
|
+
|
|
2063
|
+
// src/audits/cookie-policy.ts
|
|
2064
|
+
import { __ as __28 } from "@wordpress/i18n";
|
|
2065
|
+
var audit4 = {
|
|
2066
|
+
id: "audits/cookie-policy",
|
|
2067
|
+
title: __28("Cookie policy", "elementor"),
|
|
2068
|
+
description: __28(
|
|
1961
2069
|
"A cookie policy is required by privacy regulations such as GDPR (EU) or CCPA (US) to inform visitors about tracking and data collection.",
|
|
1962
2070
|
"elementor"
|
|
1963
2071
|
),
|
|
1964
|
-
fixHint:
|
|
2072
|
+
fixHint: __28("Install the Cookiez plugin to add a cookie policy to your website.", "elementor"),
|
|
1965
2073
|
categories: ["compliance"],
|
|
1966
2074
|
severity: "info",
|
|
1967
2075
|
weight: 1,
|
|
@@ -1973,8 +2081,8 @@ var audit2 = {
|
|
|
1973
2081
|
status: "fail",
|
|
1974
2082
|
violations: [
|
|
1975
2083
|
{
|
|
1976
|
-
auditId:
|
|
1977
|
-
label:
|
|
2084
|
+
auditId: audit4.id,
|
|
2085
|
+
label: __28("Cookiez plugin is not installed or active.", "elementor"),
|
|
1978
2086
|
externalUrl: ctx.pageContext.cookiez_plugin_url
|
|
1979
2087
|
}
|
|
1980
2088
|
]
|
|
@@ -1984,7 +2092,7 @@ var audit2 = {
|
|
|
1984
2092
|
|
|
1985
2093
|
// src/audits/deep-nesting.ts
|
|
1986
2094
|
import { getWidgetsCache } from "@elementor/editor-elements";
|
|
1987
|
-
import { __ as
|
|
2095
|
+
import { __ as __29 } from "@wordpress/i18n";
|
|
1988
2096
|
var MAX_NESTING_DEPTH = 6;
|
|
1989
2097
|
function isNestingElement(node, widgetsCache) {
|
|
1990
2098
|
if (node.elType === "container") {
|
|
@@ -1992,20 +2100,20 @@ function isNestingElement(node, widgetsCache) {
|
|
|
1992
2100
|
}
|
|
1993
2101
|
return !!widgetsCache?.[node.elType]?.meta?.is_container;
|
|
1994
2102
|
}
|
|
1995
|
-
var
|
|
2103
|
+
var audit5 = {
|
|
1996
2104
|
id: "audits/deep-nesting",
|
|
1997
|
-
title:
|
|
1998
|
-
description:
|
|
2105
|
+
title: __29("Deep container nesting", "elementor"),
|
|
2106
|
+
description: __29(
|
|
1999
2107
|
"Container nesting exceeds the recommended depth. Deep DOM trees hurt rendering performance and readability.",
|
|
2000
2108
|
"elementor"
|
|
2001
2109
|
),
|
|
2002
|
-
fixHint:
|
|
2110
|
+
fixHint: __29("Flatten the layout by removing unnecessary wrapper containers.", "elementor"),
|
|
2003
2111
|
categories: ["performance", "best-practices"],
|
|
2004
2112
|
severity: "warning",
|
|
2005
2113
|
weight: 5,
|
|
2006
2114
|
evaluate: (ctx) => {
|
|
2007
2115
|
if (ctx.elements.tree.length === 0) {
|
|
2008
|
-
return { status: "skipped", reason:
|
|
2116
|
+
return { status: "skipped", reason: __29("No elements", "elementor") };
|
|
2009
2117
|
}
|
|
2010
2118
|
const widgetsCache = getWidgetsCache();
|
|
2011
2119
|
const violations = [];
|
|
@@ -2016,10 +2124,10 @@ var audit3 = {
|
|
|
2016
2124
|
const depth = parents.filter((parent) => isNestingElement(parent, widgetsCache)).length + 1;
|
|
2017
2125
|
if (depth > MAX_NESTING_DEPTH) {
|
|
2018
2126
|
violations.push({
|
|
2019
|
-
auditId:
|
|
2127
|
+
auditId: audit5.id,
|
|
2020
2128
|
elementId: node.id,
|
|
2021
2129
|
targetHint: "element-settings",
|
|
2022
|
-
label:
|
|
2130
|
+
label: __29("Container nesting is too deep.", "elementor")
|
|
2023
2131
|
});
|
|
2024
2132
|
}
|
|
2025
2133
|
});
|
|
@@ -2028,15 +2136,15 @@ var audit3 = {
|
|
|
2028
2136
|
};
|
|
2029
2137
|
|
|
2030
2138
|
// src/audits/default-design-system.ts
|
|
2031
|
-
import { __ as
|
|
2032
|
-
var
|
|
2139
|
+
import { __ as __30 } from "@wordpress/i18n";
|
|
2140
|
+
var audit6 = {
|
|
2033
2141
|
id: "audits/default-design-system",
|
|
2034
|
-
title:
|
|
2035
|
-
description:
|
|
2142
|
+
title: __30("Default website kit", "elementor"),
|
|
2143
|
+
description: __30(
|
|
2036
2144
|
"Your website is using the default design system colors and fonts. Custom branding makes the website feel uniquely yours.",
|
|
2037
2145
|
"elementor"
|
|
2038
2146
|
),
|
|
2039
|
-
fixHint:
|
|
2147
|
+
fixHint: __30("Open Site Settings and customize your kit (colors, fonts, layout).", "elementor"),
|
|
2040
2148
|
categories: ["best-practices"],
|
|
2041
2149
|
severity: "info",
|
|
2042
2150
|
weight: 1,
|
|
@@ -2048,8 +2156,8 @@ var audit4 = {
|
|
|
2048
2156
|
status: "fail",
|
|
2049
2157
|
violations: [
|
|
2050
2158
|
{
|
|
2051
|
-
auditId:
|
|
2052
|
-
label:
|
|
2159
|
+
auditId: audit6.id,
|
|
2160
|
+
label: __30("Kit appears unchanged from default.", "elementor"),
|
|
2053
2161
|
targetHint: "site-settings"
|
|
2054
2162
|
}
|
|
2055
2163
|
]
|
|
@@ -2059,16 +2167,16 @@ var audit4 = {
|
|
|
2059
2167
|
|
|
2060
2168
|
// src/audits/deprecated-widgets.ts
|
|
2061
2169
|
import { getWidgetsCache as getWidgetsCache2 } from "@elementor/editor-elements";
|
|
2062
|
-
import { __ as
|
|
2170
|
+
import { __ as __31 } from "@wordpress/i18n";
|
|
2063
2171
|
var DEPRECATION_CONTROL_NAME = "deprecation_message";
|
|
2064
|
-
var
|
|
2172
|
+
var audit7 = {
|
|
2065
2173
|
id: "audits/deprecated-widgets",
|
|
2066
|
-
title:
|
|
2067
|
-
description:
|
|
2174
|
+
title: __31("Deprecated widgets", "elementor"),
|
|
2175
|
+
description: __31(
|
|
2068
2176
|
"Deprecated widgets should not be used. For better capabilities use the recommended replacement.",
|
|
2069
2177
|
"elementor"
|
|
2070
2178
|
),
|
|
2071
|
-
fixHint:
|
|
2179
|
+
fixHint: __31("Replace each deprecated widget with the recommended new widget shown in its panel.", "elementor"),
|
|
2072
2180
|
categories: ["best-practices", "performance"],
|
|
2073
2181
|
severity: "warning",
|
|
2074
2182
|
weight: 7,
|
|
@@ -2092,10 +2200,10 @@ var audit5 = {
|
|
|
2092
2200
|
return;
|
|
2093
2201
|
}
|
|
2094
2202
|
violations.push({
|
|
2095
|
-
auditId:
|
|
2203
|
+
auditId: audit7.id,
|
|
2096
2204
|
elementId: node.id,
|
|
2097
2205
|
targetHint: "element-settings",
|
|
2098
|
-
label:
|
|
2206
|
+
label: __31("Using deprecated widget.", "elementor")
|
|
2099
2207
|
});
|
|
2100
2208
|
});
|
|
2101
2209
|
return violations.length === 0 ? { status: "pass" } : { status: "fail", violations };
|
|
@@ -2103,28 +2211,7 @@ var audit5 = {
|
|
|
2103
2211
|
};
|
|
2104
2212
|
|
|
2105
2213
|
// src/audits/google-consent-mode.ts
|
|
2106
|
-
import { __ as
|
|
2107
|
-
|
|
2108
|
-
// src/utils/fetch-rendered-html.ts
|
|
2109
|
-
var FETCH_TIMEOUT_MS = 1e4;
|
|
2110
|
-
async function fetchRenderedHtml(url) {
|
|
2111
|
-
if (!url) {
|
|
2112
|
-
return null;
|
|
2113
|
-
}
|
|
2114
|
-
const timeoutController = new AbortController();
|
|
2115
|
-
const timeoutId = setTimeout(() => timeoutController.abort(), FETCH_TIMEOUT_MS);
|
|
2116
|
-
try {
|
|
2117
|
-
const response = await fetch(url, { credentials: "omit", signal: timeoutController.signal });
|
|
2118
|
-
if (!response.ok) {
|
|
2119
|
-
return null;
|
|
2120
|
-
}
|
|
2121
|
-
return await response.text();
|
|
2122
|
-
} catch {
|
|
2123
|
-
return null;
|
|
2124
|
-
} finally {
|
|
2125
|
-
clearTimeout(timeoutId);
|
|
2126
|
-
}
|
|
2127
|
-
}
|
|
2214
|
+
import { __ as __32 } from "@wordpress/i18n";
|
|
2128
2215
|
|
|
2129
2216
|
// src/utils/scan-consent-signals.ts
|
|
2130
2217
|
var GOOGLE_TRACKING_PATTERNS = [
|
|
@@ -2145,44 +2232,43 @@ function hasConsentDefaultCall(html) {
|
|
|
2145
2232
|
}
|
|
2146
2233
|
|
|
2147
2234
|
// src/audits/google-consent-mode.ts
|
|
2148
|
-
var
|
|
2235
|
+
var audit8 = {
|
|
2149
2236
|
id: "audits/google-consent-mode",
|
|
2150
|
-
title:
|
|
2151
|
-
description:
|
|
2237
|
+
title: __32("Google Consent Mode", "elementor"),
|
|
2238
|
+
description: __32(
|
|
2152
2239
|
"Google Analytics, Ads, or Tag Manager are running on this site and may not receive a consent signal, which risks losing conversion/analytics data and compliance exposure.",
|
|
2153
2240
|
"elementor"
|
|
2154
2241
|
),
|
|
2155
|
-
fixHint:
|
|
2242
|
+
fixHint: __32(
|
|
2156
2243
|
"Turn on Google Consent Mode in your cookie consent plugin so Google tags respect visitor consent choices.",
|
|
2157
2244
|
"elementor"
|
|
2158
2245
|
),
|
|
2159
2246
|
categories: ["compliance"],
|
|
2160
2247
|
severity: "warning",
|
|
2161
2248
|
weight: 1,
|
|
2162
|
-
evaluate:
|
|
2249
|
+
evaluate: (ctx) => {
|
|
2163
2250
|
if (!ctx.pageContext.frontend_url) {
|
|
2164
|
-
return { status: "skipped", reason:
|
|
2251
|
+
return { status: "skipped", reason: __32("Page is not published.", "elementor") };
|
|
2165
2252
|
}
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
return { status: "skipped", reason: __30("Could not fetch the published page.", "elementor") };
|
|
2253
|
+
if (!ctx.renderedHtml) {
|
|
2254
|
+
return { status: "skipped", reason: __32("Could not fetch the published page.", "elementor") };
|
|
2169
2255
|
}
|
|
2170
|
-
if (!hasGoogleTracking(
|
|
2171
|
-
return { status: "skipped", reason:
|
|
2256
|
+
if (!hasGoogleTracking(ctx.renderedHtml)) {
|
|
2257
|
+
return { status: "skipped", reason: __32("No Google tracking product detected.", "elementor") };
|
|
2172
2258
|
}
|
|
2173
|
-
if (hasConsentDefaultCall(
|
|
2259
|
+
if (hasConsentDefaultCall(ctx.renderedHtml)) {
|
|
2174
2260
|
return { status: "pass" };
|
|
2175
2261
|
}
|
|
2176
|
-
const label =
|
|
2262
|
+
const label = __32("No Google Consent Mode signal was found on the page.", "elementor");
|
|
2177
2263
|
const isCookiezReady = ctx.pageContext.cookiez_plugin_installed && ctx.pageContext.cookiez_plugin_active;
|
|
2178
2264
|
if (isCookiezReady) {
|
|
2179
2265
|
return {
|
|
2180
2266
|
status: "fail",
|
|
2181
2267
|
violations: [
|
|
2182
2268
|
{
|
|
2183
|
-
auditId:
|
|
2269
|
+
auditId: audit8.id,
|
|
2184
2270
|
label,
|
|
2185
|
-
ctaLabel:
|
|
2271
|
+
ctaLabel: __32("Enable", "elementor"),
|
|
2186
2272
|
externalUrl: ctx.pageContext.cookiez_consent_mode_settings_url
|
|
2187
2273
|
}
|
|
2188
2274
|
]
|
|
@@ -2192,7 +2278,7 @@ var audit6 = {
|
|
|
2192
2278
|
status: "fail",
|
|
2193
2279
|
violations: [
|
|
2194
2280
|
{
|
|
2195
|
-
auditId:
|
|
2281
|
+
auditId: audit8.id,
|
|
2196
2282
|
label,
|
|
2197
2283
|
externalUrl: ctx.pageContext.cookiez_plugin_action_url
|
|
2198
2284
|
}
|
|
@@ -2202,7 +2288,7 @@ var audit6 = {
|
|
|
2202
2288
|
};
|
|
2203
2289
|
|
|
2204
2290
|
// src/audits/heading-structure.ts
|
|
2205
|
-
import { __ as
|
|
2291
|
+
import { __ as __33 } from "@wordpress/i18n";
|
|
2206
2292
|
var HEADING_LEVELS = ["h1", "h2", "h3", "h4", "h5", "h6"];
|
|
2207
2293
|
var HEADING_CONTROLS_REGISTRY = {
|
|
2208
2294
|
// Core
|
|
@@ -2378,47 +2464,47 @@ function extractPageHeadings(tree) {
|
|
|
2378
2464
|
});
|
|
2379
2465
|
return headings;
|
|
2380
2466
|
}
|
|
2381
|
-
var
|
|
2467
|
+
var audit9 = {
|
|
2382
2468
|
id: "audits/heading-structure",
|
|
2383
|
-
title:
|
|
2384
|
-
description:
|
|
2385
|
-
fixHint:
|
|
2469
|
+
title: __33("Heading structure", "elementor"),
|
|
2470
|
+
description: __33("Pages should have exactly one H1 and a non-skipping heading order.", "elementor"),
|
|
2471
|
+
fixHint: __33("Ensure your page has one H1 and that heading levels do not skip (no H2 \u2192 H4).", "elementor"),
|
|
2386
2472
|
categories: ["seo", "accessibility"],
|
|
2387
2473
|
severity: "error",
|
|
2388
2474
|
weight: 10,
|
|
2389
2475
|
evaluate: (ctx) => {
|
|
2390
2476
|
if (ctx.elements.tree.length === 0) {
|
|
2391
|
-
return { status: "skipped", reason:
|
|
2477
|
+
return { status: "skipped", reason: __33("No elements", "elementor") };
|
|
2392
2478
|
}
|
|
2393
2479
|
const headings = extractPageHeadings(ctx.elements.tree);
|
|
2394
2480
|
const violations = [];
|
|
2395
2481
|
if (headings.length === 0) {
|
|
2396
2482
|
violations.push({
|
|
2397
|
-
auditId:
|
|
2398
|
-
label:
|
|
2483
|
+
auditId: audit9.id,
|
|
2484
|
+
label: __33("No headings found on the page.", "elementor")
|
|
2399
2485
|
});
|
|
2400
2486
|
} else {
|
|
2401
2487
|
const h1Count = headings.filter((h) => h.level === 1).length;
|
|
2402
2488
|
if (h1Count === 0) {
|
|
2403
|
-
violations.push({ auditId:
|
|
2489
|
+
violations.push({ auditId: audit9.id, label: __33("No H1 on the page.", "elementor") });
|
|
2404
2490
|
}
|
|
2405
2491
|
if (h1Count > 1) {
|
|
2406
2492
|
headings.filter((h) => h.level === 1).slice(1).forEach(
|
|
2407
2493
|
(h) => violations.push({
|
|
2408
|
-
auditId:
|
|
2494
|
+
auditId: audit9.id,
|
|
2409
2495
|
elementId: h.elementId,
|
|
2410
2496
|
targetHint: "element-settings",
|
|
2411
|
-
label:
|
|
2497
|
+
label: __33("More than one H1 on the page.", "elementor")
|
|
2412
2498
|
})
|
|
2413
2499
|
);
|
|
2414
2500
|
}
|
|
2415
2501
|
for (let i = 1; i < headings.length; i++) {
|
|
2416
2502
|
if (headings[i].level - headings[i - 1].level > 1) {
|
|
2417
2503
|
violations.push({
|
|
2418
|
-
auditId:
|
|
2504
|
+
auditId: audit9.id,
|
|
2419
2505
|
elementId: headings[i].elementId,
|
|
2420
2506
|
targetHint: "element-settings",
|
|
2421
|
-
label:
|
|
2507
|
+
label: __33("Heading level skipped.", "elementor")
|
|
2422
2508
|
});
|
|
2423
2509
|
}
|
|
2424
2510
|
}
|
|
@@ -2428,33 +2514,33 @@ var audit7 = {
|
|
|
2428
2514
|
};
|
|
2429
2515
|
|
|
2430
2516
|
// src/audits/hidden-elements.ts
|
|
2431
|
-
import { __ as
|
|
2517
|
+
import { __ as __34 } from "@wordpress/i18n";
|
|
2432
2518
|
function isHiddenOnAllDevices(settings) {
|
|
2433
2519
|
return Boolean(settings.hide_desktop) && Boolean(settings.hide_tablet) && Boolean(settings.hide_mobile);
|
|
2434
2520
|
}
|
|
2435
|
-
var
|
|
2521
|
+
var audit10 = {
|
|
2436
2522
|
id: "audits/hidden-elements",
|
|
2437
|
-
title:
|
|
2438
|
-
description:
|
|
2523
|
+
title: __34("Hidden elements", "elementor"),
|
|
2524
|
+
description: __34(
|
|
2439
2525
|
"Elements hidden on all devices simultaneously are effectively dead code in the page tree.",
|
|
2440
2526
|
"elementor"
|
|
2441
2527
|
),
|
|
2442
|
-
fixHint:
|
|
2528
|
+
fixHint: __34("Remove the element or make it visible on at least one device breakpoint.", "elementor"),
|
|
2443
2529
|
categories: ["best-practices", "performance"],
|
|
2444
2530
|
severity: "info",
|
|
2445
2531
|
weight: 3,
|
|
2446
2532
|
evaluate: (ctx) => {
|
|
2447
2533
|
if (ctx.elements.tree.length === 0) {
|
|
2448
|
-
return { status: "skipped", reason:
|
|
2534
|
+
return { status: "skipped", reason: __34("No elements", "elementor") };
|
|
2449
2535
|
}
|
|
2450
2536
|
const violations = [];
|
|
2451
2537
|
walkElements(ctx.elements.tree, (node) => {
|
|
2452
2538
|
if (isHiddenOnAllDevices(node.settings)) {
|
|
2453
2539
|
violations.push({
|
|
2454
|
-
auditId:
|
|
2540
|
+
auditId: audit10.id,
|
|
2455
2541
|
elementId: node.id,
|
|
2456
2542
|
targetHint: "element-settings",
|
|
2457
|
-
label:
|
|
2543
|
+
label: __34("Element is hidden on all devices.", "elementor")
|
|
2458
2544
|
});
|
|
2459
2545
|
}
|
|
2460
2546
|
});
|
|
@@ -2463,7 +2549,7 @@ var audit8 = {
|
|
|
2463
2549
|
};
|
|
2464
2550
|
|
|
2465
2551
|
// src/audits/images-alt-text.ts
|
|
2466
|
-
import { __ as
|
|
2552
|
+
import { __ as __35 } from "@wordpress/i18n";
|
|
2467
2553
|
|
|
2468
2554
|
// src/utils/image-alt.ts
|
|
2469
2555
|
function hasMeaningfulAlt(media, pageContext) {
|
|
@@ -2482,17 +2568,17 @@ function isImageSourcePresent(media) {
|
|
|
2482
2568
|
}
|
|
2483
2569
|
|
|
2484
2570
|
// src/audits/images-alt-text.ts
|
|
2485
|
-
var
|
|
2571
|
+
var audit11 = {
|
|
2486
2572
|
id: "audits/images-alt-text",
|
|
2487
|
-
title:
|
|
2488
|
-
description:
|
|
2489
|
-
fixHint:
|
|
2573
|
+
title: __35("Images alt text", "elementor"),
|
|
2574
|
+
description: __35("Every image needs a meaningful alt attribute for screen readers and image-search.", "elementor"),
|
|
2575
|
+
fixHint: __35("Open the image's settings and add an Alt Text describing the image.", "elementor"),
|
|
2490
2576
|
categories: ["seo", "accessibility"],
|
|
2491
2577
|
severity: "error",
|
|
2492
2578
|
weight: 10,
|
|
2493
2579
|
evaluate: (ctx) => {
|
|
2494
2580
|
if (!hasPageImages(ctx.elements.tree)) {
|
|
2495
|
-
return { status: "skipped", reason:
|
|
2581
|
+
return { status: "skipped", reason: __35("No images", "elementor") };
|
|
2496
2582
|
}
|
|
2497
2583
|
const violations = [];
|
|
2498
2584
|
const failedWidgetIds = /* @__PURE__ */ new Set();
|
|
@@ -2505,10 +2591,10 @@ var audit9 = {
|
|
|
2505
2591
|
if (!failedWidgetIds.has(node.id)) {
|
|
2506
2592
|
failedWidgetIds.add(node.id);
|
|
2507
2593
|
violations.push({
|
|
2508
|
-
auditId:
|
|
2594
|
+
auditId: audit11.id,
|
|
2509
2595
|
elementId: node.id,
|
|
2510
2596
|
targetHint: "element-settings",
|
|
2511
|
-
label:
|
|
2597
|
+
label: __35("Image is missing alt text.", "elementor"),
|
|
2512
2598
|
externalUrl: ctx.pageContext.ally_plugin_url
|
|
2513
2599
|
});
|
|
2514
2600
|
}
|
|
@@ -2518,14 +2604,14 @@ var audit9 = {
|
|
|
2518
2604
|
};
|
|
2519
2605
|
|
|
2520
2606
|
// src/audits/images-too-large.ts
|
|
2521
|
-
import { __ as
|
|
2607
|
+
import { __ as __36, sprintf as sprintf4 } from "@wordpress/i18n";
|
|
2522
2608
|
var SIZE_THRESHOLD_BYTES = 500 * 1024;
|
|
2523
2609
|
var BYTES_PER_KB = 1024;
|
|
2524
|
-
var
|
|
2610
|
+
var audit12 = {
|
|
2525
2611
|
id: "audits/images-too-large",
|
|
2526
|
-
title:
|
|
2527
|
-
description:
|
|
2528
|
-
fixHint:
|
|
2612
|
+
title: __36("Oversized images", "elementor"),
|
|
2613
|
+
description: __36("Large image files slow down the page.", "elementor"),
|
|
2614
|
+
fixHint: __36("Replace the image with a smaller version or enable image optimization.", "elementor"),
|
|
2529
2615
|
categories: ["performance"],
|
|
2530
2616
|
severity: "warning",
|
|
2531
2617
|
weight: 7,
|
|
@@ -2555,15 +2641,15 @@ var audit10 = {
|
|
|
2555
2641
|
walkAtomicImageSources(ctx.elements.tree, ({ node, media }) => evaluateSource(node, media));
|
|
2556
2642
|
walkAtomicBackgroundImageSources(ctx.elements.tree, ({ node, media }) => evaluateSource(node, media));
|
|
2557
2643
|
if (!hasAnyImage) {
|
|
2558
|
-
return { status: "skipped", reason:
|
|
2644
|
+
return { status: "skipped", reason: __36("No images", "elementor") };
|
|
2559
2645
|
}
|
|
2560
2646
|
const violations = Array.from(widgetMaxKb.entries()).map(([elementId, kb]) => ({
|
|
2561
|
-
auditId:
|
|
2647
|
+
auditId: audit12.id,
|
|
2562
2648
|
elementId,
|
|
2563
2649
|
targetHint: "element-settings",
|
|
2564
2650
|
label: sprintf4(
|
|
2565
2651
|
/* translators: %d is the image file size in kilobytes. */
|
|
2566
|
-
|
|
2652
|
+
__36("Image is %d KB (over 500 KB).", "elementor"),
|
|
2567
2653
|
kb
|
|
2568
2654
|
),
|
|
2569
2655
|
externalUrl: ctx.pageContext.image_optimization_plugin_url
|
|
@@ -2573,21 +2659,21 @@ var audit10 = {
|
|
|
2573
2659
|
};
|
|
2574
2660
|
|
|
2575
2661
|
// src/audits/nested-boxed-containers.ts
|
|
2576
|
-
import { __ as
|
|
2662
|
+
import { __ as __37 } from "@wordpress/i18n";
|
|
2577
2663
|
function isBoxed(settings) {
|
|
2578
2664
|
return settings.content_width === "boxed";
|
|
2579
2665
|
}
|
|
2580
|
-
var
|
|
2666
|
+
var audit13 = {
|
|
2581
2667
|
id: "audits/nested-boxed-containers",
|
|
2582
|
-
title:
|
|
2583
|
-
description:
|
|
2584
|
-
fixHint:
|
|
2668
|
+
title: __37("Boxed container nested inside a boxed parent", "elementor"),
|
|
2669
|
+
description: __37("An inner container does not need to be boxed when its parent already is.", "elementor"),
|
|
2670
|
+
fixHint: __37("Change the inner container's content width to Full Width.", "elementor"),
|
|
2585
2671
|
categories: ["best-practices", "performance"],
|
|
2586
2672
|
severity: "info",
|
|
2587
2673
|
weight: 5,
|
|
2588
2674
|
evaluate: (ctx) => {
|
|
2589
2675
|
if (ctx.elements.tree.length === 0) {
|
|
2590
|
-
return { status: "skipped", reason:
|
|
2676
|
+
return { status: "skipped", reason: __37("No elements", "elementor") };
|
|
2591
2677
|
}
|
|
2592
2678
|
const violations = [];
|
|
2593
2679
|
walkElements(ctx.elements.tree, (node, parents) => {
|
|
@@ -2597,10 +2683,10 @@ var audit11 = {
|
|
|
2597
2683
|
const nearestContainerAncestor = [...parents].reverse().find((p) => p.elType === "container");
|
|
2598
2684
|
if (nearestContainerAncestor && isBoxed(nearestContainerAncestor.settings)) {
|
|
2599
2685
|
violations.push({
|
|
2600
|
-
auditId:
|
|
2686
|
+
auditId: audit13.id,
|
|
2601
2687
|
elementId: node.id,
|
|
2602
2688
|
targetHint: "element-settings",
|
|
2603
|
-
label:
|
|
2689
|
+
label: __37("Nested boxed container.", "elementor")
|
|
2604
2690
|
});
|
|
2605
2691
|
}
|
|
2606
2692
|
});
|
|
@@ -2609,12 +2695,12 @@ var audit11 = {
|
|
|
2609
2695
|
};
|
|
2610
2696
|
|
|
2611
2697
|
// src/audits/page-excerpt.ts
|
|
2612
|
-
import { __ as
|
|
2613
|
-
var
|
|
2698
|
+
import { __ as __38 } from "@wordpress/i18n";
|
|
2699
|
+
var audit14 = {
|
|
2614
2700
|
id: "audits/page-excerpt",
|
|
2615
|
-
title:
|
|
2616
|
-
description:
|
|
2617
|
-
fixHint:
|
|
2701
|
+
title: __38("Page excerpt", "elementor"),
|
|
2702
|
+
description: __38("A descriptive excerpt helps search engines and previews summarize the page.", "elementor"),
|
|
2703
|
+
fixHint: __38("Open Page Settings and write a short excerpt.", "elementor"),
|
|
2618
2704
|
categories: ["seo"],
|
|
2619
2705
|
severity: "warning",
|
|
2620
2706
|
weight: 5,
|
|
@@ -2626,8 +2712,8 @@ var audit12 = {
|
|
|
2626
2712
|
status: "fail",
|
|
2627
2713
|
violations: [
|
|
2628
2714
|
{
|
|
2629
|
-
auditId:
|
|
2630
|
-
label:
|
|
2715
|
+
auditId: audit14.id,
|
|
2716
|
+
label: __38("Page has no excerpt.", "elementor"),
|
|
2631
2717
|
targetHint: "page-settings",
|
|
2632
2718
|
angieFix: true
|
|
2633
2719
|
}
|
|
@@ -2637,12 +2723,12 @@ var audit12 = {
|
|
|
2637
2723
|
};
|
|
2638
2724
|
|
|
2639
2725
|
// src/audits/page-featured-image.ts
|
|
2640
|
-
import { __ as
|
|
2641
|
-
var
|
|
2726
|
+
import { __ as __39 } from "@wordpress/i18n";
|
|
2727
|
+
var audit15 = {
|
|
2642
2728
|
id: "audits/page-featured-image",
|
|
2643
|
-
title:
|
|
2644
|
-
description:
|
|
2645
|
-
fixHint:
|
|
2729
|
+
title: __39("Page featured image", "elementor"),
|
|
2730
|
+
description: __39("Featured images are used by social shares and many themes for hero visuals.", "elementor"),
|
|
2731
|
+
fixHint: __39("Open Page Settings and set a featured image.", "elementor"),
|
|
2646
2732
|
categories: ["seo"],
|
|
2647
2733
|
severity: "info",
|
|
2648
2734
|
weight: 5,
|
|
@@ -2654,8 +2740,8 @@ var audit13 = {
|
|
|
2654
2740
|
status: "fail",
|
|
2655
2741
|
violations: [
|
|
2656
2742
|
{
|
|
2657
|
-
auditId:
|
|
2658
|
-
label:
|
|
2743
|
+
auditId: audit15.id,
|
|
2744
|
+
label: __39("No featured image set.", "elementor"),
|
|
2659
2745
|
targetHint: "page-settings"
|
|
2660
2746
|
}
|
|
2661
2747
|
]
|
|
@@ -2664,13 +2750,13 @@ var audit13 = {
|
|
|
2664
2750
|
};
|
|
2665
2751
|
|
|
2666
2752
|
// src/audits/page-title.ts
|
|
2667
|
-
import { __ as
|
|
2753
|
+
import { __ as __40 } from "@wordpress/i18n";
|
|
2668
2754
|
var MAX_TITLE_LENGTH = 60;
|
|
2669
|
-
var
|
|
2755
|
+
var audit16 = {
|
|
2670
2756
|
id: "audits/page-title",
|
|
2671
|
-
title:
|
|
2672
|
-
description:
|
|
2673
|
-
fixHint:
|
|
2757
|
+
title: __40("Page title", "elementor"),
|
|
2758
|
+
description: __40("Pages need a clear title for SEO and screen-reader navigation.", "elementor"),
|
|
2759
|
+
fixHint: __40("Open Page Settings and add a title.", "elementor"),
|
|
2674
2760
|
categories: ["seo"],
|
|
2675
2761
|
severity: "error",
|
|
2676
2762
|
weight: 10,
|
|
@@ -2681,11 +2767,11 @@ var audit14 = {
|
|
|
2681
2767
|
status: "fail",
|
|
2682
2768
|
violations: [
|
|
2683
2769
|
{
|
|
2684
|
-
auditId:
|
|
2685
|
-
label:
|
|
2770
|
+
auditId: audit16.id,
|
|
2771
|
+
label: __40("Page has no title.", "elementor"),
|
|
2686
2772
|
targetHint: "page-settings",
|
|
2687
2773
|
angieFix: true,
|
|
2688
|
-
angiePrompt:
|
|
2774
|
+
angiePrompt: __40(
|
|
2689
2775
|
"Based on this page's contents, generate a title for this page.",
|
|
2690
2776
|
"elementor"
|
|
2691
2777
|
)
|
|
@@ -2698,8 +2784,8 @@ var audit14 = {
|
|
|
2698
2784
|
status: "fail",
|
|
2699
2785
|
violations: [
|
|
2700
2786
|
{
|
|
2701
|
-
auditId:
|
|
2702
|
-
label:
|
|
2787
|
+
auditId: audit16.id,
|
|
2788
|
+
label: __40("Page title is too long.", "elementor"),
|
|
2703
2789
|
targetHint: "page-settings",
|
|
2704
2790
|
angieFix: true
|
|
2705
2791
|
}
|
|
@@ -2711,7 +2797,7 @@ var audit14 = {
|
|
|
2711
2797
|
};
|
|
2712
2798
|
|
|
2713
2799
|
// src/audits/prefer-global-colors.ts
|
|
2714
|
-
import { __ as
|
|
2800
|
+
import { __ as __41, sprintf as sprintf5 } from "@wordpress/i18n";
|
|
2715
2801
|
|
|
2716
2802
|
// src/utils/collect-hardcoded-colors.ts
|
|
2717
2803
|
var RESERVED_SETTING_KEYS = /* @__PURE__ */ new Set(["__globals__", "__dynamic__"]);
|
|
@@ -2777,20 +2863,20 @@ function findMatchingGlobalByValue(value, globals) {
|
|
|
2777
2863
|
}
|
|
2778
2864
|
|
|
2779
2865
|
// src/audits/prefer-global-colors.ts
|
|
2780
|
-
var
|
|
2866
|
+
var audit17 = {
|
|
2781
2867
|
id: "audits/prefer-global-colors",
|
|
2782
|
-
title:
|
|
2783
|
-
description:
|
|
2784
|
-
fixHint:
|
|
2868
|
+
title: __41("Prefer global colors", "elementor"),
|
|
2869
|
+
description: __41("Global colors make the design consistent and easy to update site-wide.", "elementor"),
|
|
2870
|
+
fixHint: __41("Replace the hard-coded value with the matching global color.", "elementor"),
|
|
2785
2871
|
categories: ["best-practices"],
|
|
2786
2872
|
severity: "info",
|
|
2787
2873
|
weight: 3,
|
|
2788
2874
|
evaluate: (ctx) => {
|
|
2789
2875
|
if (ctx.elements.tree.length === 0) {
|
|
2790
|
-
return { status: "skipped", reason:
|
|
2876
|
+
return { status: "skipped", reason: __41("No elements", "elementor") };
|
|
2791
2877
|
}
|
|
2792
2878
|
if (ctx.kit.globals.colors.length === 0) {
|
|
2793
|
-
return { status: "skipped", reason:
|
|
2879
|
+
return { status: "skipped", reason: __41("No global colors", "elementor") };
|
|
2794
2880
|
}
|
|
2795
2881
|
const violations = [];
|
|
2796
2882
|
walkElements(ctx.elements.tree, (node) => {
|
|
@@ -2800,13 +2886,13 @@ var audit15 = {
|
|
|
2800
2886
|
continue;
|
|
2801
2887
|
}
|
|
2802
2888
|
violations.push({
|
|
2803
|
-
auditId:
|
|
2889
|
+
auditId: audit17.id,
|
|
2804
2890
|
elementId: node.id,
|
|
2805
2891
|
targetHint: "element-settings",
|
|
2806
2892
|
angieFix: true,
|
|
2807
2893
|
label: sprintf5(
|
|
2808
2894
|
/* translators: 1: hard-coded color value, 2: global color title. */
|
|
2809
|
-
|
|
2895
|
+
__41('replace "%1$s" with "%2$s" global color', "elementor"),
|
|
2810
2896
|
value,
|
|
2811
2897
|
global.title
|
|
2812
2898
|
)
|
|
@@ -2818,7 +2904,7 @@ var audit15 = {
|
|
|
2818
2904
|
};
|
|
2819
2905
|
|
|
2820
2906
|
// src/audits/prefer-global-fonts.ts
|
|
2821
|
-
import { __ as
|
|
2907
|
+
import { __ as __42, sprintf as sprintf6 } from "@wordpress/i18n";
|
|
2822
2908
|
|
|
2823
2909
|
// src/utils/collect-hardcoded-fonts.ts
|
|
2824
2910
|
var RESERVED_SETTING_KEYS2 = /* @__PURE__ */ new Set(["__globals__", "__dynamic__"]);
|
|
@@ -2876,20 +2962,20 @@ function collectHardcodedFonts(settings, pathPrefix = "") {
|
|
|
2876
2962
|
}
|
|
2877
2963
|
|
|
2878
2964
|
// src/audits/prefer-global-fonts.ts
|
|
2879
|
-
var
|
|
2965
|
+
var audit18 = {
|
|
2880
2966
|
id: "audits/prefer-global-fonts",
|
|
2881
|
-
title:
|
|
2882
|
-
description:
|
|
2883
|
-
fixHint:
|
|
2967
|
+
title: __42("Prefer global fonts", "elementor"),
|
|
2968
|
+
description: __42("Global fonts make the design consistent and easy to update site-wide.", "elementor"),
|
|
2969
|
+
fixHint: __42("Replace the hard-coded value with the matching global font.", "elementor"),
|
|
2884
2970
|
categories: ["best-practices", "performance"],
|
|
2885
2971
|
severity: "info",
|
|
2886
2972
|
weight: 3,
|
|
2887
2973
|
evaluate: (ctx) => {
|
|
2888
2974
|
if (ctx.elements.tree.length === 0) {
|
|
2889
|
-
return { status: "skipped", reason:
|
|
2975
|
+
return { status: "skipped", reason: __42("No elements", "elementor") };
|
|
2890
2976
|
}
|
|
2891
2977
|
if (ctx.kit.globals.fonts.length === 0) {
|
|
2892
|
-
return { status: "skipped", reason:
|
|
2978
|
+
return { status: "skipped", reason: __42("No global fonts", "elementor") };
|
|
2893
2979
|
}
|
|
2894
2980
|
const violations = [];
|
|
2895
2981
|
walkElements(ctx.elements.tree, (node) => {
|
|
@@ -2899,12 +2985,12 @@ var audit16 = {
|
|
|
2899
2985
|
continue;
|
|
2900
2986
|
}
|
|
2901
2987
|
violations.push({
|
|
2902
|
-
auditId:
|
|
2988
|
+
auditId: audit18.id,
|
|
2903
2989
|
elementId: node.id,
|
|
2904
2990
|
targetHint: "element-settings",
|
|
2905
2991
|
label: sprintf6(
|
|
2906
2992
|
/* translators: %s: global font title. */
|
|
2907
|
-
|
|
2993
|
+
__42('replace hardcoded typography with "%s" global font', "elementor"),
|
|
2908
2994
|
global.title
|
|
2909
2995
|
)
|
|
2910
2996
|
});
|
|
@@ -2915,15 +3001,15 @@ var audit16 = {
|
|
|
2915
3001
|
};
|
|
2916
3002
|
|
|
2917
3003
|
// src/audits/privacy-policy.ts
|
|
2918
|
-
import { __ as
|
|
2919
|
-
var
|
|
3004
|
+
import { __ as __43 } from "@wordpress/i18n";
|
|
3005
|
+
var audit19 = {
|
|
2920
3006
|
id: "audits/privacy-policy",
|
|
2921
|
-
title:
|
|
2922
|
-
description:
|
|
3007
|
+
title: __43("Privacy policy", "elementor"),
|
|
3008
|
+
description: __43(
|
|
2923
3009
|
"A privacy policy page is required by privacy regulations such as GDPR (EU) and CCPA (US).",
|
|
2924
3010
|
"elementor"
|
|
2925
3011
|
),
|
|
2926
|
-
fixHint:
|
|
3012
|
+
fixHint: __43(
|
|
2927
3013
|
"Go to Settings > Privacy in the WordPress admin and assign a published privacy policy page.",
|
|
2928
3014
|
"elementor"
|
|
2929
3015
|
),
|
|
@@ -2938,10 +3024,10 @@ var audit17 = {
|
|
|
2938
3024
|
status: "fail",
|
|
2939
3025
|
violations: [
|
|
2940
3026
|
{
|
|
2941
|
-
auditId:
|
|
2942
|
-
label:
|
|
3027
|
+
auditId: audit19.id,
|
|
3028
|
+
label: __43("No privacy policy page is set.", "elementor"),
|
|
2943
3029
|
externalUrl: ctx.pageContext.privacy_settings_url,
|
|
2944
|
-
ctaLabel:
|
|
3030
|
+
ctaLabel: __43("Create", "elementor")
|
|
2945
3031
|
}
|
|
2946
3032
|
]
|
|
2947
3033
|
};
|
|
@@ -2949,15 +3035,15 @@ var audit17 = {
|
|
|
2949
3035
|
};
|
|
2950
3036
|
|
|
2951
3037
|
// src/audits/robots-noindex.ts
|
|
2952
|
-
import { __ as
|
|
2953
|
-
var
|
|
3038
|
+
import { __ as __44 } from "@wordpress/i18n";
|
|
3039
|
+
var audit20 = {
|
|
2954
3040
|
id: "audits/robots-noindex",
|
|
2955
|
-
title:
|
|
2956
|
-
description:
|
|
3041
|
+
title: __44("Search engine visibility", "elementor"),
|
|
3042
|
+
description: __44(
|
|
2957
3043
|
"When search engine visibility is checked in WordPress Settings -> Reading -> Search Engine Visibility, search engines are discouraged from indexing the website.",
|
|
2958
3044
|
"elementor"
|
|
2959
3045
|
),
|
|
2960
|
-
fixHint:
|
|
3046
|
+
fixHint: __44(
|
|
2961
3047
|
'Go to Settings \u2192 Reading in the WordPress admin and uncheck "Discourage search engines from indexing this site" when the website should be indexed.',
|
|
2962
3048
|
"elementor"
|
|
2963
3049
|
),
|
|
@@ -2972,8 +3058,8 @@ var audit18 = {
|
|
|
2972
3058
|
status: "fail",
|
|
2973
3059
|
violations: [
|
|
2974
3060
|
{
|
|
2975
|
-
auditId:
|
|
2976
|
-
label:
|
|
3061
|
+
auditId: audit20.id,
|
|
3062
|
+
label: __44("Search engines are discouraged from indexing this website.", "elementor"),
|
|
2977
3063
|
externalUrl: ctx.pageContext.reading_settings_url
|
|
2978
3064
|
}
|
|
2979
3065
|
]
|
|
@@ -2982,15 +3068,15 @@ var audit18 = {
|
|
|
2982
3068
|
};
|
|
2983
3069
|
|
|
2984
3070
|
// src/audits/scan-for-cookies.ts
|
|
2985
|
-
import { __ as
|
|
2986
|
-
var
|
|
3071
|
+
import { __ as __45 } from "@wordpress/i18n";
|
|
3072
|
+
var audit21 = {
|
|
2987
3073
|
id: "audits/scan-for-cookies",
|
|
2988
|
-
title:
|
|
2989
|
-
description:
|
|
3074
|
+
title: __45("Scan for cookies", "elementor"),
|
|
3075
|
+
description: __45(
|
|
2990
3076
|
"Your site may be setting cookies you haven't disclosed. Some countries require a banner even without a full consent policy. Scan to see what needs disclosure.",
|
|
2991
3077
|
"elementor"
|
|
2992
3078
|
),
|
|
2993
|
-
fixHint:
|
|
3079
|
+
fixHint: __45("Run a Cookiez scan on this page to see which cookies need disclosure.", "elementor"),
|
|
2994
3080
|
categories: ["compliance"],
|
|
2995
3081
|
severity: "info",
|
|
2996
3082
|
weight: 0,
|
|
@@ -3000,8 +3086,8 @@ var audit19 = {
|
|
|
3000
3086
|
status: "fail",
|
|
3001
3087
|
violations: [
|
|
3002
3088
|
{
|
|
3003
|
-
auditId:
|
|
3004
|
-
label:
|
|
3089
|
+
auditId: audit21.id,
|
|
3090
|
+
label: __45("This page has not been scanned for cookies yet.", "elementor"),
|
|
3005
3091
|
externalUrl: isReady ? ctx.pageContext.cookiez_scan_url : ctx.pageContext.cookiez_plugin_action_url
|
|
3006
3092
|
}
|
|
3007
3093
|
]
|
|
@@ -3010,29 +3096,29 @@ var audit19 = {
|
|
|
3010
3096
|
};
|
|
3011
3097
|
|
|
3012
3098
|
// src/audits/sections-and-columns.ts
|
|
3013
|
-
import { __ as
|
|
3014
|
-
var
|
|
3099
|
+
import { __ as __46 } from "@wordpress/i18n";
|
|
3100
|
+
var audit22 = {
|
|
3015
3101
|
id: "audits/sections-and-columns",
|
|
3016
|
-
title:
|
|
3017
|
-
description:
|
|
3102
|
+
title: __46("Sections and columns", "elementor"),
|
|
3103
|
+
description: __46(
|
|
3018
3104
|
"Sections and columns are legacy elements. Containers render fewer DOM nodes and are more flexible.",
|
|
3019
3105
|
"elementor"
|
|
3020
3106
|
),
|
|
3021
|
-
fixHint:
|
|
3107
|
+
fixHint: __46("Use the Container Converter to replace each section/column with a container.", "elementor"),
|
|
3022
3108
|
categories: ["best-practices", "performance"],
|
|
3023
3109
|
severity: "warning",
|
|
3024
3110
|
weight: 7,
|
|
3025
3111
|
evaluate: (ctx) => {
|
|
3026
3112
|
if (ctx.elements.tree.length === 0) {
|
|
3027
|
-
return { status: "skipped", reason:
|
|
3113
|
+
return { status: "skipped", reason: __46("No elements", "elementor") };
|
|
3028
3114
|
}
|
|
3029
3115
|
const violations = [];
|
|
3030
3116
|
walkElements(ctx.elements.tree, (node) => {
|
|
3031
3117
|
if (node.elType === "section" || node.elType === "column") {
|
|
3032
3118
|
violations.push({
|
|
3033
|
-
auditId:
|
|
3119
|
+
auditId: audit22.id,
|
|
3034
3120
|
elementId: node.id,
|
|
3035
|
-
label: node.elType === "section" ?
|
|
3121
|
+
label: node.elType === "section" ? __46("Section element", "elementor") : __46("Column element", "elementor")
|
|
3036
3122
|
});
|
|
3037
3123
|
}
|
|
3038
3124
|
});
|
|
@@ -3041,15 +3127,15 @@ var audit20 = {
|
|
|
3041
3127
|
};
|
|
3042
3128
|
|
|
3043
3129
|
// src/audits/site-identity.ts
|
|
3044
|
-
import { __ as
|
|
3045
|
-
var
|
|
3130
|
+
import { __ as __47 } from "@wordpress/i18n";
|
|
3131
|
+
var audit23 = {
|
|
3046
3132
|
id: "audits/site-identity",
|
|
3047
|
-
title:
|
|
3048
|
-
description:
|
|
3133
|
+
title: __47("Site identity", "elementor"),
|
|
3134
|
+
description: __47(
|
|
3049
3135
|
"Site name, description, logo, and favicon establish your brand and appear in search results and browser tabs.",
|
|
3050
3136
|
"elementor"
|
|
3051
3137
|
),
|
|
3052
|
-
fixHint:
|
|
3138
|
+
fixHint: __47("Open Site Settings \u2192 Site Identity and complete all the missing fields.", "elementor"),
|
|
3053
3139
|
categories: ["best-practices", "seo"],
|
|
3054
3140
|
severity: "info",
|
|
3055
3141
|
weight: 7,
|
|
@@ -3058,30 +3144,30 @@ var audit21 = {
|
|
|
3058
3144
|
const violations = [];
|
|
3059
3145
|
if (!identity.site_name_set) {
|
|
3060
3146
|
violations.push({
|
|
3061
|
-
auditId:
|
|
3062
|
-
label:
|
|
3147
|
+
auditId: audit23.id,
|
|
3148
|
+
label: __47("Site name is missing or still uses the default.", "elementor"),
|
|
3063
3149
|
targetHint: "site-identity-settings"
|
|
3064
3150
|
});
|
|
3065
3151
|
}
|
|
3066
3152
|
if (!identity.site_description_set) {
|
|
3067
3153
|
violations.push({
|
|
3068
|
-
auditId:
|
|
3069
|
-
label:
|
|
3154
|
+
auditId: audit23.id,
|
|
3155
|
+
label: __47("Site description is missing or still uses the default.", "elementor"),
|
|
3070
3156
|
targetHint: "site-identity-settings",
|
|
3071
3157
|
angieFix: true
|
|
3072
3158
|
});
|
|
3073
3159
|
}
|
|
3074
3160
|
if (!identity.site_logo_set) {
|
|
3075
3161
|
violations.push({
|
|
3076
|
-
auditId:
|
|
3077
|
-
label:
|
|
3162
|
+
auditId: audit23.id,
|
|
3163
|
+
label: __47("Site logo is not set.", "elementor"),
|
|
3078
3164
|
targetHint: "site-identity-settings"
|
|
3079
3165
|
});
|
|
3080
3166
|
}
|
|
3081
3167
|
if (!identity.site_favicon_set) {
|
|
3082
3168
|
violations.push({
|
|
3083
|
-
auditId:
|
|
3084
|
-
label:
|
|
3169
|
+
auditId: audit23.id,
|
|
3170
|
+
label: __47("Site favicon is not set.", "elementor"),
|
|
3085
3171
|
targetHint: "site-identity-settings"
|
|
3086
3172
|
});
|
|
3087
3173
|
}
|
|
@@ -3097,7 +3183,7 @@ var audit21 = {
|
|
|
3097
3183
|
|
|
3098
3184
|
// src/audits/too-many-widgets.ts
|
|
3099
3185
|
import { getWidgetsCache as getWidgetsCache3 } from "@elementor/editor-elements";
|
|
3100
|
-
import { __ as
|
|
3186
|
+
import { __ as __48 } from "@wordpress/i18n";
|
|
3101
3187
|
var WIDGET_COUNT_THRESHOLD = 100;
|
|
3102
3188
|
function isCountableWidget(node, widgetsCache) {
|
|
3103
3189
|
if (node.elType === "widget") {
|
|
@@ -3105,17 +3191,17 @@ function isCountableWidget(node, widgetsCache) {
|
|
|
3105
3191
|
}
|
|
3106
3192
|
return !!widgetsCache?.[node.elType]?.meta?.is_compound;
|
|
3107
3193
|
}
|
|
3108
|
-
var
|
|
3194
|
+
var audit24 = {
|
|
3109
3195
|
id: "audits/too-many-widgets",
|
|
3110
|
-
title:
|
|
3111
|
-
description:
|
|
3112
|
-
fixHint:
|
|
3196
|
+
title: __48("Too many widgets", "elementor"),
|
|
3197
|
+
description: __48("Excessive DOM size caused by too many widgets degrades rendering performance.", "elementor"),
|
|
3198
|
+
fixHint: __48("Reduce the number of widgets on the page by removing or combining elements.", "elementor"),
|
|
3113
3199
|
categories: ["best-practices", "performance"],
|
|
3114
3200
|
severity: "warning",
|
|
3115
3201
|
weight: 5,
|
|
3116
3202
|
evaluate: (ctx) => {
|
|
3117
3203
|
if (ctx.elements.tree.length === 0) {
|
|
3118
|
-
return { status: "skipped", reason:
|
|
3204
|
+
return { status: "skipped", reason: __48("No elements", "elementor") };
|
|
3119
3205
|
}
|
|
3120
3206
|
const widgetsCache = getWidgetsCache3();
|
|
3121
3207
|
let widgetCount = 0;
|
|
@@ -3131,8 +3217,8 @@ var audit22 = {
|
|
|
3131
3217
|
status: "fail",
|
|
3132
3218
|
violations: [
|
|
3133
3219
|
{
|
|
3134
|
-
auditId:
|
|
3135
|
-
label:
|
|
3220
|
+
auditId: audit24.id,
|
|
3221
|
+
label: __48("Page has too many widgets.", "elementor")
|
|
3136
3222
|
}
|
|
3137
3223
|
]
|
|
3138
3224
|
};
|
|
@@ -3141,32 +3227,34 @@ var audit22 = {
|
|
|
3141
3227
|
|
|
3142
3228
|
// src/register-audits.ts
|
|
3143
3229
|
var AUDITS = [
|
|
3230
|
+
audit16,
|
|
3144
3231
|
audit14,
|
|
3145
|
-
audit12,
|
|
3146
|
-
audit13,
|
|
3147
|
-
audit8,
|
|
3148
|
-
audit5,
|
|
3149
|
-
audit22,
|
|
3150
|
-
audit20,
|
|
3151
|
-
audit3,
|
|
3152
|
-
audit11,
|
|
3153
|
-
audit4,
|
|
3154
|
-
audit21,
|
|
3155
3232
|
audit15,
|
|
3156
|
-
audit16,
|
|
3157
|
-
audit7,
|
|
3158
|
-
audit9,
|
|
3159
3233
|
audit10,
|
|
3160
|
-
|
|
3234
|
+
audit7,
|
|
3235
|
+
audit24,
|
|
3236
|
+
audit22,
|
|
3237
|
+
audit5,
|
|
3238
|
+
audit13,
|
|
3239
|
+
audit6,
|
|
3240
|
+
audit23,
|
|
3161
3241
|
audit17,
|
|
3242
|
+
audit18,
|
|
3243
|
+
audit9,
|
|
3244
|
+
audit11,
|
|
3245
|
+
audit12,
|
|
3246
|
+
audit20,
|
|
3247
|
+
audit19,
|
|
3162
3248
|
audit,
|
|
3163
3249
|
audit2,
|
|
3164
|
-
|
|
3165
|
-
|
|
3250
|
+
audit3,
|
|
3251
|
+
audit4,
|
|
3252
|
+
audit21,
|
|
3253
|
+
audit8
|
|
3166
3254
|
];
|
|
3167
3255
|
function registerAllAudits() {
|
|
3168
|
-
for (const
|
|
3169
|
-
registerAudit(
|
|
3256
|
+
for (const audit25 of AUDITS) {
|
|
3257
|
+
registerAudit(audit25);
|
|
3170
3258
|
}
|
|
3171
3259
|
}
|
|
3172
3260
|
|