lighthouse 9.5.0-dev.20220607 → 9.6.2

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 (262) hide show
  1. package/dist/report/bundle.esm.js +467 -520
  2. package/dist/report/flow.js +22 -22
  3. package/dist/report/standalone.js +19 -19
  4. package/flow-report/src/summary/category.tsx +1 -1
  5. package/flow-report/src/topbar.tsx +2 -10
  6. package/flow-report/src/util.ts +1 -1
  7. package/flow-report/test/topbar-test.tsx +8 -7
  8. package/jest.config.js +1 -1
  9. package/lighthouse-cli/.eslintrc.cjs +4 -3
  10. package/lighthouse-cli/bin.js +1 -0
  11. package/lighthouse-cli/cli-flags.js +4 -3
  12. package/lighthouse-cli/commands/commands.js +1 -0
  13. package/lighthouse-cli/commands/list-audits.js +1 -0
  14. package/lighthouse-cli/commands/list-locales.js +1 -0
  15. package/lighthouse-cli/commands/list-trace-categories.js +1 -0
  16. package/lighthouse-cli/index.js +1 -0
  17. package/lighthouse-cli/printer.js +1 -0
  18. package/lighthouse-cli/run.js +24 -9
  19. package/lighthouse-cli/sentry-prompt.js +1 -0
  20. package/lighthouse-cli/test/smokehouse/core-tests.js +1 -0
  21. package/lighthouse-cli/test/smokehouse/frontends/back-compat-util.js +1 -0
  22. package/lighthouse-cli/test/smokehouse/frontends/lib.js +1 -0
  23. package/lighthouse-cli/test/smokehouse/frontends/node.js +1 -0
  24. package/lighthouse-cli/test/smokehouse/frontends/smokehouse-bin.js +1 -0
  25. package/lighthouse-cli/test/smokehouse/lib/child-process-error.js +1 -0
  26. package/lighthouse-cli/test/smokehouse/lib/concurrent-mapper.js +1 -0
  27. package/lighthouse-cli/test/smokehouse/lib/local-console.js +1 -0
  28. package/lighthouse-cli/test/smokehouse/lighthouse-runners/bundle.js +23 -109
  29. package/lighthouse-cli/test/smokehouse/lighthouse-runners/cli.js +3 -2
  30. package/lighthouse-cli/test/smokehouse/lighthouse-runners/devtools.js +19 -28
  31. package/lighthouse-cli/test/smokehouse/report-assert.js +4 -3
  32. package/lighthouse-cli/test/smokehouse/smokehouse.js +1 -1
  33. package/lighthouse-cli/test/smokehouse/version-check-test.js +3 -0
  34. package/lighthouse-cli/test/smokehouse/version-check.js +1 -0
  35. package/lighthouse-core/audits/accessibility/accesskeys.js +1 -1
  36. package/lighthouse-core/audits/accessibility/aria-allowed-attr.js +1 -1
  37. package/lighthouse-core/audits/accessibility/aria-command-name.js +1 -1
  38. package/lighthouse-core/audits/accessibility/aria-hidden-body.js +1 -1
  39. package/lighthouse-core/audits/accessibility/aria-hidden-focus.js +1 -1
  40. package/lighthouse-core/audits/accessibility/aria-input-field-name.js +1 -1
  41. package/lighthouse-core/audits/accessibility/aria-meter-name.js +1 -1
  42. package/lighthouse-core/audits/accessibility/aria-progressbar-name.js +1 -1
  43. package/lighthouse-core/audits/accessibility/aria-required-attr.js +1 -1
  44. package/lighthouse-core/audits/accessibility/aria-required-children.js +1 -1
  45. package/lighthouse-core/audits/accessibility/aria-required-parent.js +1 -1
  46. package/lighthouse-core/audits/accessibility/aria-roles.js +1 -1
  47. package/lighthouse-core/audits/accessibility/aria-toggle-field-name.js +1 -1
  48. package/lighthouse-core/audits/accessibility/aria-tooltip-name.js +1 -1
  49. package/lighthouse-core/audits/accessibility/aria-treeitem-name.js +1 -1
  50. package/lighthouse-core/audits/accessibility/aria-valid-attr-value.js +1 -1
  51. package/lighthouse-core/audits/accessibility/aria-valid-attr.js +1 -1
  52. package/lighthouse-core/audits/accessibility/button-name.js +1 -1
  53. package/lighthouse-core/audits/accessibility/bypass.js +1 -1
  54. package/lighthouse-core/audits/accessibility/color-contrast.js +1 -1
  55. package/lighthouse-core/audits/accessibility/definition-list.js +1 -1
  56. package/lighthouse-core/audits/accessibility/dlitem.js +1 -1
  57. package/lighthouse-core/audits/accessibility/document-title.js +1 -1
  58. package/lighthouse-core/audits/accessibility/duplicate-id-active.js +1 -1
  59. package/lighthouse-core/audits/accessibility/duplicate-id-aria.js +1 -1
  60. package/lighthouse-core/audits/accessibility/form-field-multiple-labels.js +1 -1
  61. package/lighthouse-core/audits/accessibility/frame-title.js +1 -1
  62. package/lighthouse-core/audits/accessibility/heading-order.js +1 -1
  63. package/lighthouse-core/audits/accessibility/html-has-lang.js +1 -1
  64. package/lighthouse-core/audits/accessibility/html-lang-valid.js +1 -1
  65. package/lighthouse-core/audits/accessibility/image-alt.js +1 -1
  66. package/lighthouse-core/audits/accessibility/input-image-alt.js +1 -1
  67. package/lighthouse-core/audits/accessibility/label.js +1 -1
  68. package/lighthouse-core/audits/accessibility/link-name.js +1 -1
  69. package/lighthouse-core/audits/accessibility/list.js +1 -1
  70. package/lighthouse-core/audits/accessibility/listitem.js +5 -5
  71. package/lighthouse-core/audits/accessibility/meta-refresh.js +1 -1
  72. package/lighthouse-core/audits/accessibility/meta-viewport.js +1 -1
  73. package/lighthouse-core/audits/accessibility/object-alt.js +1 -1
  74. package/lighthouse-core/audits/accessibility/tabindex.js +1 -1
  75. package/lighthouse-core/audits/accessibility/td-headers-attr.js +1 -1
  76. package/lighthouse-core/audits/accessibility/th-has-data-cells.js +1 -1
  77. package/lighthouse-core/audits/accessibility/valid-lang.js +1 -1
  78. package/lighthouse-core/audits/accessibility/video-caption.js +1 -1
  79. package/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js +1 -2
  80. package/lighthouse-core/audits/byte-efficiency/duplicated-javascript.js +12 -11
  81. package/lighthouse-core/audits/byte-efficiency/efficient-animated-content.js +1 -1
  82. package/lighthouse-core/audits/byte-efficiency/legacy-javascript.js +24 -22
  83. package/lighthouse-core/audits/byte-efficiency/offscreen-images.js +2 -3
  84. package/lighthouse-core/audits/byte-efficiency/render-blocking-resources.js +3 -2
  85. package/lighthouse-core/audits/byte-efficiency/unminified-css.js +5 -3
  86. package/lighthouse-core/audits/byte-efficiency/unminified-javascript.js +11 -10
  87. package/lighthouse-core/audits/byte-efficiency/unused-css-rules.js +1 -0
  88. package/lighthouse-core/audits/byte-efficiency/unused-javascript.js +8 -11
  89. package/lighthouse-core/audits/byte-efficiency/uses-responsive-images.js +1 -1
  90. package/lighthouse-core/audits/byte-efficiency/uses-text-compression.js +1 -1
  91. package/lighthouse-core/audits/deprecations.js +598 -8
  92. package/lighthouse-core/audits/diagnostics.js +3 -4
  93. package/lighthouse-core/audits/dobetterweb/doctype.js +9 -20
  94. package/lighthouse-core/audits/dobetterweb/geolocation-on-start.js +1 -1
  95. package/lighthouse-core/audits/dobetterweb/no-document-write.js +1 -1
  96. package/lighthouse-core/audits/dobetterweb/notification-on-start.js +1 -1
  97. package/lighthouse-core/audits/dobetterweb/uses-http2.js +1 -2
  98. package/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js +1 -1
  99. package/lighthouse-core/audits/errors-in-console.js +2 -2
  100. package/lighthouse-core/audits/long-tasks.js +2 -3
  101. package/lighthouse-core/audits/metrics/first-contentful-paint-3g.js +2 -2
  102. package/lighthouse-core/audits/metrics/first-contentful-paint.js +2 -3
  103. package/lighthouse-core/audits/metrics/first-meaningful-paint.js +2 -3
  104. package/lighthouse-core/audits/metrics/interactive.js +2 -3
  105. package/lighthouse-core/audits/metrics/largest-contentful-paint.js +2 -3
  106. package/lighthouse-core/audits/metrics/max-potential-fid.js +2 -3
  107. package/lighthouse-core/audits/metrics/speed-index.js +2 -3
  108. package/lighthouse-core/audits/metrics/total-blocking-time.js +2 -3
  109. package/lighthouse-core/audits/metrics.js +2 -3
  110. package/lighthouse-core/audits/no-unload-listeners.js +15 -7
  111. package/lighthouse-core/audits/predictive-perf.js +1 -2
  112. package/lighthouse-core/audits/preload-lcp-image.js +3 -3
  113. package/lighthouse-core/audits/redirects.js +1 -1
  114. package/lighthouse-core/audits/script-treemap-data.js +45 -45
  115. package/lighthouse-core/audits/seo/http-status-code.js +4 -2
  116. package/lighthouse-core/audits/seo/link-text.js +0 -2
  117. package/lighthouse-core/audits/server-response-time.js +17 -2
  118. package/lighthouse-core/audits/service-worker.js +2 -7
  119. package/lighthouse-core/audits/timing-budget.js +2 -3
  120. package/lighthouse-core/audits/uses-rel-preconnect.js +1 -1
  121. package/lighthouse-core/audits/uses-rel-preload.js +1 -1
  122. package/lighthouse-core/audits/valid-source-maps.js +14 -12
  123. package/lighthouse-core/audits/violation-audit.js +1 -1
  124. package/lighthouse-core/audits/work-during-interaction.js +2 -2
  125. package/lighthouse-core/computed/critical-request-chains.js +9 -5
  126. package/lighthouse-core/computed/js-bundles.js +11 -11
  127. package/lighthouse-core/computed/main-resource.js +2 -3
  128. package/lighthouse-core/computed/metrics/first-contentful-paint-all-frames.js +1 -1
  129. package/lighthouse-core/computed/metrics/first-contentful-paint.js +1 -1
  130. package/lighthouse-core/computed/metrics/first-meaningful-paint.js +1 -1
  131. package/lighthouse-core/computed/metrics/interactive.js +1 -1
  132. package/lighthouse-core/computed/metrics/lantern-first-contentful-paint.js +1 -1
  133. package/lighthouse-core/computed/metrics/lantern-first-meaningful-paint.js +1 -1
  134. package/lighthouse-core/computed/metrics/lantern-interactive.js +1 -1
  135. package/lighthouse-core/computed/metrics/lantern-largest-contentful-paint.js +1 -1
  136. package/lighthouse-core/computed/metrics/lantern-max-potential-fid.js +1 -1
  137. package/lighthouse-core/computed/metrics/lantern-metric.js +5 -3
  138. package/lighthouse-core/computed/metrics/lantern-speed-index.js +1 -1
  139. package/lighthouse-core/computed/metrics/lantern-total-blocking-time.js +1 -1
  140. package/lighthouse-core/computed/metrics/largest-contentful-paint-all-frames.js +1 -1
  141. package/lighthouse-core/computed/metrics/largest-contentful-paint.js +1 -1
  142. package/lighthouse-core/computed/metrics/max-potential-fid.js +1 -1
  143. package/lighthouse-core/computed/metrics/metric.js +0 -1
  144. package/lighthouse-core/computed/metrics/speed-index.js +1 -1
  145. package/lighthouse-core/computed/metrics/timing-summary.js +6 -13
  146. package/lighthouse-core/computed/metrics/total-blocking-time.js +1 -1
  147. package/lighthouse-core/computed/module-duplication.js +5 -6
  148. package/lighthouse-core/computed/page-dependency-graph.js +28 -55
  149. package/lighthouse-core/computed/resource-summary.js +5 -5
  150. package/lighthouse-core/computed/unused-css.js +7 -6
  151. package/lighthouse-core/computed/unused-javascript-summary.js +36 -16
  152. package/lighthouse-core/config/budget.js +2 -2
  153. package/lighthouse-core/config/default-config.js +1 -2
  154. package/lighthouse-core/fraggle-rock/api.js +1 -1
  155. package/lighthouse-core/fraggle-rock/config/default-config.js +0 -3
  156. package/lighthouse-core/fraggle-rock/gather/base-artifacts.js +3 -6
  157. package/lighthouse-core/fraggle-rock/gather/driver.js +2 -2
  158. package/lighthouse-core/fraggle-rock/gather/navigation-runner.js +26 -51
  159. package/lighthouse-core/fraggle-rock/gather/runner-helpers.js +3 -0
  160. package/lighthouse-core/fraggle-rock/gather/session.js +22 -23
  161. package/lighthouse-core/fraggle-rock/gather/snapshot-runner.js +4 -5
  162. package/lighthouse-core/fraggle-rock/gather/timespan-runner.js +6 -6
  163. package/lighthouse-core/gather/connections/cri.js +1 -5
  164. package/lighthouse-core/gather/driver/execution-context.js +2 -5
  165. package/lighthouse-core/gather/driver/navigation.js +10 -13
  166. package/lighthouse-core/gather/driver/network-monitor.js +3 -16
  167. package/lighthouse-core/gather/driver.js +1 -6
  168. package/lighthouse-core/gather/fetcher.js +210 -34
  169. package/lighthouse-core/gather/gather-runner.js +17 -13
  170. package/lighthouse-core/gather/gatherers/accessibility.js +4 -16
  171. package/lighthouse-core/gather/gatherers/console-messages.js +2 -4
  172. package/lighthouse-core/gather/gatherers/dobetterweb/doctype.js +2 -4
  173. package/lighthouse-core/gather/gatherers/full-page-screenshot.js +2 -3
  174. package/lighthouse-core/gather/gatherers/iframe-elements.js +1 -4
  175. package/lighthouse-core/gather/gatherers/image-elements.js +0 -2
  176. package/lighthouse-core/gather/gatherers/js-usage.js +87 -12
  177. package/lighthouse-core/gather/gatherers/link-elements.js +14 -12
  178. package/lighthouse-core/gather/gatherers/main-document-content.js +8 -8
  179. package/lighthouse-core/gather/gatherers/script-elements.js +56 -7
  180. package/lighthouse-core/gather/gatherers/seo/robots-txt.js +30 -2
  181. package/lighthouse-core/gather/gatherers/source-maps.js +1 -8
  182. package/lighthouse-core/gather/gatherers/web-app-manifest.js +2 -2
  183. package/lighthouse-core/index.js +2 -26
  184. package/lighthouse-core/lib/cdt/generated/SourceMap.js +1 -1
  185. package/lighthouse-core/lib/dependency-graph/simulator/network-analyzer.js +29 -8
  186. package/lighthouse-core/lib/navigation-error.js +4 -13
  187. package/lighthouse-core/lib/page-functions.js +1 -3
  188. package/lighthouse-core/lib/script-helpers.js +6 -11
  189. package/lighthouse-core/lib/url-shim.js +2 -2
  190. package/lighthouse-core/runner.js +5 -0
  191. package/lighthouse-core/scripts/manual-chrome-launcher.js +1 -0
  192. package/lighthouse-core/util-commonjs.js +6 -8
  193. package/package.json +13 -13
  194. package/readme.md +1 -1
  195. package/report/.eslintrc.cjs +1 -3
  196. package/report/assets/styles.css +5 -10
  197. package/report/assets/templates.html +9 -10
  198. package/report/clients/bundle.js +1 -0
  199. package/report/clients/standalone.js +1 -0
  200. package/report/generator/report-generator.js +21 -46
  201. package/report/renderer/api.js +2 -0
  202. package/report/renderer/category-renderer.js +24 -20
  203. package/report/renderer/components.js +304 -303
  204. package/report/renderer/crc-details-renderer.js +24 -21
  205. package/report/renderer/details-renderer.js +12 -12
  206. package/report/renderer/dom.js +7 -6
  207. package/report/renderer/drop-down-menu.js +1 -0
  208. package/report/renderer/element-screenshot-renderer.js +5 -1
  209. package/report/renderer/features-util.js +1 -0
  210. package/report/renderer/i18n.js +62 -118
  211. package/report/renderer/logger.js +1 -0
  212. package/report/renderer/open-tab.js +3 -1
  213. package/report/renderer/performance-category-renderer.js +11 -10
  214. package/report/renderer/pwa-category-renderer.js +4 -3
  215. package/report/renderer/report-renderer.js +17 -17
  216. package/report/renderer/report-ui-features.js +1 -0
  217. package/report/renderer/snippet-renderer.js +3 -2
  218. package/report/renderer/swap-locale-feature.js +1 -0
  219. package/report/renderer/text-encoding.js +1 -0
  220. package/report/renderer/topbar-features.js +1 -0
  221. package/report/renderer/util.js +6 -7
  222. package/report/test/clients/bundle-test.js +5 -0
  223. package/report/test/generator/file-namer-test.js +1 -0
  224. package/report/test/generator/report-generator-test.js +20 -25
  225. package/report/test/renderer/category-renderer-test.js +4 -3
  226. package/report/test/renderer/components-test.js +3 -0
  227. package/report/test/renderer/crc-details-renderer-test.js +3 -0
  228. package/report/test/renderer/details-renderer-test.js +3 -49
  229. package/report/test/renderer/dom-test.js +3 -0
  230. package/report/test/renderer/element-screenshot-renderer-test.js +6 -3
  231. package/report/test/renderer/i18n-test.js +25 -70
  232. package/report/test/renderer/performance-category-renderer-test.js +5 -14
  233. package/report/test/renderer/pwa-category-renderer-test.js +4 -3
  234. package/report/test/renderer/report-renderer-axe-test.js +4 -3
  235. package/report/test/renderer/report-renderer-test.js +4 -3
  236. package/report/test/renderer/report-ui-features-test.js +4 -3
  237. package/report/test/renderer/snippet-renderer-test.js +3 -0
  238. package/report/test/renderer/text-encoding-test.js +3 -0
  239. package/report/test/renderer/util-test.js +5 -4
  240. package/report/test-assets/faux-psi.js +1 -2
  241. package/shared/localization/format.js +3 -7
  242. package/shared/localization/locales/en-US.json +238 -55
  243. package/shared/localization/locales/en-XL.json +238 -55
  244. package/shared/test/localization/format-test.js +2 -8
  245. package/shared/test/localization/locales-test.js +2 -0
  246. package/shared/test/localization/swap-locale-test.js +2 -0
  247. package/third-party/chromium-synchronization/inspector-issueAdded-types-test.js +2 -0
  248. package/third-party/chromium-synchronization/installability-errors-test.js +2 -0
  249. package/tsconfig.json +0 -1
  250. package/types/artifacts.d.ts +8 -47
  251. package/types/config.d.ts +0 -2
  252. package/types/externs.d.ts +2 -3
  253. package/types/gatherer.d.ts +2 -1
  254. package/types/global-lh.d.ts +0 -3
  255. package/types/lhr/lhr.d.ts +2 -2
  256. package/types/lhr/treemap.d.ts +1 -0
  257. package/changelog.md +0 -5902
  258. package/lighthouse-core/audits/script-elements-test-audit.js +0 -30
  259. package/lighthouse-core/gather/gatherers/scripts.js +0 -154
  260. package/lighthouse-core/scripts/package.json +0 -4
  261. package/report/test/.eslintrc.cjs +0 -11
  262. package/shared/test/localization/.eslintrc.cjs +0 -11
