lighthouse 9.2.0-dev.20220124 → 9.2.0-dev.20220128

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 (62) hide show
  1. package/dist/report/flow.js +7 -7
  2. package/lighthouse-cli/bin.js +0 -4
  3. package/lighthouse-cli/cli-flags.js +22 -8
  4. package/lighthouse-cli/test/smokehouse/frontends/smokehouse-bin.js +2 -1
  5. package/lighthouse-core/audits/preload-fonts.js +2 -3
  6. package/lighthouse-core/audits/preload-lcp-image.js +1 -11
  7. package/lighthouse-core/audits/uses-rel-preload.js +2 -3
  8. package/lighthouse-core/gather/gatherers/inspector-issues.js +3 -5
  9. package/lighthouse-core/lib/stack-packs.js +5 -0
  10. package/lighthouse-core/runner.js +13 -0
  11. package/package.json +8 -10
  12. package/shared/localization/locales/ar-XB.json +40 -4
  13. package/shared/localization/locales/ar.json +59 -23
  14. package/shared/localization/locales/bg.json +40 -4
  15. package/shared/localization/locales/ca.json +45 -9
  16. package/shared/localization/locales/cs.json +39 -3
  17. package/shared/localization/locales/da.json +43 -7
  18. package/shared/localization/locales/de.json +42 -6
  19. package/shared/localization/locales/el.json +59 -23
  20. package/shared/localization/locales/en-GB.json +43 -7
  21. package/shared/localization/locales/en-US.json +45 -3
  22. package/shared/localization/locales/en-XA.json +40 -4
  23. package/shared/localization/locales/en-XL.json +45 -3
  24. package/shared/localization/locales/es-419.json +39 -3
  25. package/shared/localization/locales/es.json +46 -10
  26. package/shared/localization/locales/fi.json +57 -21
  27. package/shared/localization/locales/fil.json +40 -4
  28. package/shared/localization/locales/fr.json +45 -9
  29. package/shared/localization/locales/he.json +41 -5
  30. package/shared/localization/locales/hi.json +59 -23
  31. package/shared/localization/locales/hr.json +57 -21
  32. package/shared/localization/locales/hu.json +39 -3
  33. package/shared/localization/locales/id.json +40 -4
  34. package/shared/localization/locales/it.json +40 -4
  35. package/shared/localization/locales/ja.json +39 -3
  36. package/shared/localization/locales/ko.json +40 -4
  37. package/shared/localization/locales/lt.json +40 -4
  38. package/shared/localization/locales/lv.json +56 -20
  39. package/shared/localization/locales/nl.json +40 -4
  40. package/shared/localization/locales/no.json +56 -20
  41. package/shared/localization/locales/pl.json +56 -20
  42. package/shared/localization/locales/pt-PT.json +57 -21
  43. package/shared/localization/locales/pt.json +41 -5
  44. package/shared/localization/locales/ro.json +39 -3
  45. package/shared/localization/locales/ru.json +40 -4
  46. package/shared/localization/locales/sk.json +39 -3
  47. package/shared/localization/locales/sl.json +39 -3
  48. package/shared/localization/locales/sr-Latn.json +40 -4
  49. package/shared/localization/locales/sr.json +40 -4
  50. package/shared/localization/locales/sv.json +39 -3
  51. package/shared/localization/locales/ta.json +47 -11
  52. package/shared/localization/locales/te.json +61 -25
  53. package/shared/localization/locales/th.json +39 -3
  54. package/shared/localization/locales/tr.json +40 -4
  55. package/shared/localization/locales/uk.json +40 -4
  56. package/shared/localization/locales/vi.json +63 -27
  57. package/shared/localization/locales/zh-HK.json +40 -4
  58. package/shared/localization/locales/zh-TW.json +45 -9
  59. package/shared/localization/locales/zh.json +41 -5
  60. package/third-party/chromium-synchronization/inspector-issueAdded-types-test.js +1 -1
  61. package/third-party/snyk/snapshot.json +1 -0
  62. package/types/artifacts.d.ts +1 -1
@@ -24,7 +24,6 @@ import url from 'url';
24
24
  import module from 'module';
25
25
 
26
26
  import log from 'lighthouse-logger';
27
- import updateNotifier from 'update-notifier';
28
27
 
29
28
  import * as commands from './commands/commands.js';
30
29
  import * as Printer from './printer.js';
