@elementor/editor-audits 4.4.0-1075 → 4.4.0-1077
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 +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +262 -187
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +225 -150
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -13
- package/src/audits/privacy-policy.ts +1 -0
- package/src/audits/scan-for-cookies.ts +30 -0
- package/src/components/status-section.tsx +1 -1
- package/src/components/violation-cta-button.tsx +22 -0
- package/src/components/violation-row.tsx +19 -4
- package/src/register-audits.ts +2 -0
- package/src/register-promotions.ts +8 -0
- package/src/types.ts +4 -0
- package/src/utils/audit-status-summary.ts +11 -2
- package/src/utils/is-scored-audit.ts +5 -0
- package/src/utils/severity-counts.ts +5 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-audits",
|
|
3
|
-
"version": "4.4.0-
|
|
3
|
+
"version": "4.4.0-1077",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -39,19 +39,19 @@
|
|
|
39
39
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@elementor/editor": "4.4.0-
|
|
43
|
-
"@elementor/editor-mcp": "4.4.0-
|
|
44
|
-
"@elementor/editor-app-bar": "4.4.0-
|
|
45
|
-
"@elementor/editor-elements": "4.4.0-
|
|
46
|
-
"@elementor/editor-floating-panels": "4.4.0-
|
|
47
|
-
"@elementor/editor-notifications": "4.4.0-
|
|
48
|
-
"@elementor/editor-v1-adapters": "4.4.0-
|
|
49
|
-
"@elementor/events": "4.4.0-
|
|
50
|
-
"@elementor/http-client": "4.4.0-
|
|
42
|
+
"@elementor/editor": "4.4.0-1077",
|
|
43
|
+
"@elementor/editor-mcp": "4.4.0-1077",
|
|
44
|
+
"@elementor/editor-app-bar": "4.4.0-1077",
|
|
45
|
+
"@elementor/editor-elements": "4.4.0-1077",
|
|
46
|
+
"@elementor/editor-floating-panels": "4.4.0-1077",
|
|
47
|
+
"@elementor/editor-notifications": "4.4.0-1077",
|
|
48
|
+
"@elementor/editor-v1-adapters": "4.4.0-1077",
|
|
49
|
+
"@elementor/events": "4.4.0-1077",
|
|
50
|
+
"@elementor/http-client": "4.4.0-1077",
|
|
51
51
|
"@elementor/icons": "~1.77.0",
|
|
52
|
-
"@elementor/locations": "4.4.0-
|
|
53
|
-
"@elementor/session": "4.4.0-
|
|
54
|
-
"@elementor/store": "4.4.0-
|
|
52
|
+
"@elementor/locations": "4.4.0-1077",
|
|
53
|
+
"@elementor/session": "4.4.0-1077",
|
|
54
|
+
"@elementor/store": "4.4.0-1077",
|
|
55
55
|
"@elementor/ui": "1.37.5"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { __ } from '@wordpress/i18n';
|
|
2
|
+
|
|
3
|
+
import { type Audit } from '../types';
|
|
4
|
+
|
|
5
|
+
export const audit: Audit = {
|
|
6
|
+
id: 'audits/scan-for-cookies',
|
|
7
|
+
title: __( 'Scan for cookies', 'elementor' ),
|
|
8
|
+
description: __(
|
|
9
|
+
"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.",
|
|
10
|
+
'elementor'
|
|
11
|
+
),
|
|
12
|
+
fixHint: __( 'Run a Cookiez scan on this page to see which cookies need disclosure.', 'elementor' ),
|
|
13
|
+
categories: [ 'compliance' ],
|
|
14
|
+
severity: 'info',
|
|
15
|
+
weight: 0,
|
|
16
|
+
evaluate: ( ctx ) => {
|
|
17
|
+
const isReady = ctx.pageContext.cookiez_plugin_installed && ctx.pageContext.cookiez_plugin_active;
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
status: 'fail',
|
|
21
|
+
violations: [
|
|
22
|
+
{
|
|
23
|
+
auditId: audit.id,
|
|
24
|
+
label: __( 'This page has not been scanned for cookies yet.', 'elementor' ),
|
|
25
|
+
externalUrl: isReady ? ctx.pageContext.cookiez_scan_url : ctx.pageContext.cookiez_plugin_action_url,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
};
|
|
@@ -15,7 +15,7 @@ type Props = {
|
|
|
15
15
|
export default function StatusSection( { label, count, color = 'default', defaultExpanded = false, children }: Props ) {
|
|
16
16
|
const [ expanded, setExpanded ] = useState( defaultExpanded );
|
|
17
17
|
|
|
18
|
-
if ( count === 0 ) {
|
|
18
|
+
if ( React.Children.count( children ) === 0 ) {
|
|
19
19
|
return null;
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Button } from '@elementor/ui';
|
|
3
|
+
|
|
4
|
+
type Props = {
|
|
5
|
+
ctaLabel: string;
|
|
6
|
+
externalUrl: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export default function ViolationCtaButton( { ctaLabel, externalUrl }: Props ) {
|
|
10
|
+
const handleClick = ( event: React.MouseEvent< HTMLButtonElement > ) => {
|
|
11
|
+
event.stopPropagation();
|
|
12
|
+
event.preventDefault();
|
|
13
|
+
|
|
14
|
+
window.open( externalUrl, '_blank', 'noopener' );
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<Button variant="outlined" color="secondary" size="small" onClick={ handleClick }>
|
|
19
|
+
{ ctaLabel }
|
|
20
|
+
</Button>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -8,9 +8,11 @@ import { __ } from '@wordpress/i18n';
|
|
|
8
8
|
import { focusViolation } from '../hooks/focus-violation';
|
|
9
9
|
import { type AuditMeta, type AuditViolation } from '../types';
|
|
10
10
|
import { buildAngiePrompt } from '../utils/build-angie-prompt';
|
|
11
|
+
import { isScoredAudit } from '../utils/is-scored-audit';
|
|
11
12
|
import { onKeyboardClick } from '../utils/keyboard-click';
|
|
12
13
|
import FixViolationWithAngie from './fix-violation-with-angie';
|
|
13
14
|
import SeverityIcon from './severity-icons';
|
|
15
|
+
import ViolationCtaButton from './violation-cta-button';
|
|
14
16
|
import ViolationIcon from './violation-icons';
|
|
15
17
|
|
|
16
18
|
type Props = {
|
|
@@ -33,9 +35,11 @@ function StatusIndicator( { audit, violations }: Pick< Props, 'audit' | 'violati
|
|
|
33
35
|
if ( violations ) {
|
|
34
36
|
return (
|
|
35
37
|
<>
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
{ isScoredAudit( audit ) && (
|
|
39
|
+
<Typography variant="caption" color="text.secondary" fontWeight="bold">
|
|
40
|
+
{ violations.length }
|
|
41
|
+
</Typography>
|
|
42
|
+
) }
|
|
39
43
|
<SeverityIcon severity={ audit.severity } />
|
|
40
44
|
</>
|
|
41
45
|
);
|
|
@@ -157,7 +161,18 @@ export default function ViolationRow( { audit, skipReason, violations }: Props )
|
|
|
157
161
|
{ violation.angieFix && (
|
|
158
162
|
<FixViolationWithAngie prompt={ buildAngiePrompt( rowLabel ) } />
|
|
159
163
|
) }
|
|
160
|
-
|
|
164
|
+
{ violation.ctaLabel && violation.externalUrl ? (
|
|
165
|
+
<ViolationCtaButton
|
|
166
|
+
ctaLabel={ violation.ctaLabel }
|
|
167
|
+
externalUrl={ violation.externalUrl }
|
|
168
|
+
/>
|
|
169
|
+
) : (
|
|
170
|
+
<EyeIcon
|
|
171
|
+
className="violation-hover-icon"
|
|
172
|
+
fontSize="tiny"
|
|
173
|
+
aria-hidden={ true }
|
|
174
|
+
/>
|
|
175
|
+
) }
|
|
161
176
|
</Box>
|
|
162
177
|
);
|
|
163
178
|
} ) }
|
package/src/register-audits.ts
CHANGED
|
@@ -15,6 +15,7 @@ import * as preferGlobalColors from './audits/prefer-global-colors';
|
|
|
15
15
|
import * as preferGlobalFonts from './audits/prefer-global-fonts';
|
|
16
16
|
import * as privacyPolicy from './audits/privacy-policy';
|
|
17
17
|
import * as robotsNoindex from './audits/robots-noindex';
|
|
18
|
+
import * as scanForCookies from './audits/scan-for-cookies';
|
|
18
19
|
import * as sectionsAndColumns from './audits/sections-and-columns';
|
|
19
20
|
import * as siteIdentity from './audits/site-identity';
|
|
20
21
|
import * as tooManyWidgets from './audits/too-many-widgets';
|
|
@@ -47,6 +48,7 @@ const AUDITS: Audit[] = [
|
|
|
47
48
|
privacyPolicy.audit,
|
|
48
49
|
accessibilityPolicy.audit,
|
|
49
50
|
cookiePolicy.audit,
|
|
51
|
+
scanForCookies.audit,
|
|
50
52
|
];
|
|
51
53
|
|
|
52
54
|
export function registerAllAudits(): void {
|
|
@@ -49,6 +49,14 @@ export const PROMOTIONS: PromotionConfig[] = [
|
|
|
49
49
|
run.result.status === 'fail' ? __( 'Generate cookie policy', 'elementor' ) : null,
|
|
50
50
|
getCtaUrl: firstFailExternalUrl,
|
|
51
51
|
},
|
|
52
|
+
{
|
|
53
|
+
auditId: 'audits/scan-for-cookies',
|
|
54
|
+
icon: ElementorCookieIcon,
|
|
55
|
+
ctaLabel: __( 'Scan', 'elementor' ),
|
|
56
|
+
formatSubtitle: ( run ) =>
|
|
57
|
+
run.result.status === 'fail' ? __( 'Scan this page for cookies', 'elementor' ) : null,
|
|
58
|
+
getCtaUrl: firstFailExternalUrl,
|
|
59
|
+
},
|
|
52
60
|
{
|
|
53
61
|
auditId: 'audits/images-too-large',
|
|
54
62
|
icon: ShieldHalfFilledIcon,
|
package/src/types.ts
CHANGED
|
@@ -38,6 +38,7 @@ export type AuditViolation = {
|
|
|
38
38
|
label: string;
|
|
39
39
|
detail?: string;
|
|
40
40
|
angieFix?: boolean;
|
|
41
|
+
ctaLabel?: string;
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
export type PageContextResponse = {
|
|
@@ -65,6 +66,9 @@ export type PageContextResponse = {
|
|
|
65
66
|
ally_plugin_url: string;
|
|
66
67
|
cookiez_plugin_active: boolean;
|
|
67
68
|
cookiez_plugin_url: string;
|
|
69
|
+
cookiez_plugin_installed: boolean;
|
|
70
|
+
cookiez_plugin_action_url: string;
|
|
71
|
+
cookiez_scan_url: string;
|
|
68
72
|
image_optimization_plugin_active: boolean;
|
|
69
73
|
image_optimization_plugin_url: string;
|
|
70
74
|
site_identity: {
|
|
@@ -2,6 +2,7 @@ import { type ChipProps } from '@elementor/ui';
|
|
|
2
2
|
import { __ } from '@wordpress/i18n';
|
|
3
3
|
|
|
4
4
|
import { type AuditCategory, type AuditResult, type AuditRun, type PageAuditReport } from '../types';
|
|
5
|
+
import { isScoredAudit } from './is-scored-audit';
|
|
5
6
|
import { sortFailedAuditResults } from './sort-failed-audits';
|
|
6
7
|
|
|
7
8
|
export type AuditStatusGroup = 'fail' | 'pass' | 'skipped';
|
|
@@ -37,7 +38,11 @@ export function partitionAuditResults(
|
|
|
37
38
|
switch ( run.result.status ) {
|
|
38
39
|
case 'fail':
|
|
39
40
|
failed.push( { ...run, result: run.result } );
|
|
40
|
-
|
|
41
|
+
|
|
42
|
+
if ( isScoredAudit( run.audit ) ) {
|
|
43
|
+
totalViolations += run.result.violations.length;
|
|
44
|
+
}
|
|
45
|
+
|
|
41
46
|
break;
|
|
42
47
|
case 'pass':
|
|
43
48
|
passed.push( { ...run, result: run.result } );
|
|
@@ -61,7 +66,11 @@ export function auditStatusDisplayCounts( report: PageAuditReport ): Record< Aud
|
|
|
61
66
|
let skipped = 0;
|
|
62
67
|
let totalViolations = 0;
|
|
63
68
|
|
|
64
|
-
for ( const { result } of report.auditResults ) {
|
|
69
|
+
for ( const { audit, result } of report.auditResults ) {
|
|
70
|
+
if ( ! isScoredAudit( audit ) ) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
65
74
|
switch ( result.status ) {
|
|
66
75
|
case 'fail':
|
|
67
76
|
totalViolations += result.violations.length;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __, sprintf } from '@wordpress/i18n';
|
|
2
2
|
|
|
3
3
|
import { type AuditCategory, type AuditSeverity, type PageAuditReport } from '../types';
|
|
4
|
+
import { isScoredAudit } from './is-scored-audit';
|
|
4
5
|
|
|
5
6
|
export type SeverityCounts = Record< AuditSeverity, number >;
|
|
6
7
|
|
|
@@ -18,6 +19,10 @@ export function countSeverities( report: PageAuditReport, category?: AuditCatego
|
|
|
18
19
|
continue;
|
|
19
20
|
}
|
|
20
21
|
|
|
22
|
+
if ( ! isScoredAudit( audit ) ) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
|
|
21
26
|
counts[ audit.severity ] += result.violations.length;
|
|
22
27
|
}
|
|
23
28
|
|