@@ -132,7 +132,7 @@ const SummaryTooltip: FunctionComponent<{
132
132
  {
133
133
  !displayAsFraction && category.score !== null && <>
134
134
  <span> · </span>
135
- <span>{i18n.formatInteger(category.score * 100)}</span>
135
+ <span>{i18n.formatNumber(category.score * 100)}</span>
136
136
  </>
137
137
  }
138
138
  </div>
@@ -17,12 +17,9 @@ import {saveFile} from '../../report/renderer/api';
17
17
  function saveHtml(flowResult: LH.FlowResult, htmlStr: string) {
18
18
  const blob = new Blob([htmlStr], {type: 'text/html'});
19
19
  const filename = getFlowResultFilenamePrefix(flowResult) + '.html';
20
- saveHtml.saveFile(blob, filename);
20
+ saveFile(blob, filename);
21
21
  }
22
22
 
23
- // Store `saveFile` here so we can do dependency injection.
24
- saveHtml.saveFile = saveFile;
25
-
26
23
  /* eslint-disable max-len */
27
24
  const Logo: FunctionComponent = () => {
28
25
  return (
@@ -71,7 +68,7 @@ const TopbarButton: FunctionComponent<{
71
68
  );
72
69
  };
73
70
 
74
- const Topbar: FunctionComponent<{onMenuClick: JSX.MouseEventHandler<HTMLButtonElement>}> =
71
+ export const Topbar: FunctionComponent<{onMenuClick: JSX.MouseEventHandler<HTMLButtonElement>}> =
75
72
  ({onMenuClick}) => {
76
73
  const flowResult = useFlowResult();
77
74
  const strings = useLocalizedStrings();
@@ -121,8 +118,3 @@ const Topbar: FunctionComponent<{onMenuClick: JSX.MouseEventHandler<HTMLButtonEl
121
118
  </div>
122
119
  );
123
120
  };
124
-
125
- export {
126
- Topbar,
127
- saveHtml,
128
- };
@@ -137,7 +137,7 @@ function useExternalRenderer<T extends Element>(
137
137
  if (!ref.current) return;
138
138
 
139
139
  const root = renderCallback();
140
- ref.current.append(root);
140
+ ref.current.appendChild(root);
141
141
 
142
142
  return () => {
143
143
  if (ref.current?.contains(root)) ref.current.removeChild(root);
@@ -10,10 +10,16 @@ import {act, render} from '@testing-library/preact';
10
10
 
11
11
  import {FlowResultContext, OptionsContext} from '../src/util';
12
12
  import {I18nProvider} from '../src/i18n/i18n';
13
- import {Topbar, saveHtml} from '../src/topbar';
14
13
 
15
14
  const mockSaveFile = jest.fn();
16
- const defaultSaveFile = saveHtml.saveFile;
15
+ jest.unstable_mockModule('../../../report/renderer/api.js', () => ({
16
+ saveFile: mockSaveFile,
17
+ }));
18
+
19
+ let Topbar: typeof import('../src/topbar').Topbar;
20
+ beforeAll(async () => {
21
+ Topbar = (await import('../src/topbar')).Topbar;
22
+ });
17
23
 
18
24
  const flowResult = {
19
25
  name: 'User flow',
@@ -41,12 +47,7 @@ beforeEach(() => {
41
47
  );
42
48
  });
43
49
 
44
- afterEach(() => {
45
- saveHtml.saveFile = defaultSaveFile;
46
- });
47
-
48
50
  it('save button opens save dialog for HTML file', async () => {
49
- saveHtml.saveFile = mockSaveFile;
50
51
  options = {getReportHtml: () => '<html></html>'};
51
52
  const root = render(<Topbar onMenuClick={() => {}}/>, {wrapper});
52
53
 
package/jest.config.js CHANGED
@@ -6,7 +6,7 @@
6
6
  'use strict';
7
7
 
8
8
  module.exports = {
9
- setupFilesAfterEnv: ['./lighthouse-core/test/jest-setup/setup.js'],
9
+ setupFilesAfterEnv: ['./lighthouse-core/test/test-utils.js'],
10
10
  testEnvironment: 'node',
11
11
  testMatch: [
12
12
  '**/lighthouse-core/**/*-test.js',
@@ -3,8 +3,12 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  module.exports = {
9
+ env: {
10
+ browser: true,
11
+ },
8
12
  rules: {
9
13
  // TODO(esmodules): move to root eslint when all code is ESM
10
14
  // or when this is resolved: https://github.com/import-js/eslint-plugin-import/issues/2214
@@ -22,7 +26,4 @@ module.exports = {
22
26
  'import/group-exports': 2,
23
27
  'import/exports-last': 2,
24
28
  },
25
- parserOptions: {
26
- sourceType: 'module',
27
- },
28
29
  };
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * @fileoverview The relationship between these CLI modules:
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /* eslint-disable max-len */
8
9
 
@@ -123,10 +124,10 @@ function getFlags(manualArgv, options = {}) {
123
124
  type: 'boolean',
124
125
  describe: 'Pause after page load to wait for permission to continue the run, evaluate `continueLighthouseRun` in the console to continue.',
125
126
  },
126
- 'legacy-navigation': {
127
+ 'fraggle-rock': {
127
128
  type: 'boolean',
128
129
  default: false,
129
- describe: '[DEPRECATED] Use the legacy navigation runner to gather results. Only use this if you are using a pre-10.0 custom Lighthouse config, or if Lighthouse unexpectedly fails after updating to 10.0. Please file a bug if you need this flag for Lighthouse to work.',
130
+ describe: '[EXPERIMENTAL] Use the new Fraggle Rock navigation runner to gather results.',
130
131
  },
131
132
  'additional-trace-categories': {
132
133
  type: 'string',
@@ -177,7 +178,7 @@ function getFlags(manualArgv, options = {}) {
177
178
  },
178
179
  'enable-error-reporting': {
179
180
  type: 'boolean',
180
- describe: 'Enables error reporting, overriding any saved preference. --no-enable-error-reporting will do the opposite. More: https://github.com/GoogleChrome/lighthouse/blob/master/docs/error-reporting.md',
181
+ describe: 'Enables error reporting, overriding any saved preference. --no-enable-error-reporting will do the opposite. More: https://git.io/vFFTO',
181
182
  },
182
183
  'gather-mode': {
183
184
  alias: 'G',
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  export {listAudits} from './list-audits.js';
8
9
  export {listTraceCategories} from './list-trace-categories.js';
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  import lighthouse from '../../lighthouse-core/index.js';
8
9
 
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  import locales from '../../shared/localization/locales.js';
8
9
 
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  import lighthouse from '../../lighthouse-core/index.js';
8
9
 
@@ -4,6 +4,7 @@
4
4
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
5
5
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
6
6
  */
7
+ 'use strict';
7
8
 
8
9
  import {begin} from './bin.js';
9
10
 
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  import fs from 'fs';
8
9
 
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /* eslint-disable no-console */
8
9
 
@@ -193,6 +194,27 @@ async function potentiallyKillChrome(launchedChrome) {
193
194
  });
194
195
  }
195
196
 
197
+ /**
198
+ * @param {string} url
199
+ * @param {LH.CliFlags} flags
200
+ * @param {LH.Config.Json|undefined} config
201
+ * @param {ChromeLauncher.LaunchedChrome} launchedChrome
202
+ * @return {Promise<LH.RunnerResult|undefined>}
203
+ */
204
+ async function runLighthouseWithFraggleRock(url, flags, config, launchedChrome) {
205
+ const fraggleRock = (await import('../lighthouse-core/fraggle-rock/api.js')).default;
206
+ const puppeteer = (await import('puppeteer')).default;
207
+ const browser = await puppeteer.connect({browserURL: `http://localhost:${launchedChrome.port}`});
208
+ const page = await browser.newPage();
209
+ flags.channel = 'fraggle-rock-cli';
210
+ const configContext = {
211
+ configPath: flags.configPath,
212
+ settingsOverrides: flags,
213
+ logLevel: flags.logLevel,
214
+ };
215
+ return fraggleRock.navigation(url, {page, config, configContext});
216
+ }
217
+
196
218
  /**
197
219
  * @param {string} url
198
220
  * @param {LH.CliFlags} flags
@@ -225,15 +247,8 @@ async function runLighthouse(url, flags, config) {
225
247
  flags.port = launchedChrome.port;
226
248
  }
227
249
 
228
- if (flags.legacyNavigation) {
229
- log.warn('CLI', 'Legacy navigation CLI is deprecated');
230
- flags.channel = 'legacy-navigation-cli';
231
- } else {
232
- flags.channel = 'cli';
233
- }
234
-
235
- const runnerResult = flags.legacyNavigation ?
236
- await lighthouse.legacyNavigation(url, flags, config) :
250
+ const runnerResult = flags.fraggleRock && launchedChrome ?
251
+ await runLighthouseWithFraggleRock(url, flags, config, launchedChrome) :
237
252
  await lighthouse(url, flags, config);
238
253
 
239
254
  // If in gatherMode only, there will be no runnerResult.
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  import Configstore from 'configstore';
8
9
  import Confirm from 'enquirer';
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  import a11y from './test-definitions/a11y.js';
8
9
  import byteEfficiency from './test-definitions/byte-efficiency.js';
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * COMPAT: update from the old TestDefn format (array of `expectations` per
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * @fileoverview Smoke test runner.
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * @fileoverview A smokehouse frontend for running within a node process.
@@ -4,6 +4,7 @@
4
4
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
5
5
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
6
6
  */
7
+ 'use strict';
7
8
 
8
9
  /**
9
10
  * @fileoverview A smokehouse frontend for running from the command line. Parse
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * An extension of Error that includes any stdout or stderr from a child
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * A class that maintains a concurrency pool to coordinate many jobs that should
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * A simple buffered log to use in place of `console`.
@@ -3,98 +3,59 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * @fileoverview A runner that launches Chrome and executes Lighthouse via a
9
10
  * bundle to test that bundling has produced correct and runnable code.
10
11
  * Currently uses `lighthouse-dt-bundle.js`.
11
- * Runs in a worker to avoid messing up marky's global state.
12
12
  */
13
13
 
14
14
  import fs from 'fs';
15
- import os from 'os';
16
- import {Worker, isMainThread, parentPort, workerData} from 'worker_threads';
17
- import {once} from 'events';
18
15
 
19
- import puppeteer from 'puppeteer-core';
20
16
  import ChromeLauncher from 'chrome-launcher';
21
17
 
22
18
  import ChromeProtocol from '../../../../lighthouse-core/gather/connections/cri.js';
23
19
  import {LH_ROOT} from '../../../../root.js';
24
- import {loadArtifacts, saveArtifacts} from '../../../../lighthouse-core/lib/asset-saver.js';
25
20
 
26
- // This runs only in the worker. The rest runs on the main thread.
27
- if (!isMainThread && parentPort) {
28
- (async () => {
29
- const {url, configJson, testRunnerOptions} = workerData;
30
- try {
31
- const result = await runBundledLighthouse(url, configJson, testRunnerOptions);
32
- // Save to assets directory because LighthouseError won't survive postMessage.
33
- const assetsDir = fs.mkdtempSync(os.tmpdir() + '/smoke-bundle-assets-');
34
- await saveArtifacts(result.artifacts, assetsDir);
35
- const value = {
36
- lhr: result.lhr,
37
- assetsDir,
38
- };
39
- parentPort?.postMessage({type: 'result', value});
40
- } catch (err) {
41
- console.error(err);
42
- parentPort?.postMessage({type: 'error', value: err});
43
- }
44
- })();
21
+ const originalRequire = global.require;
22
+ if (typeof globalThis === 'undefined') {
23
+ // @ts-expect-error - exposing for loading of dt-bundle.
24
+ global.globalThis = global;
45
25
  }
46
26
 
47
- /**
48
- * @param {string} url
49
- * @param {LH.Config.Json|undefined} configJson
50
- * @param {{isDebug?: boolean, useFraggleRock?: boolean}} testRunnerOptions
51
- * @return {Promise<{lhr: LH.Result, artifacts: LH.Artifacts}>}
52
- */
53
- async function runBundledLighthouse(url, configJson, testRunnerOptions) {
54
- if (isMainThread || !parentPort) {
55
- throw new Error('must be called in worker');
56
- }
57
-
58
- const originalBuffer = global.Buffer;
59
- const originalRequire = global.require;
60
- if (typeof globalThis === 'undefined') {
61
- // @ts-expect-error - exposing for loading of dt-bundle.
62
- global.globalThis = global;
63
- }
64
-
65
- // Load bundle, which creates a `global.runBundledLighthouse`.
66
- eval(fs.readFileSync(LH_ROOT + '/dist/lighthouse-dt-bundle.js', 'utf-8'));
27
+ // Load bundle, which creates a `global.runBundledLighthouse`.
28
+ eval(fs.readFileSync(LH_ROOT + '/dist/lighthouse-dt-bundle.js', 'utf-8'));
67
29
 
68
- global.require = originalRequire;
69
- global.Buffer = originalBuffer;
30
+ global.require = originalRequire;
70
31
 
71
- /** @type {import('../../../../lighthouse-core/index.js')} */
72
- // @ts-expect-error - not worth giving test global an actual type.
73
- const lighthouse = global.runBundledLighthouse;
32
+ /** @type {import('../../../../lighthouse-core/index.js')} */
33
+ // @ts-expect-error - not worth giving test global an actual type.
34
+ const lighthouse = global.runBundledLighthouse;
74
35
 
36
+ /**
37
+ * Launch Chrome and do a full Lighthouse run via the Lighthouse CLI.
38
+ * @param {string} url
39
+ * @param {LH.Config.Json=} configJson
40
+ * @param {{isDebug?: boolean}=} testRunnerOptions
41
+ * @return {Promise<{lhr: LH.Result, artifacts: LH.Artifacts, log: string}>}
42
+ */
43
+ async function runLighthouse(url, configJson, testRunnerOptions = {}) {
75
44
  // Launch and connect to Chrome.
76
45
  const launchedChrome = await ChromeLauncher.launch();
77
46
  const port = launchedChrome.port;
47
+ const connection = new ChromeProtocol(port);
78
48
 
79
- // Run Lighthouse.
80
49
  try {
50
+ // Run Lighthouse.
81
51
  const logLevel = testRunnerOptions.isDebug ? 'info' : undefined;
82
- let runnerResult;
83
- if (testRunnerOptions.useFraggleRock) {
84
- // Puppeteer is not included in the bundle, we must create the page here.
85
- const browser = await puppeteer.connect({browserURL: `http://localhost:${port}`});
86
- const page = await browser.newPage();
87
- runnerResult = await lighthouse(url, {port, logLevel}, configJson, page);
88
- } else {
89
- const connection = new ChromeProtocol(port);
90
- runnerResult =
91
- await lighthouse.legacyNavigation(url, {port, logLevel}, configJson, connection);
92
- }
52
+ const runnerResult = await lighthouse(url, {port, logLevel}, configJson, connection);
93
53
  if (!runnerResult) throw new Error('No runnerResult');
94
54
 
95
55
  return {
96
56
  lhr: runnerResult.lhr,
97
57
  artifacts: runnerResult.artifacts,
58
+ log: '', // TODO: if want to run in parallel, need to capture lighthouse-logger output.
98
59
  };
99
60
  } finally {
100
61
  // Clean up and return results.
@@ -102,53 +63,6 @@ async function runBundledLighthouse(url, configJson, testRunnerOptions) {
102
63
  }
103
64
  }
104
65
 
105
- /**
106
- * Launch Chrome and do a full Lighthouse run via the Lighthouse DevTools bundle.
107
- * @param {string} url
108
- * @param {LH.Config.Json=} configJson
109
- * @param {{isDebug?: boolean, useFraggleRock?: boolean}=} testRunnerOptions
110
- * @return {Promise<{lhr: LH.Result, artifacts: LH.Artifacts, log: string}>}
111
- */
112
- async function runLighthouse(url, configJson, testRunnerOptions = {}) {
113
- /** @type {string[]} */
114
- const logs = [];
115
- const worker = new Worker(new URL(import.meta.url), {
116
- stdout: true,
117
- stderr: true,
118
- workerData: {url, configJson, testRunnerOptions},
119
- });
120
- worker.stdout.setEncoding('utf8');
121
- worker.stderr.setEncoding('utf8');
122
- worker.stdout.addListener('data', (data) => {
123
- process.stdout.write(data);
124
- logs.push(`STDOUT: ${data}`);
125
- });
126
- worker.stderr.addListener('data', (data) => {
127
- process.stderr.write(data);
128
- logs.push(`STDERR: ${data}`);
129
- });
130
- const [workerResponse] = await once(worker, 'message');
131
- const log = logs.join('') + '\n';
132
-
133
- if (workerResponse.type === 'error') {
134
- new Error(`Worker returned an error: ${workerResponse.value}\nLog:\n${log}`);
135
- }
136
-
137
- const result = workerResponse.value;
138
- if (!result.lhr || !result.assetsDir) {
139
- throw new Error(`invalid response from worker:\n${JSON.stringify(result, null, 2)}`);
140
- }
141
-
142
- const artifacts = loadArtifacts(result.assetsDir);
143
- fs.rmSync(result.assetsDir, {recursive: true});
144
-
145
- return {
146
- lhr: result.lhr,
147
- artifacts,
148
- log,
149
- };
150
- }
151
-
152
66
  export {
153
67
  runLighthouse,
154
68
  };
@@ -3,6 +3,7 @@
3
3
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
4
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
5
  */
6
+ 'use strict';
6
7
 
7
8
  /**
8
9
  * @fileoverview A runner that executes Lighthouse via the Lighthouse CLI to
@@ -77,14 +78,14 @@ async function internalRun(url, tmpPath, configJson, options) {
77
78
  '--output=json',
78
79
  `-G=${artifactsDirectory}`,
79
80
  `-A=${artifactsDirectory}`,
81
+ '--quiet',
80
82
  '--port=0',
81
83
  '--quiet',
82
84
  ];
83
85
 
84
86
  if (useFraggleRock) {
87
+ args.push('--fraggle-rock');
85
88
  configJson = convertToFraggleRockConfig(configJson);
86
- } else {
87
- args.push('--legacy-navigation');
88
89
  }
89
90
 
90
91
  // Config can be optionally provided.