@@ -51,9 +50,6 @@ function isDev() {
51
50
  * @return {Promise<LH.RunnerResult|void>}
52
51
  */
53
52
  async function begin() {
54
- // Tell user if there's a newer version of LH.
55
- updateNotifier({pkg}).notify();
56
-
57
53
  const cliFlags = getFlags();
58
54
 
59
55
  // Process terminating command
@@ -178,7 +178,6 @@ function getFlags(manualArgv, options = {}) {
178
178
  },
179
179
  'enable-error-reporting': {
180
180
  type: 'boolean',
181
- default: undefined, // Explicitly `undefined` so prompted by default.
182
181
  describe: 'Enables error reporting, overriding any saved preference. --no-enable-error-reporting will do the opposite. More: https://git.io/vFFTO',
183
182
  },
184
183
  'gather-mode': {
@@ -343,19 +342,26 @@ function getFlags(manualArgv, options = {}) {
343
342
 
344
343
  // Augmenting yargs type with auto-camelCasing breaks in tsc@4.1.2 and @types/yargs@15.0.11,
345
344
  // so for now cast to add yarg's camelCase properties to type.
346
- const argv = parser.argv;
345
+ const argv = /** @type {Awaited<typeof parser.argv>} */ (parser.argv);
347
346
  const cliFlags = /** @type {typeof argv & CamelCasify<typeof argv>} */ (argv);
348
347
 
348
+ // yargs will return `undefined` for options that have a `coerce` function but
349
+ // are not actually present in the user input. Instead of passing properties
350
+ // explicitly set to undefined, delete them from the flags object.
351
+ for (const [k, v] of Object.entries(cliFlags)) {
352
+ if (v === undefined) delete cliFlags[k];
353
+ }
354
+
349
355
  return cliFlags;
350
356
  }
351
357
 
352
358
  /**
353
359
  * Support comma-separated values for some array flags by splitting on any ',' found.
354
360
  * @param {Array<string>=} strings
355
- * @return {Array<string>|undefined}
361
+ * @return {Array<string>=}
356
362
  */
357
363
  function splitCommaSeparatedValues(strings) {
358
- if (!strings) return strings;
364
+ if (!strings) return;
359
365
 
360
366
  return strings.flatMap(value => value.split(','));
361
367
  }
@@ -365,7 +371,9 @@ function splitCommaSeparatedValues(strings) {
365
371
  * @return {boolean|string|undefined}
366
372
  */
367
373
  function coerceOptionalStringBoolean(value) {
368
- if (typeof value !== 'undefined' && typeof value !== 'string' && typeof value !== 'boolean') {
374
+ if (value === undefined) return;
375
+
376
+ if (typeof value !== 'string' && typeof value !== 'boolean') {
369
377
  throw new Error('Invalid value: Argument must be a string or a boolean');
370
378
  }
371
379
  return value;
@@ -399,9 +407,11 @@ function coerceOutput(values) {
399
407
  * allowlist specific locales. Why? So we can support the user who requests 'es-MX' (unsupported)
400
408
  * and we'll fall back to 'es' (supported).
401
409
  * @param {unknown} value
402
- * @return {LH.Locale}
410
+ * @return {LH.Locale|undefined}
403
411
  */
404
412
  function coerceLocale(value) {
413
+ if (value === undefined) return;
414
+
405
415
  if (typeof value !== 'string') throw new Error(`Invalid value: Argument 'locale' must be a string`);
406
416
  return /** @type {LH.Locale} */ (value);
407
417
  }
@@ -431,9 +441,11 @@ function coerceExtraHeaders(value) {
431
441
  /**
432
442
  * Take yarg's unchecked object value and ensure it's proper throttling settings.
433
443
  * @param {unknown} value
434
- * @return {LH.ThrottlingSettings}
444
+ * @return {LH.ThrottlingSettings|undefined}
435
445
  */
436
446
  function coerceThrottling(value) {
447
+ if (value === undefined) return;
448
+
437
449
  if (!isObjectOfUnknownValues(value)) {
438
450
  throw new Error(`Invalid value: Argument 'throttling' must be an object, specified per-property ('throttling.rttMs', 'throttling.throughputKbps', etc)`);
439
451
  }
@@ -465,9 +477,11 @@ function coerceThrottling(value) {
465
477
  /**
466
478
  * Take yarg's unchecked object value and ensure it is a proper LH.screenEmulationSettings.
467
479
  * @param {unknown} value
468
- * @return {Partial<LH.ScreenEmulationSettings>}
480
+ * @return {Partial<LH.ScreenEmulationSettings>|undefined}
469
481
  */
470
482
  function coerceScreenEmulation(value) {
483
+ if (value === undefined) return;
484
+
471
485
  if (!isObjectOfUnknownValues(value)) {
472
486
  throw new Error(`Invalid value: Argument 'screenEmulation' must be an object, specified per-property ('screenEmulation.width', 'screenEmulation.deviceScaleFactor', etc)`);
473
487
  }
@@ -175,7 +175,8 @@ async function begin() {
175
175
 
176
176
  // Augmenting yargs type with auto-camelCasing breaks in tsc@4.1.2 and @types/yargs@15.0.11,
177
177
  // so for now cast to add yarg's camelCase properties to type.
178
- const argv = /** @type {typeof rawArgv & CamelCasify<typeof rawArgv>} */ (rawArgv);
178
+ const argv =
179
+ /** @type {Awaited<typeof rawArgv> & CamelCasify<Awaited<typeof rawArgv>>} */ (rawArgv);
179
180
 
180
181
  const jobs = Number.isFinite(argv.jobs) ? argv.jobs : undefined;
181
182
  const retries = Number.isFinite(argv.retries) ? argv.retries : undefined;
@@ -97,9 +97,8 @@ class PreloadFontsAudit extends Audit {
97
97
  * @return {Promise<LH.Audit.Product>}
98
98
  */
99
99
  static async audit() {
100
- // Preload advice is dangerous until https://bugs.chromium.org/p/chromium/issues/detail?id=788757
101
- // has been fixed and validated. All preload audits are on hold until then.
102
- // See https://github.com/GoogleChrome/lighthouse/issues/11960 for more discussion.
100
+ // Preload advice is on hold until https://github.com/GoogleChrome/lighthouse/issues/11960
101
+ // is resolved.
103
102
  return {score: 1, notApplicable: true};
104
103
  }
105
104
  }
@@ -198,7 +198,7 @@ class PreloadLCPImageAudit extends Audit {
198
198
  * @param {LH.Audit.Context} context
199
199
  * @return {Promise<LH.Audit.Product>}
200
200
  */
201
- static async audit_(artifacts, context) {
201
+ static async audit(artifacts, context) {
202
202
  const gatherContext = artifacts.GatherContext;
203
203
  const trace = artifacts.traces[PreloadLCPImageAudit.DEFAULT_PASS];
204
204
  const devtoolsLog = artifacts.devtoolsLogs[PreloadLCPImageAudit.DEFAULT_PASS];
@@ -236,16 +236,6 @@ class PreloadLCPImageAudit extends Audit {
236
236
  details,
237
237
  };
238
238
  }
239
-
240
- /**
241
- * @return {Promise<LH.Audit.Product>}
242
- */
243
- static async audit() {
244
- // Preload advice is dangerous until https://bugs.chromium.org/p/chromium/issues/detail?id=788757
245
- // has been fixed and validated. All preload audits are on hold until then.
246
- // See https://github.com/GoogleChrome/lighthouse/issues/11960 for more discussion.
247
- return {score: 1, notApplicable: true, details: Audit.makeOpportunityDetails([], [], 0)};
248
- }
249
239
  }
250
240
 
251
241
  module.exports = PreloadLCPImageAudit;
@@ -257,9 +257,8 @@ class UsesRelPreloadAudit extends Audit {
257
257
  * @return {Promise<LH.Audit.Product>}
258
258
  */
259
259
  static async audit() {
260
- // Preload advice is dangerous until https://bugs.chromium.org/p/chromium/issues/detail?id=788757
261
- // has been fixed and validated. All preload audits are on hold until then.
262
- // See https://github.com/GoogleChrome/lighthouse/issues/11960 for more discussion.
260
+ // Preload advice is on hold until https://github.com/GoogleChrome/lighthouse/issues/11960
261
+ // is resolved.
263
262
  return {score: 1, notApplicable: true, details: Audit.makeOpportunityDetails([], [], 0)};
264
263
  }
265
264
  }
@@ -66,6 +66,7 @@ class InspectorIssues extends FRGatherer {
66
66
  contentSecurityPolicyIssue: [],
67
67
  corsIssue: [],
68
68
  deprecationIssue: [],
69
+ federatedAuthRequestIssue: [],
69
70
  genericIssue: [],
70
71
  heavyAdIssue: [],
71
72
  lowTextContrastIssue: [],
@@ -75,14 +76,11 @@ class InspectorIssues extends FRGatherer {
75
76
  sameSiteCookieIssue: [],
76
77
  sharedArrayBufferIssue: [],
77
78
  twaQualityEnforcement: [],
78
- wasmCrossOriginModuleSharingIssue: [],
79
79
  };
80
80
  const keys = /** @type {Array<keyof LH.Artifacts['InspectorIssues']>} */(Object.keys(artifact));
81
81
  for (const key of keys) {
82
- // The wasmCrossOriginModuleSharingIssue key doesn't follow the pattern of the rest. See
83
- // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/public/devtools_protocol/browser_protocol.pdl;l=811;drc=9c10bf258928b5d169ba6a449f8f33958f7947ea
84
- /** @type {`${key}Details` | `wasmCrossOriginModuleSharingIssue`} */
85
- const detailsKey = (key === 'wasmCrossOriginModuleSharingIssue' ? `${key}` : `${key}Details`);
82
+ /** @type {`${key}Details`} */
83
+ const detailsKey = `${key}Details`;
86
84
  const allDetails = this._issues.map(issue => issue.details[detailsKey]);
87
85
  for (const detail of allDetails) {
88
86
  if (!detail) {
@@ -19,6 +19,11 @@ const stackPacksToInclude = [
19
19
  packId: 'wordpress',
20
20
  requiredStacks: ['js:wordpress'],
21
21
  },
22
+ // waiting for https://github.com/johnmichel/Library-Detector-for-Chrome/pull/193
23
+ // {
24
+ // packId: 'ezoic',
25
+ // requiredStacks: ['js:ezoic'],
26
+ // },
22
27
  {
23
28
  packId: 'drupal',
24
29
  requiredStacks: ['js:drupal'],
@@ -263,6 +263,19 @@ class Runner {
263
263
  const normalizedGatherSettings = Object.assign({}, artifacts.settings, overrides);
264
264
  const normalizedAuditSettings = Object.assign({}, settings, overrides);
265
265
 
266
+ // First, try each key individually so we can print which key differed.
267
+ const keys = new Set([
268
+ ...Object.keys(normalizedGatherSettings),
269
+ ...Object.keys(normalizedAuditSettings),
270
+ ]);
271
+ for (const k of keys) {
272
+ if (!isDeepEqual(normalizedGatherSettings[k], normalizedAuditSettings[k])) {
273
+ throw new Error(
274
+ `Cannot change settings between gathering and auditing. Difference found at: ${k}`);
275
+ }
276
+ }
277
+
278
+ // Call `isDeepEqual` on the entire thing, just in case something was missed.
266
279
  if (!isDeepEqual(normalizedGatherSettings, normalizedAuditSettings)) {
267
280
  throw new Error('Cannot change settings between gathering and auditing');
268
281
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lighthouse",
3
- "version": "9.2.0-dev.20220124",
3
+ "version": "9.2.0-dev.20220128",
4
4
  "description": "Automated auditing, performance metrics, and best practices for the web.",
5
5
  "main": "./lighthouse-core/index.js",
6
6
  "bin": {
@@ -125,10 +125,9 @@
125
125
  "@types/resize-observer-browser": "^0.1.1",
126
126
  "@types/semver": "^5.5.0",
127
127
  "@types/tabulator-tables": "^4.9.1",
128
- "@types/update-notifier": "^4.1.0",
129
128
  "@types/ws": "^7.0.0",
130
- "@types/yargs": "^16.0.0",
131
- "@types/yargs-parser": "^15.0.0",
129
+ "@types/yargs": "^17.0.8",
130
+ "@types/yargs-parser": "^20.2.1",
132
131
  "@typescript-eslint/eslint-plugin": "^5.6.0",
133
132
  "@typescript-eslint/parser": "^5.6.0",
134
133
  "acorn": "^8.5.0",
@@ -142,7 +141,7 @@
142
141
  "cpy": "^8.1.2",
143
142
  "cross-env": "^7.0.2",
144
143
  "csv-validator": "^0.0.3",
145
- "devtools-protocol": "0.0.957544",
144
+ "devtools-protocol": "0.0.964215",
146
145
  "es-main": "^1.0.2",
147
146
  "eslint": "^8.4.1",
148
147
  "eslint-config-google": "^0.14.0",
@@ -195,7 +194,7 @@
195
194
  "jpeg-js": "^0.4.3",
196
195
  "js-library-detector": "^6.4.0",
197
196
  "lighthouse-logger": "^1.3.0",
198
- "lighthouse-stack-packs": "^1.6.0",
197
+ "lighthouse-stack-packs": "^1.7.0",
199
198
  "lodash.clonedeep": "^4.5.0",
200
199
  "lodash.get": "^4.4.2",
201
200
  "lodash.isequal": "^4.5.0",
@@ -210,13 +209,12 @@
210
209
  "semver": "^5.3.0",
211
210
  "speedline-core": "^1.4.3",
212
211
  "third-party-web": "^0.12.7",
213
- "update-notifier": "^4.1.0",
214
212
  "ws": "^7.0.0",
215
- "yargs": "^16.1.1",
216
- "yargs-parser": "^20.2.4"
213
+ "yargs": "^17.3.1",
214
+ "yargs-parser": "^21.0.0"
217
215
  },
218
216
  "resolutions": {
219
- "puppeteer/**/devtools-protocol": "0.0.957544"
217
+ "puppeteer/**/devtools-protocol": "0.0.964215"
220
218
  },
221
219
  "repository": "GoogleChrome/lighthouse",
222
220
  "keywords": [
@@ -477,13 +477,13 @@
477
477
  "message": "`[user-scalable=\"no\"]` ‏‮is‬‏ ‏‮not‬‏ ‏‮used‬‏ ‏‮in‬‏ ‏‮the‬‏ `<meta name=\"viewport\">` ‏‮element‬‏ ‏‮and‬‏ ‏‮the‬‏ `[maximum-scale]` ‏‮attribute‬‏ ‏‮is‬‏ ‏‮not‬‏ ‏‮less‬‏ ‏‮than‬‏ 5."
478
478
  },
479
479
  "lighthouse-core/audits/accessibility/object-alt.js | description": {
480
- "message": "‏‮Screen‬‏ ‏‮readers‬‏ ‏‮cannot‬‏ ‏‮translate‬‏ ‏‮non‬‏-‏‮text‬‏ ‏‮content‬‏. ‏‮Adding‬‏ ‏‮alt‬‏ ‏‮text‬‏ ‏‮to‬‏ `<object>` ‏‮elements‬‏ ‏‮helps‬‏ ‏‮screen‬‏ ‏‮readers‬‏ ‏‮convey‬‏ ‏‮meaning‬‏ ‏‮to‬‏ ‏‮users‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://web.dev/object-alt/)."
480
+ "message": "‏‮Screen‬‏ ‏‮readers‬‏ ‏‮cannot‬‏ ‏‮translate‬‏ ‏‮non‬‏-‏‮text‬‏ ‏‮content‬‏. ‏‮Adding‬‏ ‏‮alternate‬‏ ‏‮text‬‏ ‏‮to‬‏ `<object>` ‏‮elements‬‏ ‏‮helps‬‏ ‏‮screen‬‏ ‏‮readers‬‏ ‏‮convey‬‏ ‏‮meaning‬‏ ‏‮to‬‏ ‏‮users‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://web.dev/object-alt/)."
481
481
  },
482
482
  "lighthouse-core/audits/accessibility/object-alt.js | failureTitle": {
483
- "message": "`<object>` ‏‮elements‬‏ ‏‮do‬‏ ‏‮not‬‏ ‏‮have‬‏ `[alt]` ‏‮text‬‏"
483
+ "message": "`<object>` ‏‮elements‬‏ ‏‮do‬‏ ‏‮not‬‏ ‏‮have‬‏ ‏‮alternate‬‏ ‏‮text‬‏"
484
484
  },
485
485
  "lighthouse-core/audits/accessibility/object-alt.js | title": {
486
- "message": "`<object>` ‏‮elements‬‏ ‏‮have‬‏ `[alt]` ‏‮text‬‏"
486
+ "message": "`<object>` ‏‮elements‬‏ ‏‮have‬‏ ‏‮alternate‬‏ ‏‮text‬‏"
487
487
  },
488
488
  "lighthouse-core/audits/accessibility/tabindex.js | description": {
489
489
  "message": "‏‮A‬‏ ‏‮value‬‏ ‏‮greater‬‏ ‏‮than‬‏ 0 ‏‮implies‬‏ ‏‮an‬‏ ‏‮explicit‬‏ ‏‮navigation‬‏ ‏‮ordering‬‏. ‏‮Although‬‏ ‏‮technically‬‏ ‏‮valid‬‏, ‏‮this‬‏ ‏‮often‬‏ ‏‮creates‬‏ ‏‮frustrating‬‏ ‏‮experiences‬‏ ‏‮for‬‏ ‏‮users‬‏ ‏‮who‬‏ ‏‮rely‬‏ ‏‮on‬‏ ‏‮assistive‬‏ ‏‮technologies‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://web.dev/tabindex/)."
@@ -1052,6 +1052,9 @@
1052
1052
  "lighthouse-core/audits/installable-manifest.js | not-offline-capable": {
1053
1053
  "message": "‏‮Page‬‏ ‏‮does‬‏ ‏‮not‬‏ ‏‮work‬‏ ‏‮offline‬‏"
1054
1054
  },
1055
+ "lighthouse-core/audits/installable-manifest.js | pipeline-restarted": {
1056
+ "message": "‏‮PWA‬‏ ‏‮has‬‏ ‏‮been‬‏ ‏‮uninstalled‬‏ ‏‮and‬‏ ‏‮installability‬‏ ‏‮checks‬‏ ‏‮resetting‬‏."
1057
+ },
1055
1058
  "lighthouse-core/audits/installable-manifest.js | platform-not-supported-on-android": {
1056
1059
  "message": "‏‮The‬‏ ‏‮specified‬‏ ‏‮application‬‏ ‏‮platform‬‏ ‏‮is‬‏ ‏‮not‬‏ ‏‮supported‬‏ ‏‮on‬‏ ‏‮Android‬‏"
1057
1060
  },
@@ -1061,6 +1064,9 @@
1061
1064
  "lighthouse-core/audits/installable-manifest.js | prefer-related-applications-only-beta-stable": {
1062
1065
  "message": "‏‮prefer‬‏_‏‮related‬‏_‏‮applications‬‏ ‏‮is‬‏ ‏‮only‬‏ ‏‮supported‬‏ ‏‮on‬‏ ‏‮Chrome‬‏ ‏‮Beta‬‏ ‏‮and‬‏ ‏‮Stable‬‏ ‏‮channels‬‏ ‏‮on‬‏ ‏‮Android‬‏."
1063
1066
  },
1067
+ "lighthouse-core/audits/installable-manifest.js | protocol-timeout": {
1068
+ "message": "‏‮Lighthouse‬‏ ‏‮could‬‏ ‏‮not‬‏ ‏‮determine‬‏ ‏‮if‬‏ ‏‮there‬‏ ‏‮was‬‏ ‏‮a‬‏ ‏‮service‬‏ ‏‮worker‬‏. ‏‮Please‬‏ ‏‮try‬‏ ‏‮with‬‏ ‏‮a‬‏ ‏‮newer‬‏ ‏‮version‬‏ ‏‮of‬‏ ‏‮Chrome‬‏."
1069
+ },
1064
1070
  "lighthouse-core/audits/installable-manifest.js | start-url-not-valid": {
1065
1071
  "message": "‏‮Manifest‬‏ ‏‮start‬‏ ‏‮URL‬‏ ‏‮is‬‏ ‏‮not‬‏ ‏‮valid‬‏"
1066
1072
  },
@@ -1212,7 +1218,7 @@
1212
1218
  "message": "‏‮Server‬‏ ‏‮Backend‬‏ ‏‮Latencies‬‏"
1213
1219
  },
1214
1220
  "lighthouse-core/audits/no-unload-listeners.js | description": {
1215
- "message": "‏‮The‬‏ `unload` ‏‮event‬‏ ‏‮does‬‏ ‏‮not‬‏ ‏‮fire‬‏ ‏‮reliably‬‏ ‏‮and‬‏ ‏‮listening‬‏ ‏‮for‬‏ ‏‮it‬‏ ‏‮can‬‏ ‏‮prevent‬‏ ‏‮browser‬‏ ‏‮optimizations‬‏ ‏‮like‬‏ ‏‮the‬‏ ‏‮Back‬‏-‏‮Forward‬‏ ‏‮Cache‬‏. ‏‮Consider‬‏ ‏‮using‬‏ ‏‮the‬‏ `pagehide` ‏‮or‬‏ `visibilitychange` ‏‮events‬‏ ‏‮instead‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://developers.google.com/web/updates/2018/07/page-lifecycle-api#the-unload-event)"
1221
+ "message": "‏‮The‬‏ `unload` ‏‮event‬‏ ‏‮does‬‏ ‏‮not‬‏ ‏‮fire‬‏ ‏‮reliably‬‏ ‏‮and‬‏ ‏‮listening‬‏ ‏‮for‬‏ ‏‮it‬‏ ‏‮can‬‏ ‏‮prevent‬‏ ‏‮browser‬‏ ‏‮optimizations‬‏ ‏‮like‬‏ ‏‮the‬‏ ‏‮Back‬‏-‏‮Forward‬‏ ‏‮Cache‬‏. ‏‮Use‬‏ `pagehide` ‏‮or‬‏ `visibilitychange` ‏‮events‬‏ ‏‮instead‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://web.dev/bfcache/#never-use-the-unload-event)"
1216
1222
  },
1217
1223
  "lighthouse-core/audits/no-unload-listeners.js | failureTitle": {
1218
1224
  "message": "‏‮Registers‬‏ ‏‮an‬‏ `unload` ‏‮listener‬‏"
@@ -2219,6 +2225,36 @@
2219
2225
  "node_modules/lighthouse-stack-packs/packs/magento.js | uses-rel-preload": {
2220
2226
  "message": "`<link rel=preload>` ‏‮tags‬‏ ‏‮can‬‏ ‏‮be‬‏ ‏‮added‬‏ ‏‮by‬‏ [‏‮modifying‬‏ ‏‮a‬‏ ‏‮themes‬‏'‏‮s‬‏ ‏‮layout‬‏](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html)."
2221
2227
  },
2228
+ "node_modules/lighthouse-stack-packs/packs/next.js | modern-image-formats": {
2229
+ "message": "‏‮Use‬‏ ‏‮the‬‏ `Next.js` ‏‮Image‬‏ ‏‮Optimization‬‏ ‏‮API‬‏ ‏‮to‬‏ ‏‮serve‬‏ ‏‮modern‬‏ ‏‮formats‬‏ ‏‮like‬‏ `WebP` ‏‮and‬‏ `AVIF`. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/api-reference/next/image#acceptable-formats)."
2230
+ },
2231
+ "node_modules/lighthouse-stack-packs/packs/next.js | offscreen-images": {
2232
+ "message": "‏‮Use‬‏ ‏‮the‬‏ `next/image` ‏‮component‬‏, ‏‮which‬‏ ‏‮defaults‬‏ ‏‮to‬‏ `loading=\"lazy\"`. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/api-reference/next/image#loading)."
2233
+ },
2234
+ "node_modules/lighthouse-stack-packs/packs/next.js | render-blocking-resources": {
2235
+ "message": "‏‮Use‬‏ ‏‮the‬‏ `next/script` ‏‮component‬‏ ‏‮to‬‏ ‏‮defer‬‏ ‏‮loading‬‏ ‏‮of‬‏ ‏‮non‬‏-‏‮critical‬‏ ‏‮third‬‏-‏‮party‬‏ ‏‮scripts‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/basic-features/script)."
2236
+ },
2237
+ "node_modules/lighthouse-stack-packs/packs/next.js | unused-css-rules": {
2238
+ "message": "‏‮Consider‬‏ ‏‮setting‬‏ ‏‮up‬‏ `PurgeCSS` ‏‮in‬‏ `Next.js` ‏‮configuration‬‏ ‏‮to‬‏ ‏‮remove‬‏ ‏‮unused‬‏ ‏‮rules‬‏ ‏‮from‬‏ ‏‮stylesheets‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://purgecss.com/guides/next.html)."
2239
+ },
2240
+ "node_modules/lighthouse-stack-packs/packs/next.js | unused-javascript": {
2241
+ "message": "‏‮Use‬‏ `Webpack Bundle Analyzer` ‏‮to‬‏ ‏‮detect‬‏ ‏‮unused‬‏ ‏‮JavaScript‬‏ ‏‮code‬‏. [‏‮Learn‬‏ ‏‮mode‬‏](https://github.com/vercel/next.js/tree/canary/packages/next-bundle-analyzer)"
2242
+ },
2243
+ "node_modules/lighthouse-stack-packs/packs/next.js | user-timings": {
2244
+ "message": "‏‮Consider‬‏ ‏‮using‬‏ `Next.js Analytics` ‏‮to‬‏ ‏‮measure‬‏ ‏‮your‬‏ ‏‮app‬‏'‏‮s‬‏ ‏‮real‬‏-‏‮world‬‏ ‏‮performance‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/advanced-features/measuring-performance)."
2245
+ },
2246
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-long-cache-ttl": {
2247
+ "message": "‏‮Configure‬‏ ‏‮caching‬‏ ‏‮for‬‏ ‏‮immutable‬‏ ‏‮assets‬‏ ‏‮and‬‏ `Server-side Rendered` (‏‮SSR‬‏) ‏‮pages‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/going-to-production#caching)."
2248
+ },
2249
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-optimized-images": {
2250
+ "message": "‏‮Use‬‏ ‏‮the‬‏ `next/image` ‏‮component‬‏ ‏‮instead‬‏ ‏‮of‬‏ `<img>` ‏‮to‬‏ ‏‮optimize‬‏ ‏‮images‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/basic-features/image-optimization)."
2251
+ },
2252
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-responsive-images": {
2253
+ "message": "‏‮Use‬‏ ‏‮the‬‏ `next/image` ‏‮component‬‏ ‏‮to‬‏ ‏‮set‬‏ ‏‮the‬‏ ‏‮appropriate‬‏ `sizes`. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/api-reference/next/image#sizes)."
2254
+ },
2255
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-text-compression": {
2256
+ "message": "‏‮Enable‬‏ ‏‮compression‬‏ ‏‮on‬‏ ‏‮your‬‏ ‏‮Next‬‏.‏‮js‬‏ ‏‮server‬‏. [‏‮Learn‬‏ ‏‮more‬‏](https://nextjs.org/docs/api-reference/next.config.js/compression)."
2257
+ },
2222
2258
  "node_modules/lighthouse-stack-packs/packs/octobercms.js | efficient-animated-content": {
2223
2259
  "message": "[‏‮Replace‬‏ ‏‮animated‬‏ ‏‮GIFs‬‏ ‏‮with‬‏ ‏‮video‬‏](https://web.dev/replace-gifs-with-videos/) ‏‮for‬‏ ‏‮faster‬‏ ‏‮web‬‏ ‏‮page‬‏ ‏‮loads‬‏ ‏‮and‬‏ ‏‮consider‬‏ ‏‮using‬‏ ‏‮modern‬‏ ‏‮file‬‏ ‏‮formats‬‏ ‏‮such‬‏ ‏‮as‬‏ [‏‮WebM‬‏](https://web.dev/replace-gifs-with-videos/#create-webm-videos) ‏‮or‬‏ [‏‮AV‬‏1](https://developers.google.com/web/updates/2018/09/chrome-70-media-updates#av1-decoder) ‏‮to‬‏ ‏‮improve‬‏ ‏‮compression‬‏ ‏‮efficiency‬‏ ‏‮by‬‏ ‏‮greater‬‏ ‏‮than‬‏ 30% ‏‮over‬‏ ‏‮the‬‏ ‏‮current‬‏ ‏‮state‬‏-‏‮of‬‏-‏‮the‬‏-‏‮art‬‏ ‏‮video‬‏ ‏‮codec‬‏, ‏‮VP‬‏9."
2224
2260
  },
@@ -3,7 +3,7 @@
3
3
  "message": "كل التقارير"
4
4
  },
5
5
  "flow-report/src/i18n/ui-strings.js | categories": {
6
- "message": "Categories"
6
+ "message": "الفئات"
7
7
  },
8
8
  "flow-report/src/i18n/ui-strings.js | categoryAccessibility": {
9
9
  "message": "إمكانية الوصول"
@@ -24,40 +24,40 @@
24
24
  "message": "سطح المكتب"
25
25
  },
26
26
  "flow-report/src/i18n/ui-strings.js | helpDialogTitle": {
27
- "message": "Understanding the Lighthouse Flow Report"
27
+ "message": "فهم تقرير مسار Lighthouse"
28
28
  },
29
29
  "flow-report/src/i18n/ui-strings.js | helpLabel": {
30
- "message": "Understanding Flows"
30
+ "message": "فهم المسارات"
31
31
  },
32
32
  "flow-report/src/i18n/ui-strings.js | helpUseCaseInstructionNavigation": {
33
- "message": "Use Navigation reports to..."
33
+ "message": "يمكنك استخدام تقارير التنقُّل من أجل..."
34
34
  },
35
35
  "flow-report/src/i18n/ui-strings.js | helpUseCaseInstructionSnapshot": {
36
- "message": "Use Snapshot reports to..."
36
+ "message": "يمكنك استخدام التقارير الخاصة بلحظات معيّنة من أجل..."
37
37
  },
38
38
  "flow-report/src/i18n/ui-strings.js | helpUseCaseInstructionTimespan": {
39
- "message": "Use Timespan reports to..."
39
+ "message": "يمكنك استخدام تقارير الفترات الزمنية من أجل..."
40
40
  },
41
41
  "flow-report/src/i18n/ui-strings.js | helpUseCaseNavigation1": {
42
- "message": "Obtain a Lighthouse Performance score."
42
+ "message": "الحصول على نتيجة أداء أداة Lighthouse"
43
43
  },
44
44
  "flow-report/src/i18n/ui-strings.js | helpUseCaseNavigation2": {
45
- "message": "Measure page load Performance metrics such as Largest Contentful Paint and Speed Index."
45
+ "message": "التعرّف على قيم مقاييس أداء تحميل الصفحة، مثل سرعة عرض أكبر جزء من المحتوى على الصفحة ومؤشر السرعة"
46
46
  },
47
47
  "flow-report/src/i18n/ui-strings.js | helpUseCaseNavigation3": {
48
- "message": "Assess Progressive Web App capabilities."
48
+ "message": "تقييم إمكانات تطبيقات الويب التقدّمية"
49
49
  },
50
50
  "flow-report/src/i18n/ui-strings.js | helpUseCaseSnapshot1": {
51
- "message": "Find accessibility issues in single page applications or complex forms."
51
+ "message": "التعرّف على المشاكل التي تحول دون سهولة الاستخدام في التطبيقات المكوّنة من صفحة واحدة أو النماذج المُعقَّدة"
52
52
  },
53
53
  "flow-report/src/i18n/ui-strings.js | helpUseCaseSnapshot2": {
54
- "message": "Evaluate best practices of menus and UI elements hidden behind interaction."
54
+ "message": "تقييم أفضل الممارسات المتعلّقة بالقوائم وعناصر واجهة المستخدم المخفية خلف التفاعلات"
55
55
  },
56
56
  "flow-report/src/i18n/ui-strings.js | helpUseCaseTimespan1": {
57
- "message": "Measure layout shifts and JavaScript execution time on a series of interactions."
57
+ "message": "قياس متغيّرات التصميم ووقت تنفيذ JavaScript على سلسلة من التفاعلات"
58
58
  },
59
59
  "flow-report/src/i18n/ui-strings.js | helpUseCaseTimespan2": {
60
- "message": "Discover performance opportunities to improve the experience for long-lived pages and single-page applications."
60
+ "message": "التعرّف على فرص تحسين الأداء من أجل تحسين تجربة استخدام الصفحات التي يفتحها المستخدم لمدة طويلة والتطبيقات المكوّنة من صفحة واحدة"
61
61
  },
62
62
  "flow-report/src/i18n/ui-strings.js | highestImpact": {
63
63
  "message": "عمليات التدقيق الأعلى تأثيرًا"
@@ -72,7 +72,7 @@
72
72
  "message": "تحميل الصفحة"
73
73
  },
74
74
  "flow-report/src/i18n/ui-strings.js | navigationLongDescription": {
75
- "message": "Navigation reports analyze a single page load, exactly like the original Lighthouse reports."
75
+ "message": "تحلِّل تقارير التنقُّل أداء تحميل صفحة واحدة، تمامًا مثل تقارير Lighthouse الأصلية."
76
76
  },
77
77
  "flow-report/src/i18n/ui-strings.js | navigationReport": {
78
78
  "message": "تقرير التنقُّل في الصفحة"
@@ -99,13 +99,13 @@
99
99
  "message": "جيد"
100
100
  },
101
101
  "flow-report/src/i18n/ui-strings.js | save": {
102
- "message": "Save"
102
+ "message": "حفظ"
103
103
  },
104
104
  "flow-report/src/i18n/ui-strings.js | snapshotDescription": {
105
105
  "message": "الحالة التي تم تسجيلها للصفحة"
106
106
  },
107
107
  "flow-report/src/i18n/ui-strings.js | snapshotLongDescription": {
108
- "message": "Snapshot reports analyze the page in a particular state, typically after user interactions."
108
+ "message": "تُجري التقارير الخاصة بلحظات معيّنة تحليلاً للصفحة في حالة مُحدَّدة، عادةً ما بعد تفاعلات المستخدم."
109
109
  },
110
110
  "flow-report/src/i18n/ui-strings.js | snapshotReport": {
111
111
  "message": "التقرير الخاص بالصفحة في لحظة معيَّنة"
@@ -120,7 +120,7 @@
120
120
  "message": "تفاعلات المستخدمين"
121
121
  },
122
122
  "flow-report/src/i18n/ui-strings.js | timespanLongDescription": {
123
- "message": "Timespan reports analyze an arbitrary period of time, typically containing user interactions."
123
+ "message": "تحلِّل تقارير الفترات الزمنية أداء صفحة خلال فترات زمنية عشوائية، وعادةً ما تتضمّن تفاعلات المستخدم."
124
124
  },
125
125
  "flow-report/src/i18n/ui-strings.js | timespanReport": {
126
126
  "message": "تقرير الإطار الزمني"
@@ -477,13 +477,13 @@
477
477
  "message": "`[user-scalable=\"no\"]` غير مستخدم في العنصر `<meta name=\"viewport\">` والسمة `[maximum-scale]` لا تقلّ عن 5."
478
478
  },
479
479
  "lighthouse-core/audits/accessibility/object-alt.js | description": {
480
- "message": "لا يمكن لبرامج قراءة الشاشة ترجمة المحتوى غير النصي. تؤدي إضافة نص بديل إلى عناصر `<object>` إلى مساعدة برامج قراءة الشاشة على نقل المعنى إلى المستخدمين. [مزيد من المعلومات](https://web.dev/object-alt/)"
480
+ "message": "لا يمكن لبرامج قراءة الشاشة ترجمة المحتوى غير النصي. وتؤدي إضافة نص بديل إلى عناصر `<object>` إلى مساعدة برامج قراءة الشاشة على إيضاح المعنى للمستخدمين. [مزيد من المعلومات](https://web.dev/object-alt/)"
481
481
  },
482
482
  "lighthouse-core/audits/accessibility/object-alt.js | failureTitle": {
483
- "message": "عناصر `<object>` لا تحتوي على نص `[alt]`"
483
+ "message": "عناصر `<object>` لا تحتوي على نص بديل"
484
484
  },
485
485
  "lighthouse-core/audits/accessibility/object-alt.js | title": {
486
- "message": "عناصر `<object>` تحتوي على نص `[alt]`"
486
+ "message": "عناصر `<object>` تحتوي على نص بديل"
487
487
  },
488
488
  "lighthouse-core/audits/accessibility/tabindex.js | description": {
489
489
  "message": "تشير القيمة الأكبر من 0 إلى وجود طلب تنقل صريح. على الرغم من أن ذلك صحيح تقنيًّا، غالبًا ما يؤدي ذلك إلى إنشاء تجارب محبطة للمستخدمين الذين يعتمدون على التقنيات المساعدة. [مزيد من المعلومات](https://web.dev/tabindex/)"
@@ -1052,6 +1052,9 @@
1052
1052
  "lighthouse-core/audits/installable-manifest.js | not-offline-capable": {
1053
1053
  "message": "لا تعمل هذه الصفحة بلا إنترنت."
1054
1054
  },
1055
+ "lighthouse-core/audits/installable-manifest.js | pipeline-restarted": {
1056
+ "message": "تم إلغاء تثبيت تطبيق الويب التقدّمي (PWA) وتتم حاليًا إعادة ضبط عمليات التحقّق من قابلية التثبيت."
1057
+ },
1055
1058
  "lighthouse-core/audits/installable-manifest.js | platform-not-supported-on-android": {
1056
1059
  "message": "لا تتوفّر منصة التطبيقات المحدّدة على Android."
1057
1060
  },
@@ -1061,6 +1064,9 @@
1061
1064
  "lighthouse-core/audits/installable-manifest.js | prefer-related-applications-only-beta-stable": {
1062
1065
  "message": "لا يتوافق حقل الإدخال prefer_related_applications إلا مع الإصدار التجريبي من متصفِّح Chrome والقنوات الثابتة على Android."
1063
1066
  },
1067
+ "lighthouse-core/audits/installable-manifest.js | protocol-timeout": {
1068
+ "message": "تعذَّر على أداة Lighthouse تحديد ما إذا كان يتوفّر مشغّل خدمات. يُرجى إعادة المحاولة باستخدام إصدار أحدث من متصفّح Chrome."
1069
+ },
1064
1070
  "lighthouse-core/audits/installable-manifest.js | start-url-not-valid": {
1065
1071
  "message": "عنوان URL البداية لملف البيان غير صالح."
1066
1072
  },
@@ -1212,7 +1218,7 @@
1212
1218
  "message": "أوقات الاستجابة لواجهة الخادم الخلفية"
1213
1219
  },
1214
1220
  "lighthouse-core/audits/no-unload-listeners.js | description": {
1215
- "message": "لا يعمل حدث `unload` بفعالية ويمكن أن تؤدي معالجته إلى منع تحسينات المتصفّح، مثل ميزة \"التخزين المؤقت للصفحات\". بدلاً من هذا الحدث، يمكنك استخدام `pagehide` أو `visibilitychange`. [مزيد من المعلومات](https://developers.google.com/web/updates/2018/07/page-lifecycle-api#the-unload-event)"
1221
+ "message": "لا يعمل حدث `unload` بفاعلية ويمكن أن تؤدي معالجته إلى عدم تنفيذ عمليات تحسين المتصفّح، مثل عملية \"التخزين المؤقت للصفحات\". وبدلاً من هذا الحدث، يمكنك استخدام `pagehide` أو `visibilitychange`. [مزيد من المعلومات](https://web.dev/bfcache/#never-use-the-unload-event)"
1216
1222
  },
1217
1223
  "lighthouse-core/audits/no-unload-listeners.js | failureTitle": {
1218
1224
  "message": "يتم استخدام أدوات معالجة حدث `unload`"
@@ -2145,7 +2151,7 @@
2145
2151
  "message": "يمكنك تحميل ملف GIF إلى خدمة ستتيح تضمينه في شكل فيديو HTML5."
2146
2152
  },
2147
2153
  "node_modules/lighthouse-stack-packs/packs/joomla.js | modern-image-formats": {
2148
- "message": "يمكنك استخدام [مكوّن إضافي](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=webp) أو خدمة تتيح لك تحويل صورك المحمَّلة إلى أفضل التنسيقات تلقائيًا."
2154
+ "message": "يمكنك استخدام [مكوِّن إضافي](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=webp) أو خدمة تتيح لك تحويل صورك المحمَّلة إلى أفضل التنسيقات تلقائيًا."
2149
2155
  },
2150
2156
  "node_modules/lighthouse-stack-packs/packs/joomla.js | offscreen-images": {
2151
2157
  "message": "يمكنك تثبيت [مكوِّن Joomla الإضافي المُساعِد في التحميل البطيء](https://extensions.joomla.org/instant-search/?jed_live%5Bquery%5D=lazy%20loading) والذي يتيح لك إمكانية تأجيل أي صور خارج الشاشة، أو يمكنك الانتقال إلى نموذج يوفّر هذه الوظيفة. وبدءًا من الإصدار Joomla 4.0، تحصل كل الصور الجديدة [تلقائيًا](https://github.com/joomla/joomla-cms/pull/30748) على السمة `loading` من الحزمة الأساسية."
@@ -2219,6 +2225,36 @@
2219
2225
  "node_modules/lighthouse-stack-packs/packs/magento.js | uses-rel-preload": {
2220
2226
  "message": "يمكن إضافة علامات `<link rel=preload>` عن طريق [تعديل تنسيق التصميمات](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html)."
2221
2227
  },
2228
+ "node_modules/lighthouse-stack-packs/packs/next.js | modern-image-formats": {
2229
+ "message": "يمكنك استخدام Image Optimization API `Next.js` لعرض تنسيقات حديثة مثل `WebP` و`AVIF`. [مزيد من المعلومات](https://nextjs.org/docs/api-reference/next/image#acceptable-formats)"
2230
+ },
2231
+ "node_modules/lighthouse-stack-packs/packs/next.js | offscreen-images": {
2232
+ "message": "يمكنك استخدام المكوِّن `next/image` الذي يتم تلقائيًا ضبطه على `loading=\"lazy\"`. [مزيد من المعلومات](https://nextjs.org/docs/api-reference/next/image#loading)"
2233
+ },
2234
+ "node_modules/lighthouse-stack-packs/packs/next.js | render-blocking-resources": {
2235
+ "message": "يمكنك استخدام المكوِّن `next/script` لتأجيل تحميل النصوص البرمجية غير المهمة التابعة لجهات خارجية. [مزيد من المعلومات](https://nextjs.org/docs/basic-features/script)"
2236
+ },
2237
+ "node_modules/lighthouse-stack-packs/packs/next.js | unused-css-rules": {
2238
+ "message": "يمكنك إعداد `PurgeCSS` في عملية ضبط `Next.js` لإزالة أي قواعد غير مستخدَمة من أوراق الأنماط. [مزيد من المعلومات](https://purgecss.com/guides/next.html)"
2239
+ },
2240
+ "node_modules/lighthouse-stack-packs/packs/next.js | unused-javascript": {
2241
+ "message": "يمكنك استخدام `Webpack Bundle Analyzer` لرصد رمز JavaScript غير المستخدَم. [مزيد من المعلومات](https://github.com/vercel/next.js/tree/canary/packages/next-bundle-analyzer)"
2242
+ },
2243
+ "node_modules/lighthouse-stack-packs/packs/next.js | user-timings": {
2244
+ "message": "يمكنك استخدام `Next.js Analytics` لقياس الأداء الفعلي العالمي لتطبيقك. [مزيد من المعلومات](https://nextjs.org/docs/advanced-features/measuring-performance)"
2245
+ },
2246
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-long-cache-ttl": {
2247
+ "message": "يمكنك ضبط ميزة التخزين المؤقت لمواد العرض وصفحات `Server-side Rendered` (SSR) الثابتة. [مزيد من المعلومات](https://nextjs.org/docs/going-to-production#caching)"
2248
+ },
2249
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-optimized-images": {
2250
+ "message": "يمكنك استخدام المكوِّن `next/image` بدلاً من `<img>` لتحسين الصور. [مزيد من المعلومات](https://nextjs.org/docs/basic-features/image-optimization)"
2251
+ },
2252
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-responsive-images": {
2253
+ "message": "يمكنك استخدام المكوِّن `next/image` لضبط `sizes` المناسبة. [مزيد من المعلومات](https://nextjs.org/docs/api-reference/next/image#sizes)"
2254
+ },
2255
+ "node_modules/lighthouse-stack-packs/packs/next.js | uses-text-compression": {
2256
+ "message": "يمكنك تفعيل ميزة ضغط البيانات في خادم Next.js الخاص بك. [مزيد من المعلومات](https://nextjs.org/docs/api-reference/next.config.js/compression)"
2257
+ },
2222
2258
  "node_modules/lighthouse-stack-packs/packs/octobercms.js | efficient-animated-content": {
2223
2259
  "message": "[يمكنك استخدام الفيديو بدلاً من صور GIF المتحركة](https://web.dev/replace-gifs-with-videos/) لتحميل صفحات الويب بشكل أسرع، بالإضافة إلى استخدام تنسيقات ملفات حديثة، مثل [WebM](https://web.dev/replace-gifs-with-videos/#create-webm-videos) أو [AV1](https://developers.google.com/web/updates/2018/09/chrome-70-media-updates#av1-decoder) لتحسين كفاءة الضغط بنسبة تزيد عن 30% على برنامج ترميز الفيديو المتطوّر الحالي، VP9."
2224
2260
  },
@@ -2286,7 +2322,7 @@
2286
2322
  "message": "يمكنك تحميل ملف GIF إلى خدمة ستتيح تضمينه في شكل فيديو HTML5."
2287
2323
  },
2288
2324
  "node_modules/lighthouse-stack-packs/packs/wordpress.js | modern-image-formats": {
2289
- "message": "يمكنك استخدام [مكوّن إضافي](https://wordpress.org/plugins/search/convert+webp/) أو خدمة تتيح لك تحويل صورك المحمَّلة إلى أفضل التنسيقات تلقائيًا."
2325
+ "message": "يمكنك استخدام [مكوِّن إضافي](https://wordpress.org/plugins/search/convert+webp/) أو خدمة تتيح لك تحويل صورك المحمَّلة إلى أفضل التنسيقات تلقائيًا."
2290
2326
  },
2291
2327
  "node_modules/lighthouse-stack-packs/packs/wordpress.js | offscreen-images": {
2292
2328
  "message": "يمكنك تثبيت [مكون WordPress الإضافي للتحميل الكسول](https://wordpress.org/plugins/search/lazy+load/) الذي يوفر القدرة على تأجيل أي صور خارج الشاشة، أو التبديل إلى تصميم يوفِّر هذه القدرة الوظيفية. يمكنك أيضًا استخدام [مكون AMP الإضافي](https://wordpress.org/plugins/amp/)."