@lhci/viewer 0.10.0 → 0.11.1
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/chunks/entry-RBUMRG4S.css +12 -0
- package/dist/chunks/entry-RBUMRG4S.css.map +7 -0
- package/dist/chunks/entry-T2XCW4PF.js +12 -0
- package/dist/chunks/entry-T2XCW4PF.js.map +7 -0
- package/dist/index.html +20 -7
- package/package.json +4 -4
- package/src/ui/components/report-upload-box.css +4 -1
- package/src/ui/components/report-upload-box.jsx +1 -1
- package/src/ui/index.html +2 -2
- package/src/ui/routes/landing/landing.css +44 -6
- package/src/ui/routes/landing/landing.jsx +16 -11
- package/dist/1.css +0 -12
- package/dist/1.css.map +0 -7
- package/dist/1.js +0 -12
- package/dist/1.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../utils/src/lodash.js", "../../../utils/src/seed-data/lhr-generator.js", "../../../utils/src/audit-diff-finder.js", "../../../utils/src/markdown.js", "../../../../node_modules/preact/src/constants.js", "../../../../node_modules/preact/src/options.js", "../../../../node_modules/preact/src/create-element.js", "../../../../node_modules/preact/src/component.js", "../../../../node_modules/preact/src/render.js", "../../../../node_modules/preact/src/create-context.js", "../../../../node_modules/preact/src/util.js", "../../../../node_modules/preact/src/diff/children.js", "../../../../node_modules/preact/src/diff/props.js", "../../../../node_modules/preact/src/diff/index.js", "../../../../node_modules/preact/src/clone-element.js", "../../../../node_modules/preact/hooks/src/index.js", "../../../../node_modules/clsx/dist/clsx.m.js", "../../../server/src/ui/components/loading-spinner.jsx", "../../../server/src/ui/components/paper.jsx", "../../../server/src/ui/components/lhr-viewer-link.jsx", "../../../server/src/ui/components/lhr-viewer-button.jsx", "../../src/ui/components/lhci-components.jsx", "../../src/ui/components/report-upload-box.jsx", "../../src/ui/routes/landing/landing.jsx", "../../../server/src/ui/routes/build-view/lhr-comparison.jsx", "../../../server/src/ui/components/dropdown.jsx", "../../../server/src/ui/hooks/use-previous-value.jsx", "../../../server/src/ui/components/score-icon.jsx", "../../../server/src/ui/components/markdown.jsx", "../../../server/src/ui/components/nbsp.jsx", "../../../server/src/ui/routes/build-view/audit-detail/simple-details.jsx", "../../../server/src/ui/routes/build-view/audit-detail/table-details.jsx", "../../../server/src/ui/routes/build-view/audit-list/numeric-diff.jsx", "../../../server/src/ui/routes/build-view/audit-list/audit-diff.jsx", "../../../server/src/ui/routes/build-view/audit-detail/audit-detail.jsx", "../../../server/src/ui/routes/build-view/audit-detail/audit-detail-pane.jsx", "../../../server/src/ui/components/gauge.jsx", "../../../server/src/ui/components/pwa-gauge.jsx", "../../../server/src/ui/components/score-delta-badge.jsx", "../../../server/src/ui/routes/build-view/lhr-comparison-scores.jsx", "../../../server/src/ui/routes/build-view/audit-list/audit-group.jsx", "../../../server/src/ui/routes/build-view/lhr-comparison-legend.jsx", "../../../../node_modules/preact/src/util.js", "../../../../node_modules/preact/compat/src/suspense.js", "../../../../node_modules/preact/compat/src/index.js", "../../../server/src/ui/components/modal.jsx", "../../../server/src/ui/routes/build-view/lhr-comparison-runtime-diff.jsx", "../../src/ui/routes/comparison/comparison.jsx", "../../src/ui/components/toast.jsx", "../../src/ui/app.jsx", "../../src/ui/entry.jsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n'use strict';\n\n/**\n * Recursively merges properties of v2 into v1. Mutates o1 in place, does not return a copy.\n *\n * @template T\n * @param {T} v1\n * @param {T} v2\n * @return {T}\n */\nfunction merge(v1, v2) {\n if (Array.isArray(v1)) {\n if (!Array.isArray(v2)) return v2;\n\n for (let i = 0; i < Math.max(v1.length, v2.length); i++) {\n v1[i] = i < v2.length ? merge(v1[i], v2[i]) : v1[i];\n }\n\n return v1;\n } else if (typeof v1 === 'object' && v1 !== null) {\n if (typeof v2 !== 'object' || v2 === null) return v2;\n /** @type {Record<string, *>} */\n const o1 = v1;\n /** @type {Record<string, *>} */\n const o2 = v2;\n\n const o1Keys = new Set(Object.keys(o1));\n const o2Keys = new Set(Object.keys(o2));\n for (const key of new Set([...o1Keys, ...o2Keys])) {\n o1[key] = key in o2 ? merge(o1[key], o2[key]) : o1[key];\n }\n\n return v1;\n } else {\n return v2;\n }\n}\n\n/**\n * Converts a string from camelCase to kebab-case.\n * @param {string} s\n * @param {{alphanumericOnly?: boolean}} [opts]\n */\nfunction kebabCase(s, opts) {\n let kebabed = s.replace(/([a-z])([A-Z])/g, '$1-$2');\n if (opts && opts.alphanumericOnly) {\n kebabed = kebabed\n .replace(/[^a-z0-9]+/gi, '-')\n .replace(/-+/g, '-')\n .replace(/(^-|-$)/g, '');\n }\n return kebabed.toLowerCase();\n}\n\n/**\n * @template TKey\n * @template TValue\n * @param {Array<TValue>} items\n * @param {(item: TValue) => TKey} keyFn\n * @return {Map<TKey, Array<TValue>>}\n */\nfunction groupIntoMap(items, keyFn) {\n /** @type {Map<TKey, Array<TValue>>} */\n const groups = new Map();\n\n for (const item of items) {\n const key = keyFn(item);\n const group = groups.get(key) || [];\n group.push(item);\n groups.set(key, group);\n }\n\n return groups;\n}\n\n/**\n * @template {any[]} T\n * @param {(...args: T) => void} fn\n * @param {number} time\n * @return {{(...args: T): void; cancel: () => void;}}\n */\nfunction debounce(fn, time) {\n /** @type {NodeJS.Timeout|undefined} */\n let timeout;\n const cancel = () => {\n if (timeout) clearTimeout(timeout);\n timeout = undefined;\n };\n\n /** @param {T} args */\n const debouncedFn = (...args) => {\n if (timeout) clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), time);\n };\n\n debouncedFn.cancel = cancel;\n return debouncedFn;\n}\n\nmodule.exports = {\n merge,\n kebabCase,\n debounce,\n /**\n * Generates an array of numbers from `from` (inclusive) to `to` (exclusive)\n * @param {number} from\n * @param {number} to\n * @param {number} [by]\n * @return {Array<number>}\n */\n range(from, to, by = 1) {\n /** @type {Array<number>} */\n const numbers = [];\n for (let i = from; i < to; i += by) {\n numbers.push(i);\n }\n return numbers;\n },\n /**\n * Converts a string from kebab-case or camelCase to Start Case.\n * @param {string} s\n */\n startCase(s) {\n return kebabCase(s)\n .split('-')\n .map(word => `${word.slice(0, 1).toUpperCase()}${word.slice(1)}`)\n .join(' ');\n },\n /**\n * @param {string} s\n * @param {number} length\n * @param {string} [padding]\n */\n padStart(s, length, padding = ' ') {\n if (s.length >= length) return s;\n return `${padding.repeat(length)}${s}`.slice(-length);\n },\n /**\n * @param {string} s\n * @param {number} length\n * @param {string} [padding]\n */\n padEnd(s, length, padding = ' ') {\n if (s.length >= length) return s;\n return `${s}${padding.repeat(length)}`.slice(0, length);\n },\n /**\n * @param {any} o1\n * @param {any} o2\n * @param {number} [depth]\n * @return {boolean}\n */\n isEqual(o1, o2, depth = 0) {\n // Protect against infinite loops.\n if (depth > 100) return false;\n\n // If they don't share the same type they're not equal.\n if (typeof o1 !== typeof o2) return false;\n // If they're not objects, use referential equality with NaN handling.\n if (Number.isNaN(o1) && Number.isNaN(o2)) return true;\n if (typeof o1 !== 'object') return o1 === o2;\n // Try quick referential equality before perfoming deep comparisons.\n if (o1 === o2) return true;\n // Check for null.\n if (!o1 || !o2) return false;\n // At this point we know they're both truthy objects.\n // Perform deep inspection on the object's properties.\n\n if (Array.isArray(o1)) {\n if (!Array.isArray(o2)) return false;\n return o1.every((v, i) => this.isEqual(v, o2[i])) && o1.length === o2.length;\n }\n\n const o1Keys = Object.keys(o1).sort();\n const o2Keys = Object.keys(o2).sort();\n const allChildrenEqual = o1Keys.every(k => this.isEqual(o1[k], o2[k], depth + 1));\n return allChildrenEqual && this.isEqual(o1Keys, o2Keys);\n },\n /**\n * Deep clones an object via JSON.parse/JSON.stringify.\n * @template T\n * @param {T} o\n * @return {T}\n */\n cloneDeep(o) {\n return JSON.parse(JSON.stringify(o));\n },\n /**\n * Filters items by referential uniqueness of the value returned by keyFn.\n * Unique items are guaranteed to be in the same order of the original array.\n *\n * @template TArr\n * @template TKey\n * @param {Array<TArr>} items\n * @param {(item: TArr) => TKey} keyFn\n * @return {Array<TArr>}\n */\n uniqBy(items, keyFn) {\n /** @type {Set<TKey>} */\n const seen = new Set();\n /** @type {Array<TArr>} */\n const out = [];\n\n for (const item of items) {\n const key = keyFn(item);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(item);\n }\n\n return out;\n },\n /**\n * @template T\n * @param {Array<T>} items\n * @param {(item: T) => any} keyFn\n * @return {Array<Array<T>>}\n */\n groupBy(items, keyFn) {\n return [...groupIntoMap(items, keyFn).values()];\n },\n groupIntoMap,\n /**\n * @template TArr\n * @param {Array<TArr>} items\n * @param {(o: TArr) => number} keyFn\n */\n maxBy(items, keyFn) {\n let maxItem = undefined;\n let maxValue = -Infinity;\n for (const item of items) {\n const value = keyFn(item);\n if (value > maxValue) {\n maxItem = item;\n maxValue = value;\n }\n }\n\n return maxItem;\n },\n /**\n * @template TArr\n * @param {Array<TArr>} items\n * @param {(o: TArr) => number} keyFn\n */\n minBy(items, keyFn) {\n return this.maxBy(items, o => -keyFn(o));\n },\n /**\n * @template TArr\n * @param {Array<TArr>} items\n * @param {(o: TArr) => number} keyFn\n */\n sortBy(items, keyFn) {\n return items.slice().sort((a, b) => keyFn(a) - keyFn(b));\n },\n /**\n * @template T\n * @param {T} object\n * @param {Array<keyof T>} propertiesToPick\n * @return {Partial<T>}\n */\n pick(object, propertiesToPick) {\n /** @type {Partial<T>} */\n const out = {};\n for (const [key_, value] of Object.entries(object)) {\n const key = /** @type {keyof T} */ (key_);\n if (!propertiesToPick.includes(key)) continue;\n out[key] = value;\n }\n\n return out;\n },\n /**\n * @template T\n * @param {T} object\n * @param {Array<keyof T>} propertiesToDrop\n * @param {{dropUndefined?: boolean}} [options]\n * @return {Partial<T>}\n */\n omit(object, propertiesToDrop, options = {}) {\n /** @type {Partial<T>} */\n const out = {};\n for (const [key_, value] of Object.entries(object)) {\n const key = /** @type {keyof T} */ (key_);\n if (propertiesToDrop.includes(key)) continue;\n if (options.dropUndefined && value === undefined) continue;\n out[key] = value;\n }\n\n return out;\n },\n /** @param {string} uuid */\n shortId(uuid) {\n return uuid.replace(/-/g, '').slice(0, 12);\n },\n /** @param {string} string @param {number} number @param {string} [pluralForm] */\n pluralize(string, number, pluralForm) {\n pluralForm = pluralForm || `${string}s`;\n return number === 1 ? string : pluralForm;\n },\n uniqueId: (() => {\n let id = 1;\n return () => id++;\n })(),\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n'use strict';\n\nconst _ = require('../lodash.js');\n\n/** @typedef {import('./prandom.js')} PRandom */\n\nconst LOREM_IPSUM =\n // eslint-disable-next-line max-len\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin urna nunc, molestie sed hendrerit et, vulputate vitae mauris. Sed tempor vitae risus vel hendrerit. Nulla vestibulum malesuada erat vitae laoreet. Phasellus sodales vehicula dolor, dictum ullamcorper metus aliquam id. Nullam porttitor posuere purus id rhoncus. Sed et mi ligula. Donec imperdiet nulla sit amet justo cursus, id tempus ex accumsan. Maecenas ultricies elit eget lectus posuere vestibulum. Cras vestibulum neque nec justo congue feugiat non id dui. Pellentesque dapibus ac orci sed malesuada. Sed rhoncus vitae lorem eget facilisis. Donec auctor tortor a tortor egestas, vel condimentum lacus auctor.';\n\n/** @typedef {{url?: string, inclusionRate?: number, averageWastedMs?: number, averageTotalBytes?: number, averageWastedBytes?: number}} ItemGenDef */\n/** @typedef {{auditId: string, passRate?: number, averageNumericValue?: number, averageWastedMs?: number, items?: ItemGenDef[], unit?: string}} AuditGenDef */\n\n/** @param {string} auditId */\nfunction getCategoryForAuditId(auditId) {\n if (auditId.startsWith('a11y')) return 'accessibility';\n if (auditId.startsWith('seo')) return 'seo';\n if (auditId.startsWith('best-practices')) return 'best-practices';\n if (auditId.startsWith('pwa')) return 'pwa';\n return 'performance';\n}\n\n/** @param {string} auditId */\nfunction getGroupForAuditId(auditId) {\n if (auditId === 'cumulative-layout-shift') return 'metrics';\n if (auditId === 'first-contentful-paint') return 'metrics';\n if (auditId === 'first-meaningful-paint') return 'metrics';\n if (auditId === 'speed-index') return 'metrics';\n if (auditId === 'interactive') return 'metrics';\n if (auditId === 'first-cpu-idle') return 'metrics';\n if (auditId === 'max-potential-fid') return 'metrics';\n if (auditId.startsWith('diagnostic-')) return 'diagnostics';\n if (auditId.startsWith('uses-')) return 'load-opportunities';\n if (auditId.startsWith('a11y-aria')) return 'a11y-aria';\n if (auditId.startsWith('a11y')) return 'a11y-best-practices';\n if (auditId.startsWith('seo')) return 'seo-content';\n if (auditId.startsWith('best-practices')) return 'best-practices';\n if (auditId.startsWith('pwa-fast-reliable')) return 'pwa-fast-reliable';\n if (auditId.startsWith('pwa-installable')) return 'pwa-installable';\n if (auditId.startsWith('pwa-optimized')) return 'pwa-optimized';\n}\n\n/** @param {number} average @param {PRandom} prandom */\nfunction generateNumericValue(average, prandom) {\n const maxDeltaAsPercent = 0.1;\n const maxDelta = average * maxDeltaAsPercent;\n const percentile = prandom.next();\n return (percentile - 0.5) * 2 * maxDelta + average;\n}\n\n/**\n *\n * @param {string} pageUrl\n * @param {Array<AuditGenDef>} auditDefs\n * @param {PRandom} prandom\n * @return {LH.Result}\n */\nfunction createLHR(pageUrl, auditDefs, prandom) {\n /** @type {LH.Result['audits']} */\n const audits = {};\n\n const loremIpsumTokens = LOREM_IPSUM.split(' ');\n for (const auditDef of auditDefs) {\n const {auditId, averageNumericValue, averageWastedMs, unit = 'items'} = auditDef;\n const groupId = getGroupForAuditId(auditId);\n if (typeof averageNumericValue === 'number') {\n const numericValue = generateNumericValue(averageNumericValue, prandom);\n // score of 100 = <1000\n // score of 0 = >10000\n const score = 1 - Math.min(1, Math.max((numericValue - 1000) / 9000, 0));\n audits[auditId] = {\n score,\n numericValue,\n scoreDisplayMode: 'numeric',\n displayValue:\n groupId === 'metrics'\n ? `${(numericValue / 1000).toLocaleString(undefined, {maximumFractionDigits: 1})} s`\n : `${Math.round(numericValue)} ${unit}`,\n };\n } else if (typeof averageWastedMs === 'number') {\n const wastedMs = generateNumericValue(averageWastedMs, prandom);\n // score of 100 = <100\n // score of 0 = >1000\n const score = 1 - Math.min(1, Math.max((wastedMs - 100) / 900, 0));\n const hasBytes = auditDef.items && auditDef.items.some(item => item.averageWastedBytes);\n const wastedBytes = wastedMs * 257;\n audits[auditId] = {\n score,\n scoreDisplayMode: 'numeric',\n displayValue: hasBytes\n ? `${(wastedBytes / 1024).toLocaleString(undefined, {\n maximumFractionDigits: 0,\n })} KB`\n : `${(wastedMs / 1000).toLocaleString(undefined, {\n maximumFractionDigits: 1,\n })} s`,\n details: {\n type: 'opportunity',\n overallSavingsMs: wastedMs,\n overallSavingsBytes: hasBytes ? wastedBytes : undefined,\n items: [],\n },\n };\n } else {\n const {passRate = 1} = auditDef;\n audits[auditId] = {score: prandom.next() <= passRate ? 1 : 0, scoreDisplayMode: 'binary'};\n }\n\n /** @type {Record<string, any>} */\n const headersAsObject = {};\n if (auditDef.items) {\n const items = [];\n for (const {url, inclusionRate = 1, ...rest} of auditDef.items) {\n if (prandom.next() > inclusionRate) continue;\n /** @type {any} */\n const item = {};\n if (url) {\n if (url.includes('lorempixel')) {\n headersAsObject.thumbnail = {key: 'url', valueType: 'thumbnail'};\n }\n\n headersAsObject.url = {key: 'url', valueType: 'url', label: 'URL'};\n item.url = new URL(url, pageUrl).href;\n }\n\n for (const key of Object.keys(rest)) {\n if (key.startsWith('average')) {\n const dataKey = key.replace('average', '').replace(/^\\w/, v => v.toLowerCase());\n const valueType = key.endsWith('Ms') ? 'timespanMs' : 'bytes';\n headersAsObject[dataKey] = {key: dataKey, valueType, label: _.startCase(dataKey)};\n // @ts-ignore - tsc can't understand Object.keys\n const averageValue = rest[key];\n item[dataKey] = generateNumericValue(averageValue, prandom);\n } else {\n headersAsObject[key] = {key, valueType: 'text', label: _.startCase(key)};\n // @ts-ignore - tsc can't understand Object.keys\n item[key] = rest[key];\n }\n }\n\n items.push(item);\n }\n\n const details = audits[auditId].details || {type: 'table'};\n details.headings = Object.values(headersAsObject).map(header => {\n // Do the inverse of _getCanonicalizedTableHeadings\n if (getGroupForAuditId(auditId) === 'load-opportunities') return header;\n return {...header, itemType: header.valueType, text: header.label, valueType: undefined};\n });\n details.items = items;\n audits[auditId].details = details;\n }\n\n audits[auditId].title = _.startCase(auditId);\n audits[auditId].description = `Help text for ${_.startCase(auditId)}. ${loremIpsumTokens\n .slice(0, Math.round(auditId.length * 1.5))\n .join(' ')}.`;\n }\n\n /** @type {LH.Result['categories']} */\n const categories = {};\n\n const auditsGroupedByCategory = _.groupBy(Object.entries(audits), pair =>\n getCategoryForAuditId(pair[0])\n );\n for (const audits of auditsGroupedByCategory) {\n const category = getCategoryForAuditId(audits[0][0]);\n const sum = audits.reduce((sum, next) => sum + (next[1].score || 0), 0);\n categories[category] = {\n id: category,\n title: category.toUpperCase(),\n score: sum / audits.length,\n auditRefs: audits.map(([id]) => ({id, weight: 1, group: getGroupForAuditId(id)})),\n };\n }\n\n const fetchTimeBase = new Date('2019-08-01T12:00:00').getTime();\n const fetchTimeOffset = Math.round(prandom.next() * 1000 * 60 * 60 * 24 * 7);\n const fetchTime = new Date(fetchTimeBase + fetchTimeOffset).toISOString();\n\n return {\n requestedUrl: pageUrl,\n finalUrl: pageUrl,\n categories,\n audits,\n\n fetchTime,\n lighthouseVersion: '5.2.0',\n configSettings: {channel: 'cli'},\n categoryGroups: {\n metrics: {title: 'Metrics'},\n 'load-opportunities': {title: 'Opportunities'},\n diagnostics: {title: 'Diagnostics'},\n accessibility: {title: 'Accessibility'},\n seo: {title: 'SEO'},\n 'best-practices': {title: 'Best Practices'},\n 'pwa-fast-reliable': {title: 'PWA Fast & Reliable'},\n 'pwa-installable': {title: 'PWA Installable'},\n 'pwa-optimized': {title: 'PWA Optimized'},\n },\n runWarnings: [],\n userAgent: 'Chrome!',\n environment: {hostUserAgent: '', networkUserAgent: '', benchmarkIndex: 500},\n timing: {total: 1, entries: []},\n i18n: {rendererFormattedStrings: {}, icuMessagePaths: {}},\n };\n}\n\nmodule.exports = {createLHR, generateNumericValue, getGroupForAuditId};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n'use strict';\n\nconst _ = require('./lodash.js');\nconst {getGroupForAuditId} = require('./seed-data/lhr-generator.js');\n\n/** @typedef {'improvement'|'neutral'|'regression'} DiffLabel */\n/** @typedef {'better'|'worse'|'added'|'removed'|'ambiguous'|'no change'} RowLabel */\n/** @typedef {{item: Record<string, any>, kind?: string, index: number}} DetailItemEntry */\n\n// Hardcoded audit ids that arent worth diffing and generally regress the UX when done.\nconst auditsToNotDIff = ['main-thread-tasks', 'screenshot-thumbnails', 'metrics'];\n\n/**\n * @param {number} delta\n * @param {'audit'|'score'} deltaType\n * @return {DiffLabel}\n */\nfunction getDeltaLabel(delta, deltaType = 'audit') {\n if (delta === 0) return 'neutral';\n let isImprovement = delta < 0;\n if (deltaType === 'score') isImprovement = delta > 0;\n return isImprovement ? 'improvement' : 'regression';\n}\n\n/**\n * @param {LHCI.AuditDiff} diff\n * @return {DiffLabel}\n */\nfunction getDiffLabel(diff) {\n switch (diff.type) {\n case 'error':\n return 'regression';\n case 'score':\n return getDeltaLabel(getDeltaStats(diff).delta, 'score');\n case 'numericValue':\n case 'itemCount':\n case 'itemDelta':\n return getDeltaLabel(getDeltaStats(diff).delta, 'audit');\n case 'itemAddition':\n return 'regression';\n case 'itemRemoval':\n return 'improvement';\n default:\n return 'neutral';\n }\n}\n\n/**\n * Given the array of diffs for a particular row, determine its label.\n *\n * @param {Array<LHCI.AuditDiff>} diffs\n * @return {RowLabel}\n */\nfunction getRowLabel(diffs) {\n if (!diffs.length) return 'no change';\n\n if (diffs.some(diff => diff.type === 'itemAddition')) return 'added';\n if (diffs.some(diff => diff.type === 'itemRemoval')) return 'removed';\n\n const itemDeltaDiffs = diffs.filter(\n /** @return {diff is LHCI.NumericItemAuditDiff} */ diff => diff.type === 'itemDelta'\n );\n\n // All the diffs were worse, it's \"worse\".\n if (itemDeltaDiffs.every(diff => diff.compareValue > diff.baseValue)) return 'worse';\n // All the diffs were better, it's \"better\".\n if (itemDeltaDiffs.every(diff => diff.compareValue < diff.baseValue)) return 'better';\n // The item had diffs but some were better and some were worse, so we can't decide.\n if (itemDeltaDiffs.length) return 'ambiguous';\n\n return 'no change';\n}\n\n/**\n * @param {Array<LHCI.AuditDiff>} diffs\n * @param {number|undefined} compareItemIndex\n * @param {number|undefined} baseItemIndex\n * @return {Array<LHCI.AuditDiff>}\n */\nfunction getMatchingDiffsForIndex(diffs, compareItemIndex, baseItemIndex) {\n return diffs.filter(diff => {\n const compareIndex = 'compareItemIndex' in diff ? diff.compareItemIndex : undefined;\n const baseIndex = 'baseItemIndex' in diff ? diff.baseItemIndex : undefined;\n if (typeof compareIndex === 'number') return compareIndex === compareItemIndex;\n if (typeof baseIndex === 'number') return baseIndex === baseItemIndex;\n return false;\n });\n}\n\n/**\n * Given the array of all diffs for an audit, determine the label for a row with particular item index.\n *\n * @param {Array<LHCI.AuditDiff>} diffs\n * @param {number|undefined} compareItemIndex\n * @param {number|undefined} baseItemIndex\n * @return {RowLabel}\n */\nfunction getRowLabelForIndex(diffs, compareItemIndex, baseItemIndex) {\n return getRowLabel(getMatchingDiffsForIndex(diffs, compareItemIndex, baseItemIndex));\n}\n\n/**\n * Given the array of all diffs for an audit, determine the worst numeric delta for a particular row.\n * Used for sorting.\n *\n * @param {Array<LHCI.AuditDiff>} diffs\n * @param {number|undefined} compareItemIndex\n * @param {number|undefined} baseItemIndex\n * @return {number|undefined}\n */\nfunction getWorstNumericDeltaForIndex(diffs, compareItemIndex, baseItemIndex) {\n const matchingDiffs = getMatchingDiffsForIndex(diffs, compareItemIndex, baseItemIndex);\n const numericDiffs = matchingDiffs.filter(isNumericAuditDiff);\n if (!numericDiffs.length) return undefined;\n return Math.max(...numericDiffs.map(diff => getDeltaStats(diff).delta));\n}\n\n/** @param {Array<DiffLabel>} labels @return {DiffLabel} */\nfunction getMostSevereDiffLabel(labels) {\n if (labels.some(l => l === 'regression')) return 'regression';\n if (labels.some(l => l === 'neutral')) return 'neutral';\n return 'improvement';\n}\n\n/**\n * @param {LHCI.AuditDiff} diff\n * @return {diff is LHCI.NumericAuditDiff|LHCI.NumericItemAuditDiff} */\nfunction isNumericAuditDiff(diff) {\n return ['score', 'numericValue', 'itemCount', 'itemDelta'].includes(diff.type);\n}\n\n/** @param {number|null|undefined} score */\nfunction getScoreLevel(score) {\n if (typeof score !== 'number') return 'error';\n if (score >= 0.9) return 'pass';\n if (score >= 0.5) return 'average';\n return 'fail';\n}\n\n/** @param {number|null|undefined} value @param {[number, number]} cutoffs */\nfunction getMetricScoreLevel(value, cutoffs) {\n if (typeof value !== 'number') return 'error';\n if (value <= cutoffs[0]) return 'pass';\n if (value <= cutoffs[1]) return 'average';\n return 'fail';\n}\n\n/** @param {LHCI.AuditDiff} diff */\nfunction getDiffSeverity(diff) {\n const delta = isNumericAuditDiff(diff) ? getDeltaStats(diff).absoluteDelta : 0;\n if (diff.type === 'error') return 1e12;\n if (diff.type === 'score') return 1e10 * delta;\n if (diff.type === 'numericValue') return 1e8 * Math.max(delta / 1000, 1);\n if (diff.type === 'itemCount') return 1e6 * delta;\n if (diff.type === 'itemAddition') return 1e5;\n if (diff.type === 'itemRemoval') return 1e5;\n if (diff.type === 'itemDelta') return Math.min(Math.max(delta / 100, 1), 1e5 - 1);\n return 0;\n}\n\n/**\n * @param {LHCI.NumericAuditDiff | LHCI.NumericItemAuditDiff} diff\n */\nfunction getDeltaStats(diff) {\n const {baseValue, compareValue} = diff;\n const delta = compareValue - baseValue;\n const absoluteDelta = Math.abs(delta);\n // Handle the 0 case to avoid messy NaN handling.\n if (delta === 0) return {delta, absoluteDelta, percentDelta: 0, percentAbsoluteDelta: 0};\n\n // Percent delta is `delta / baseValue` unless `baseValue == 0`.\n // Then `percentDelta` is 100% by arbitrary convention (instead of Infinity/NaN).\n const percentDelta = baseValue ? delta / baseValue : 1;\n const percentAbsoluteDelta = Math.abs(percentDelta);\n\n return {\n delta,\n absoluteDelta,\n percentDelta,\n percentAbsoluteDelta,\n };\n}\n\n/**\n * @param {{auditId: string, type: LHCI.AuditDiffType, baseValue?: number|null, compareValue?: number|null, itemKey?: string, baseItemIndex?: number, compareItemIndex?: number}} diff\n * @return {LHCI.AuditDiff}\n */\nfunction createAuditDiff(diff) {\n const {auditId, type, baseValue, compareValue, baseItemIndex, compareItemIndex, itemKey} = diff;\n if (type === 'itemAddition') {\n if (typeof compareItemIndex !== 'number') throw new Error('compareItemIndex is not set');\n return {auditId, type, compareItemIndex};\n }\n\n if (type === 'itemRemoval') {\n if (typeof baseItemIndex !== 'number') throw new Error('baseItemIndex is not set');\n return {auditId, type, baseItemIndex};\n }\n\n if (type === 'displayValue') {\n throw new Error('Do not use createAuditDiff for displayValue, just manually create');\n }\n\n if (\n typeof compareValue !== 'number' ||\n typeof baseValue !== 'number' ||\n !Number.isFinite(baseValue) ||\n !Number.isFinite(compareValue) ||\n type === 'error'\n ) {\n return {\n auditId,\n type: 'error',\n attemptedType: type,\n baseValue: baseValue || NaN,\n compareValue: compareValue || NaN,\n };\n }\n\n /** @type {LHCI.NumericAuditDiff} */\n const numericDiffResult = {\n auditId,\n type: 'score',\n baseValue,\n compareValue,\n };\n\n if (type === 'itemDelta') {\n if (typeof itemKey !== 'string') throw new Error('itemKey is not set');\n if (typeof baseItemIndex !== 'number' && typeof compareItemIndex !== 'number') {\n throw new Error('Either baseItemIndex or compareItemIndex must be set');\n }\n\n return {\n ...numericDiffResult,\n type: 'itemDelta',\n baseItemIndex,\n compareItemIndex,\n itemKey,\n };\n }\n\n return {...numericDiffResult, type};\n}\n\n/**\n *\n * @param {string} auditId\n * @param {DetailItemEntry} baseEntry\n * @param {DetailItemEntry} compareEntry\n * @param {Array<{key: string | null}>} headings\n * @return {Array<LHCI.AuditDiff>}\n */\nfunction findAuditDetailItemKeyDiffs(auditId, baseEntry, compareEntry, headings) {\n /** @type {Array<LHCI.AuditDiff>} */\n const diffs = [];\n\n for (const key of Object.keys(baseEntry.item)) {\n const baseValue = baseEntry.item[key];\n const compareValue = compareEntry.item[key];\n // If these aren't numeric, comparable values, skip the key.\n if (typeof baseValue !== 'number' || typeof compareValue !== 'number') continue;\n // If these aren't shown in the table, skip the key.\n if (!headings.some(heading => heading.key === key)) continue;\n\n diffs.push(\n createAuditDiff({\n auditId,\n type: 'itemDelta',\n itemKey: key,\n baseItemIndex: baseEntry.index,\n compareItemIndex: compareEntry.index,\n baseValue,\n compareValue,\n })\n );\n }\n\n return diffs;\n}\n\n/**\n * This function creates NumericItemAuditDiffs from itemAddition/itemRemoved diffs. Normally, these\n * are superfluous data, but in some instances (table details views for example), it's desirable to\n * understand the diff state of each individual itemKey. The missing values are assumed to be 0\n * for the purposes of the diff.\n *\n * @param {Array<LHCI.AuditDiff>} diffs\n * @param {Array<Record<string, any>>} baseItems\n * @param {Array<Record<string, any>>} compareItems\n * @return {Array<LHCI.AuditDiff>}\n */\nfunction synthesizeItemKeyDiffs(diffs, baseItems, compareItems) {\n /** @type {Array<LHCI.AuditDiff>} */\n const itemKeyDiffs = [];\n\n for (const diff of diffs) {\n if (diff.type !== 'itemAddition' && diff.type !== 'itemRemoval') continue;\n\n const item =\n diff.type === 'itemAddition'\n ? compareItems[diff.compareItemIndex]\n : baseItems[diff.baseItemIndex];\n\n for (const key of Object.keys(item)) {\n const baseValue = diff.type === 'itemAddition' ? 0 : item[key];\n const compareValue = diff.type === 'itemAddition' ? item[key] : 0;\n if (typeof compareValue !== 'number' || typeof baseValue !== 'number') continue;\n\n const itemIndexKeyName = diff.type === 'itemAddition' ? 'compareItemIndex' : 'baseItemIndex';\n const itemIndexValue =\n diff.type === 'itemAddition' ? diff.compareItemIndex : diff.baseItemIndex;\n itemKeyDiffs.push(\n createAuditDiff({\n auditId: diff.auditId,\n type: 'itemDelta',\n itemKey: key,\n [itemIndexKeyName]: itemIndexValue,\n baseValue,\n compareValue,\n })\n );\n }\n }\n\n return itemKeyDiffs;\n}\n\n/** @param {string} s */\nfunction replaceNondeterministicStrings(s) {\n if (s.startsWith('http') && s.includes('?')) {\n try {\n const url = new URL(s);\n url.search = '';\n s = url.href;\n } catch (err) {}\n }\n\n return (\n s\n // YouTube Embeds\n .replace(/www-embed-player-[0-9a-z]+/i, 'www-embed-player')\n .replace(/player_ias-[0-9a-z]+/i, 'player_ias')\n // UUIDs\n .replace(/\\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\b/gi, 'UUID')\n // localhost Ports\n .replace(/:[0-9]{3,5}\\//, ':PORT/')\n // Hash components embedded in filenames\n .replace(/(\\.|-)[0-9a-f]{6,8}\\.(js|css|woff|html|png|jpeg|jpg|svg)/i, '$1HASH.$2')\n );\n}\n\n/**\n * The items passed to this method can be dirtied by other libraries and contain circular structures.\n * Prune any private-looking properties that start with `_` throughout the entire object.\n *\n * @see https://github.com/GoogleChrome/lighthouse-ci/issues/666\n * @param {unknown} item\n * @return {unknown}\n */\nfunction deepPruneItemForKeySerialization(item) {\n if (typeof item !== 'object') return item;\n if (item === null) return item;\n\n if (Array.isArray(item)) {\n return item.map(entry => deepPruneItemForKeySerialization(entry));\n } else {\n const itemAsRecord = /** @type {Record<string, unknown>} */ (item);\n const keys = Object.keys(item);\n const keysToKeep = keys.filter(key => !key.startsWith('_'));\n /** @type {Record<string, any>} */\n const copy = {};\n for (const key of keysToKeep) {\n copy[key] = deepPruneItemForKeySerialization(itemAsRecord[key]);\n }\n return copy;\n }\n}\n\n/** @param {Record<string, any>} item @return {string} */\nfunction getItemKey(item) {\n // For most opportunities, diagnostics, etc where 1 row === 1 resource\n if (typeof item.url === 'string' && item.url) return item.url;\n if (typeof item.origin === 'string' && item.origin) return item.origin;\n // For sourcemapped opportunities that identify a source location\n const source = item.source;\n if (typeof source === 'string') return source;\n if (source && source.url) return `${source.url}:${source.line}:${source.column}`;\n // For the pre-grouped audits like resource-summary\n if (typeof item.label === 'string') return item.label;\n // For the pre-grouped audits like mainthread-work-breakdown\n if (typeof item.groupLabel === 'string') return item.groupLabel;\n // For user-timings\n if (typeof item.name === 'string') return item.name;\n // For dom-size\n if (typeof item.statistic === 'string') return item.statistic;\n // For third-party-summary\n if (item.entity && typeof item.entity.text === 'string') return item.entity.text;\n\n // For everything else, use the entire object, actually works OK on most nodes.\n return JSON.stringify(deepPruneItemForKeySerialization(item));\n}\n\n/**\n * @param {Array<Record<string, any>>} baseItems\n * @param {Array<Record<string, any>>} compareItems\n * @return {Array<{base?: DetailItemEntry, compare?: DetailItemEntry}>}\n */\nfunction zipBaseAndCompareItems(baseItems, compareItems) {\n const groupedByKey = _.groupIntoMap(\n [\n ...baseItems.map((item, i) => ({item, kind: 'base', index: i})),\n ...compareItems.map((item, i) => ({item, kind: 'compare', index: i})),\n ],\n entry => replaceNondeterministicStrings(getItemKey(entry.item))\n );\n\n /** @type {Array<{base?: DetailItemEntry, compare?: DetailItemEntry}>} */\n const zipped = [];\n\n for (const entries of groupedByKey.values()) {\n const baseItems = entries.filter(entry => entry.kind === 'base');\n const compareItems = entries.filter(entry => entry.kind === 'compare');\n\n if (baseItems.length > 1 || compareItems.length > 1) {\n // The key is not actually unique, just treat all as added/removed.\n for (const entry of entries) {\n zipped.push({[entry.kind]: entry});\n }\n\n continue;\n }\n\n zipped.push({base: baseItems[0], compare: compareItems[0]});\n }\n\n return zipped;\n}\n\n/**\n * @param {Array<LHCI.AuditDiff>} diffs\n * @param {Array<{base?: DetailItemEntry, compare?: DetailItemEntry}>} zippedItems\n * @return {Array<{base?: DetailItemEntry, compare?: DetailItemEntry, diffs: Array<LHCI.AuditDiff>}>}\n */\nfunction sortZippedBaseAndCompareItems(diffs, zippedItems) {\n /** @type {Array<RowLabel>} */\n const rowLabelSortOrder = ['added', 'worse', 'ambiguous', 'removed', 'better', 'no change'];\n\n return zippedItems\n .map(item => {\n return {\n ...item,\n diffs: getMatchingDiffsForIndex(\n diffs,\n item.compare && item.compare.index,\n item.base && item.base.index\n ),\n };\n })\n .sort((a, b) => {\n const compareIndexA = a.compare && a.compare.index;\n const baseIndexA = a.base && a.base.index;\n const compareIndexB = b.compare && b.compare.index;\n const baseIndexB = b.base && b.base.index;\n\n const rowStateIndexA = rowLabelSortOrder.indexOf(\n getRowLabelForIndex(diffs, compareIndexA, baseIndexA)\n );\n const rowStateIndexB = rowLabelSortOrder.indexOf(\n getRowLabelForIndex(diffs, compareIndexB, baseIndexB)\n );\n\n const labelValueA = getItemKey(\n (a.compare && a.compare.item) || (a.base && a.base.item) || {}\n );\n const labelValueB = getItemKey(\n (b.compare && b.compare.item) || (b.base && b.base.item) || {}\n );\n\n const numericValueA = getWorstNumericDeltaForIndex(diffs, compareIndexA, baseIndexA);\n const numericValueB = getWorstNumericDeltaForIndex(diffs, compareIndexB, baseIndexB);\n\n if (rowStateIndexA === rowStateIndexB) {\n return typeof numericValueA === 'number' && typeof numericValueB === 'number'\n ? numericValueB - numericValueA\n : labelValueA.localeCompare(labelValueB);\n }\n return rowStateIndexA - rowStateIndexB;\n });\n}\n\n/**\n * @param {string} auditId\n * @param {Array<Record<string, any>>} baseItems\n * @param {Array<Record<string, any>>} compareItems\n * @param {Array<{key: string | null}>} headings\n * @return {Array<LHCI.AuditDiff>}\n */\nfunction findAuditDetailItemsDiffs(auditId, baseItems, compareItems, headings) {\n /** @type {Array<LHCI.AuditDiff>} */\n const diffs = [];\n\n for (const {base, compare} of zipBaseAndCompareItems(baseItems, compareItems)) {\n if (base && compare) {\n diffs.push(...findAuditDetailItemKeyDiffs(auditId, base, compare, headings));\n } else if (compare) {\n diffs.push({type: 'itemAddition', auditId, compareItemIndex: compare.index});\n } else if (base) {\n diffs.push({type: 'itemRemoval', auditId, baseItemIndex: base.index});\n } else {\n throw new Error('Impossible');\n }\n }\n\n return diffs;\n}\n\n/**\n * @param {LH.AuditResult} audit\n */\nfunction normalizeScore(audit) {\n if (audit.scoreDisplayMode === 'notApplicable') {\n // notApplicable should be treated as passing.\n return 1;\n }\n\n if (audit.scoreDisplayMode === 'informative') {\n // informative should be treated as failing.\n return 0;\n }\n\n return audit.score;\n}\n\n/**\n * @param {LH.AuditResult} audit\n */\nfunction getNumericValue(audit) {\n if (\n typeof audit.numericValue !== 'number' &&\n audit.details &&\n typeof audit.details.overallSavingsMs === 'number'\n ) {\n return audit.details.overallSavingsMs;\n }\n\n return audit.numericValue;\n}\n\n/**\n * @param {LH.AuditResult} audit\n */\nfunction normalizeNumericValue(audit) {\n if (audit.scoreDisplayMode === 'notApplicable') {\n return 0;\n }\n\n return getNumericValue(audit);\n}\n\n/**\n * @param {LH.AuditResult} audit\n * @return {Required<Pick<Required<LH.AuditResult>['details'],'items'|'headings'>>}\n */\nfunction normalizeDetails(audit) {\n if (!audit.details) return {items: [], headings: []};\n return {items: audit.details.items || [], headings: audit.details.headings || []};\n}\n\n/**\n * @param {LH.AuditResult} baseAudit\n * @param {LH.AuditResult} compareAudit\n * @param {{forceAllScoreDiffs?: boolean, skipDisplayValueDiffs?: boolean, synthesizeItemKeyDiffs?: boolean, percentAbsoluteDeltaThreshold?: number}} options\n * @return {Array<LHCI.AuditDiff>}\n */\nfunction findAuditDiffs(baseAudit, compareAudit, options = {}) {\n const auditId = baseAudit.id || '';\n const {percentAbsoluteDeltaThreshold = 0} = options;\n /** @type {Array<LHCI.AuditDiff>} */\n const diffs = [];\n\n if (auditsToNotDIff.includes(auditId)) return diffs;\n\n if (typeof baseAudit.score === 'number' || typeof compareAudit.score === 'number') {\n diffs.push(\n createAuditDiff({\n auditId,\n type: 'score',\n baseValue: normalizeScore(baseAudit),\n compareValue: normalizeScore(compareAudit),\n })\n );\n }\n\n if (\n typeof getNumericValue(baseAudit) === 'number' ||\n typeof getNumericValue(compareAudit) === 'number'\n ) {\n diffs.push(\n createAuditDiff({\n auditId,\n type: 'numericValue',\n baseValue: normalizeNumericValue(baseAudit),\n compareValue: normalizeNumericValue(compareAudit),\n })\n );\n }\n\n if (typeof baseAudit.displayValue === 'string' || typeof compareAudit.displayValue === 'string') {\n diffs.push({\n auditId,\n type: 'displayValue',\n baseValue: baseAudit.displayValue || '',\n compareValue: compareAudit.displayValue || '',\n });\n }\n\n let hasItemDetails = false;\n /** @type {Partial<LH.AuditResult['details']>} */\n const baseAuditDetails = baseAudit.details || {};\n /** @type {Partial<LH.AuditResult['details']>} */\n const compareAuditDetails = compareAudit.details || {};\n if (\n (baseAuditDetails.type !== 'debugdata' && baseAuditDetails.items) ||\n (compareAuditDetails.type !== 'debugdata' && compareAuditDetails.items)\n ) {\n hasItemDetails = true;\n const {items: baseItems, headings: baseHeadings} = normalizeDetails(baseAudit);\n const {items: compareItems, headings: compareHeadings} = normalizeDetails(compareAudit);\n const headings = baseHeadings.concat(compareHeadings);\n\n diffs.push(\n createAuditDiff({\n auditId,\n type: 'itemCount',\n baseValue: baseItems.length,\n compareValue: compareItems.length,\n })\n );\n\n diffs.push(...findAuditDetailItemsDiffs(auditId, baseItems, compareItems, headings));\n\n if (options.synthesizeItemKeyDiffs) {\n diffs.push(...synthesizeItemKeyDiffs(diffs, baseItems, compareItems));\n }\n }\n\n const filteredDiffs = diffs.filter(diff => {\n // Errors are always surfaced.\n if (diff.type === 'error') return true;\n // Additions and removals are always surfaced.\n if (diff.type === 'itemAddition' || diff.type === 'itemRemoval') return true;\n // If it's a score and we're not forcing all score diffs, only flag level changes.\n if (diff.type === 'score' && !options.forceAllScoreDiffs) {\n return getScoreLevel(diff.baseValue) !== getScoreLevel(diff.compareValue);\n }\n // If it's a display value change, ensure the values are different, and defer to the options.\n if (diff.type === 'displayValue') {\n return diff.baseValue !== diff.compareValue && !options.skipDisplayValueDiffs;\n }\n\n // Ensure the percent delta is above our threshold (0 by default).\n return getDeltaStats(diff).percentAbsoluteDelta > percentAbsoluteDeltaThreshold;\n });\n\n // If the only diff found was a displayValue diff, skip it as the others were probably ignored by\n // our percentAbsoluteDeltaThreshold.\n if (filteredDiffs.length === 1 && filteredDiffs[0].type === 'displayValue') return [];\n\n // If the only diff found was a numericValue/displayValue diff *AND* it seems like the result was flaky, skip it.\n // The result is likely flaky if the audit passed *OR* it was supposed to have details but no details items changed.\n const isAllPassing = compareAudit.score === 1 && baseAudit.score === 1;\n const group = getGroupForAuditId(auditId);\n if (\n group !== 'metrics' && // if metrics group audit is found, don't skip it\n filteredDiffs.every(diff => diff.type === 'displayValue' || diff.type === 'numericValue') &&\n (isAllPassing || hasItemDetails)\n ) {\n return [];\n }\n\n return filteredDiffs;\n}\n\nmodule.exports = {\n findAuditDiffs,\n getDiffSeverity,\n getDeltaLabel,\n getDeltaStats,\n getDiffLabel,\n getRowLabel,\n getRowLabelForIndex,\n getMostSevereDiffLabel,\n getMetricScoreLevel,\n zipBaseAndCompareItems,\n synthesizeItemKeyDiffs,\n sortZippedBaseAndCompareItems,\n replaceNondeterministicStrings,\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n'use strict';\n\n/**\n * @see https://github.com/GoogleChrome/lighthouse/blob/2ff07d29a3e12a75cc844427c567330eb84d4249/lighthouse-core/report/html/renderer/util.js#L320-L347\n *\n * Split a string on markdown links (e.g. [some link](https://...)) into\n * segments of plain text that weren't part of a link (marked as\n * `isLink === false`), and segments with text content and a URL that did make\n * up a link (marked as `isLink === true`).\n * @param {string} text\n * @return {Array<{isLink: true, text: string, linkHref: string}|{isLink: false, text: string}>}\n */\nfunction splitMarkdownLink(text) {\n /** @type {Array<{isLink: true, text: string, linkHref: string}|{isLink: false, text: string}>} */\n const segments = [];\n\n const parts = text.split(/\\[([^\\]]+?)\\]\\((https?:\\/\\/.*?)\\)/g);\n while (parts.length) {\n // Shift off the same number of elements as the pre-split and capture groups.\n const [preambleText, linkText, linkHref] = parts.splice(0, 3);\n\n if (preambleText) {\n // Skip empty text as it's an artifact of splitting, not meaningful.\n segments.push({\n isLink: false,\n text: preambleText,\n });\n }\n\n // Append link if there are any.\n if (linkText && linkHref) {\n segments.push({\n isLink: true,\n text: linkText,\n linkHref,\n });\n }\n }\n\n return segments;\n}\n\nmodule.exports = {splitMarkdownLink};\n", "export const EMPTY_OBJ = {};\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|^--/i;\n", "/** @type {import('./internal').Options} */\nconst options = {};\n\nexport default options;\n", "import options from './options';\nimport { assign } from './util';\n\n/**\n * Create an virtual node (used for JSX)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * constructor for this virtual node\n * @param {object | null | undefined} [props] The properties of the virtual node\n * @param {Array<import('.').ComponentChildren>} [children] The children of the virtual node\n * @returns {import('./internal').VNode}\n */\nexport function createElement(type, props, children) {\n\tprops = assign({}, props);\n\n\tif (arguments.length>3) {\n\t\tchildren = [children];\n\t\t// https://github.com/preactjs/preact/issues/1916\n\t\tfor (let i=3; i<arguments.length; i++) {\n\t\t\tchildren.push(arguments[i]);\n\t\t}\n\t}\n\tif (children!=null) {\n\t\tprops.children = children;\n\t}\n\n\t// \"type\" may be undefined during development. The check is needed so that\n\t// we can display a nice error message with our debug helpers\n\tif (type!=null && type.defaultProps!=null) {\n\t\tfor (let i in type.defaultProps) {\n\t\t\tif (props[i]===undefined) props[i] = type.defaultProps[i];\n\t\t}\n\t}\n\tlet ref = props.ref;\n\tlet key = props.key;\n\tif (ref!=null) delete props.ref;\n\tif (key!=null) delete props.key;\n\n\treturn createVNode(type, props, key, ref);\n}\n\n/**\n * Create a VNode (used internally by Preact)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * Constructor for this virtual node\n * @param {object | string | number | null} props The properties of this virtual node.\n * If this virtual node represents a text node, this is the text of the node (string or number).\n * @param {string | number | null} key The key for this virtual node, used when\n * diffing it against its children\n * @param {import('./internal').VNode[\"ref\"]} ref The ref property that will\n * receive a reference to its created child\n * @returns {import('./internal').VNode}\n */\nexport function createVNode(type, props, key, ref) {\n\t// V8 seems to be better at detecting type shapes if the object is allocated from the same call site\n\t// Do not inline into createElement and coerceToVNode!\n\tconst vnode = {\n\t\ttype,\n\t\tprops,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t_lastDomChild: null,\n\t\t_component: null,\n\t\tconstructor: undefined\n\t};\n\n\tif (options.vnode) options.vnode(vnode);\n\n\treturn vnode;\n}\n\nexport function createRef() {\n\treturn {};\n}\n\nexport function Fragment(props) {\n\treturn props.children;\n}\n\n/**\n * Check if a the argument is a valid Preact VNode.\n * @param {*} vnode\n * @returns {vnode is import('./internal').VNode}\n */\nexport const isValidElement = vnode => vnode!=null && vnode.constructor === undefined;\n\n/**\n * Coerce an untrusted value into a VNode\n * Specifically, this should be used anywhere a user could provide a boolean, string, or number where\n * a VNode or Component is desired instead\n * @param {boolean | string | number | import('./internal').VNode} possibleVNode A possible VNode\n * @returns {import('./internal').VNode | null}\n */\nexport function coerceToVNode(possibleVNode) {\n\tif (possibleVNode == null || typeof possibleVNode === 'boolean') return null;\n\tif (typeof possibleVNode === 'string' || typeof possibleVNode === 'number') {\n\t\treturn createVNode(null, possibleVNode, null, null);\n\t}\n\n\t// Clone vnode if it has already been used. ceviche/#57\n\tif (possibleVNode._dom!=null || possibleVNode._component!=null) {\n\t\tlet vnode = createVNode(possibleVNode.type, possibleVNode.props, possibleVNode.key, null);\n\t\tvnode._dom = possibleVNode._dom;\n\t\treturn vnode;\n\t}\n\n\treturn possibleVNode;\n}\n", "import { assign } from './util';\nimport { diff, commitRoot } from './diff/index';\nimport options from './options';\nimport { Fragment } from './create-element';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function Component(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nComponent.prototype.setState = function(update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s = (this._nextState!==this.state && this._nextState) || (this._nextState = assign({}, this.state));\n\n\t// if update() mutates state in-place, skip the copy:\n\tif (typeof update!=='function' || (update = update(s, this.props))) {\n\t\tassign(s, update);\n\t}\n\n\t// Skip update if updater function returned null\n\tif (update==null) return;\n\n\tif (this._vnode) {\n\t\tthis._force = false;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nComponent.prototype.forceUpdate = function(callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._force = true;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](http://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {import('./index').ComponentChildren | void}\n */\nComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == null) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent\n\t\t\t? getDomSibling(vnode._parent, vnode._parent._children.indexOf(vnode) + 1)\n\t\t\t: null;\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling != null && sibling._dom != null) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search)\n\treturn typeof vnode.type === 'function' ? getDomSibling(vnode) : null;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} c The component to rerender\n */\nfunction renderComponent(component) {\n\tlet vnode = component._vnode,\n\t\toldDom = vnode._dom,\n\t\tparentDom = component._parentDom;\n\n\tif (parentDom) {\n\t\tlet mounts = [];\n\t\tlet newDom = diff(parentDom, vnode, assign({}, vnode), component._context, parentDom.ownerSVGElement!==undefined, null, mounts, oldDom == null ? getDomSibling(vnode) : oldDom);\n\t\tcommitRoot(mounts, vnode);\n\n\t\tif (newDom != oldDom) {\n\t\t\tupdateParentDomPointers(vnode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\tif ((vnode = vnode._parent) != null && vnode._component != null) {\n\t\tvnode._dom = vnode._component.base = null;\n\t\tfor (let i = 0; i < vnode._children.length; i++) {\n\t\t\tlet child = vnode._children[i];\n\t\t\tif (child != null && child._dom != null) {\n\t\t\t\tvnode._dom = vnode._component.base = child._dom;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array<import('./internal').Component>}\n */\nlet q = [];\n\n/**\n * Asynchronously schedule a callback\n * @type {(cb) => void}\n */\nconst defer = typeof Promise=='function' ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout;\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce = options.debounceRendering;\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif ((!c._dirty && (c._dirty = true) && q.push(c) === 1) ||\n\t (prevDebounce !== options.debounceRendering)) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(options.debounceRendering || defer)(process);\n\t}\n}\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\tlet p;\n\tq.sort((a, b) => b._vnode._depth - a._vnode._depth);\n\twhile ((p=q.pop())) {\n\t\t// forceUpdate's callback argument is reused here to indicate a non-forced update.\n\t\tif (p._dirty) renderComponent(p);\n\t}\n}\n", "import { EMPTY_OBJ, EMPTY_ARR } from './constants';\nimport { commitRoot, diff } from './diff/index';\nimport { createElement, Fragment } from './create-element';\nimport options from './options';\n\nconst IS_HYDRATE = EMPTY_OBJ;\n\n/**\n * Render a Preact virtual node into a DOM element\n * @param {import('./index').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to\n * render into\n * @param {Element | Text} [replaceNode] Attempt to re-use an\n * existing DOM tree rooted at `replaceNode`\n */\nexport function render(vnode, parentDom, replaceNode) {\n\tif (options._root) options._root(vnode, parentDom);\n\n\tlet isHydrating = replaceNode === IS_HYDRATE;\n\tlet oldVNode = isHydrating ? null : replaceNode && replaceNode._children || parentDom._children;\n\tvnode = createElement(Fragment, null, [vnode]);\n\n\tlet mounts = [];\n\tdiff(\n\t\tparentDom,\n\t\tisHydrating ? parentDom._children = vnode : (replaceNode || parentDom)._children = vnode,\n\t\toldVNode || EMPTY_OBJ,\n\t\tEMPTY_OBJ,\n\t\tparentDom.ownerSVGElement !== undefined,\n\t\treplaceNode && !isHydrating\n\t\t\t? [replaceNode]\n\t\t\t: oldVNode\n\t\t\t\t? null\n\t\t\t\t: EMPTY_ARR.slice.call(parentDom.childNodes),\n\t\tmounts,\n\t\treplaceNode || EMPTY_OBJ,\n\t\tisHydrating,\n\t);\n\tcommitRoot(mounts, vnode);\n}\n\n/**\n * Update an existing DOM element with data from a Preact virtual node\n * @param {import('./index').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to\n * update\n */\nexport function hydrate(vnode, parentDom) {\n\trender(vnode, parentDom, IS_HYDRATE);\n}\n", "import { enqueueRender } from './component';\n\nexport let i = 0;\n\n/**\n *\n * @param {any} defaultValue\n */\nexport function createContext(defaultValue) {\n\tconst ctx = {};\n\n\tconst context = {\n\t\t_id: '__cC' + i++,\n\t\t_defaultValue: defaultValue,\n\t\tConsumer(props, context) {\n\t\t\treturn props.children(context);\n\t\t},\n\t\tProvider(props) {\n\t\t\tif (!this.getChildContext) {\n\t\t\t\tconst subs = [];\n\t\t\t\tthis.getChildContext = () => {\n\t\t\t\t\tctx[context._id] = this;\n\t\t\t\t\treturn ctx;\n\t\t\t\t};\n\t\t\t\tthis.shouldComponentUpdate = _props => {\n\t\t\t\t\tif (props.value !== _props.value) {\n\t\t\t\t\t\tsubs.some(c => {\n\t\t\t\t\t\t\t// Check if still mounted\n\t\t\t\t\t\t\tif (c._parentDom) {\n\t\t\t\t\t\t\t\tc.context = _props.value;\n\t\t\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tthis.sub = (c) => {\n\t\t\t\t\tsubs.push(c);\n\t\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\t\tsubs.splice(subs.indexOf(c), 1);\n\t\t\t\t\t\told && old.call(c);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn props.children;\n\t\t}\n\t};\n\n\tcontext.Consumer.contextType = context;\n\n\treturn context;\n}\n", "/**\n * Assign properties from `props` to `obj`\n * @template O, P The obj and props types\n * @param {O} obj The object to copy properties to\n * @param {P} props The object to copy properties from\n * @returns {O & P}\n */\nexport function assign(obj, props) {\n\tfor (let i in props) obj[i] = props[i];\n\treturn /** @type {O & P} */ (obj);\n}\n\n/**\n * Remove a child node from its parent if attached. This is a workaround for\n * IE11 which doesn't support `Element.prototype.remove()`. Using this function\n * is smaller than including a dedicated polyfill.\n * @param {Node} node The node to remove\n */\nexport function removeNode(node) {\n\tlet parentNode = node.parentNode;\n\tif (parentNode) parentNode.removeChild(node);\n}\n", "import { diff, unmount, applyRef } from './index';\nimport { coerceToVNode } from '../create-element';\nimport { EMPTY_OBJ, EMPTY_ARR } from '../constants';\nimport { removeNode } from '../util';\nimport { getDomSibling } from '../component';\n\n/**\n * Diff the children of a virtual node\n * @param {import('../internal').PreactElement} parentDom The DOM element whose\n * children are being diffed\n * @param {import('../internal').VNode} newParentVNode The new virtual\n * node whose children should be diff'ed against oldParentVNode\n * @param {import('../internal').VNode} oldParentVNode The old virtual\n * node whose children should be diff'ed against newParentVNode\n * @param {object} context The current context object\n * @param {boolean} isSvg Whether or not this DOM node is an SVG node\n * @param {Array<import('../internal').PreactElement>} excessDomChildren\n * @param {Array<import('../internal').Component>} mounts The list of components\n * which have mounted\n * @param {Node | Text} oldDom The current attached DOM\n * element any new dom elements should be placed around. Likely `null` on first\n * render (except when hydrating). Can be a sibling DOM element when diffing\n * Fragments that have siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n */\nexport function diffChildren(parentDom, newParentVNode, oldParentVNode, context, isSvg, excessDomChildren, mounts, oldDom, isHydrating) {\n\tlet i, j, oldVNode, newDom, sibDom, firstChildDom, refs;\n\n\t// This is a compression of oldParentVNode!=null && oldParentVNode != EMPTY_OBJ && oldParentVNode._children || EMPTY_ARR\n\t// as EMPTY_OBJ._children should be `undefined`.\n\tlet oldChildren = (oldParentVNode && oldParentVNode._children) || EMPTY_ARR;\n\n\tlet oldChildrenLength = oldChildren.length;\n\n\t// Only in very specific places should this logic be invoked (top level `render` and `diffElementNodes`).\n\t// I'm using `EMPTY_OBJ` to signal when `diffChildren` is invoked in these situations. I can't use `null`\n\t// for this purpose, because `null` is a valid value for `oldDom` which can mean to skip to this logic\n\t// (e.g. if mounting a new tree in which the old DOM should be ignored (usually for Fragments).\n\tif (oldDom == EMPTY_OBJ) {\n\t\tif (excessDomChildren != null) {\n\t\t\toldDom = excessDomChildren[0];\n\t\t}\n\t\telse if (oldChildrenLength) {\n\t\t\toldDom = getDomSibling(oldParentVNode, 0);\n\t\t}\n\t\telse {\n\t\t\toldDom = null;\n\t\t}\n\t}\n\n\ti=0;\n\tnewParentVNode._children = toChildArray(newParentVNode._children, childVNode => {\n\n\t\tif (childVNode!=null) {\n\t\t\tchildVNode._parent = newParentVNode;\n\t\t\tchildVNode._depth = newParentVNode._depth + 1;\n\n\t\t\t// Check if we find a corresponding element in oldChildren.\n\t\t\t// If found, delete the array item by setting to `undefined`.\n\t\t\t// We use `undefined`, as `null` is reserved for empty placeholders\n\t\t\t// (holes).\n\t\t\toldVNode = oldChildren[i];\n\n\t\t\tif (oldVNode===null || (oldVNode && childVNode.key == oldVNode.key && childVNode.type === oldVNode.type)) {\n\t\t\t\toldChildren[i] = undefined;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Either oldVNode === undefined or oldChildrenLength > 0,\n\t\t\t\t// so after this loop oldVNode == null or oldVNode is a valid value.\n\t\t\t\tfor (j=0; j<oldChildrenLength; j++) {\n\t\t\t\t\toldVNode = oldChildren[j];\n\t\t\t\t\t// If childVNode is unkeyed, we only match similarly unkeyed nodes, otherwise we match by key.\n\t\t\t\t\t// We always match by type (in either case).\n\t\t\t\t\tif (oldVNode && childVNode.key == oldVNode.key && childVNode.type === oldVNode.type) {\n\t\t\t\t\t\toldChildren[j] = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\toldVNode = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toldVNode = oldVNode || EMPTY_OBJ;\n\n\t\t\t// Morph the old element into the new one, but don't append it to the dom yet\n\t\t\tnewDom = diff(parentDom, childVNode, oldVNode, context, isSvg, excessDomChildren, mounts, oldDom, isHydrating);\n\n\t\t\tif ((j = childVNode.ref) && oldVNode.ref != j) {\n\t\t\t\t(refs || (refs=[])).push(j, childVNode._component || newDom, childVNode);\n\t\t\t}\n\n\t\t\t// Only proceed if the vnode has not been unmounted by `diff()` above.\n\t\t\tif (newDom!=null) {\n\t\t\t\tif (firstChildDom == null) {\n\t\t\t\t\tfirstChildDom = newDom;\n\t\t\t\t}\n\n\t\t\t\tif (childVNode._lastDomChild != null) {\n\t\t\t\t\t// Only Fragments or components that return Fragment like VNodes will\n\t\t\t\t\t// have a non-null _lastDomChild. Continue the diff from the end of\n\t\t\t\t\t// this Fragment's DOM tree.\n\t\t\t\t\tnewDom = childVNode._lastDomChild;\n\n\t\t\t\t\t// Eagerly cleanup _lastDomChild. We don't need to persist the value because\n\t\t\t\t\t// it is only used by `diffChildren` to determine where to resume the diff after\n\t\t\t\t\t// diffing Components and Fragments.\n\t\t\t\t\tchildVNode._lastDomChild = null;\n\t\t\t\t}\n\t\t\t\telse if (excessDomChildren==oldVNode || newDom!=oldDom || newDom.parentNode==null) {\n\t\t\t\t\t// NOTE: excessDomChildren==oldVNode above:\n\t\t\t\t\t// This is a compression of excessDomChildren==null && oldVNode==null!\n\t\t\t\t\t// The values only have the same type when `null`.\n\n\t\t\t\t\touter: if (oldDom==null || oldDom.parentNode!==parentDom) {\n\t\t\t\t\t\tparentDom.appendChild(newDom);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// `j<oldChildrenLength; j+=2` is an alternative to `j++<oldChildrenLength/2`\n\t\t\t\t\t\tfor (sibDom=oldDom, j=0; (sibDom=sibDom.nextSibling) && j<oldChildrenLength; j+=2) {\n\t\t\t\t\t\t\tif (sibDom==newDom) {\n\t\t\t\t\t\t\t\tbreak outer;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparentDom.insertBefore(newDom, oldDom);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Browsers will infer an option's `value` from `textContent` when\n\t\t\t\t\t// no value is present. This essentially bypasses our code to set it\n\t\t\t\t\t// later in `diff()`. It works fine in all browsers except for IE11\n\t\t\t\t\t// where it breaks setting `select.value`. There it will be always set\n\t\t\t\t\t// to an empty string. Re-applying an options value will fix that, so\n\t\t\t\t\t// there are probably some internal data structures that aren't\n\t\t\t\t\t// updated properly.\n\t\t\t\t\t//\n\t\t\t\t\t// To fix it we make sure to reset the inferred value, so that our own\n\t\t\t\t\t// value check in `diff()` won't be skipped.\n\t\t\t\t\tif (newParentVNode.type == 'option') {\n\t\t\t\t\t\tparentDom.value = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldDom = newDom.nextSibling;\n\n\t\t\t\tif (typeof newParentVNode.type == 'function') {\n\t\t\t\t\t// At this point, if childVNode._lastDomChild existed, then\n\t\t\t\t\t// newDom = childVNode._lastDomChild per line 101. Else it is\n\t\t\t\t\t// the same as childVNode._dom, meaning this component returned\n\t\t\t\t\t// only a single DOM node\n\t\t\t\t\tnewParentVNode._lastDomChild = newDom;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ti++;\n\t\treturn childVNode;\n\t});\n\n\tnewParentVNode._dom = firstChildDom;\n\n\t// Remove children that are not part of any vnode.\n\tif (excessDomChildren!=null && typeof newParentVNode.type !== 'function') for (i=excessDomChildren.length; i--; ) if (excessDomChildren[i]!=null) removeNode(excessDomChildren[i]);\n\n\t// Remove remaining oldChildren if there are any.\n\tfor (i=oldChildrenLength; i--; ) if (oldChildren[i]!=null) unmount(oldChildren[i], oldChildren[i]);\n\n\t// Set refs only after unmount\n\tif (refs) {\n\t\tfor (i = 0; i < refs.length; i++) {\n\t\t\tapplyRef(refs[i], refs[++i], refs[++i]);\n\t\t}\n\t}\n}\n\n/**\n * Flatten and loop through the children of a virtual node\n * @param {import('../index').ComponentChildren} children The unflattened\n * children of a virtual node\n * @param {(vnode: import('../internal').VNode) => import('../internal').VNode} [callback]\n * A function to invoke for each child before it is added to the flattened list.\n * @param {import('../internal').VNode[]} [flattened] An flat array of children to modify\n * @returns {import('../internal').VNode[]}\n */\nexport function toChildArray(children, callback, flattened) {\n\tif (flattened == null) flattened = [];\n\n\tif (children==null || typeof children === 'boolean') {\n\t\tif (callback) flattened.push(callback(null));\n\t}\n\telse if (Array.isArray(children)) {\n\t\tfor (let i=0; i < children.length; i++) {\n\t\t\ttoChildArray(children[i], callback, flattened);\n\t\t}\n\t}\n\telse {\n\t\tflattened.push(callback ? callback(coerceToVNode(children)) : children);\n\t}\n\n\treturn flattened;\n}\n", "import { IS_NON_DIMENSIONAL } from '../constants';\nimport options from '../options';\n\n/**\n * Diff the old and new properties of a VNode and apply changes to the DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to apply\n * changes to\n * @param {object} newProps The new props\n * @param {object} oldProps The old props\n * @param {boolean} isSvg Whether or not this node is an SVG node\n * @param {boolean} hydrate Whether or not we are in hydration mode\n */\nexport function diffProps(dom, newProps, oldProps, isSvg, hydrate) {\n\tlet i;\n\n\tfor (i in oldProps) {\n\t\tif (!(i in newProps)) {\n\t\t\tsetProperty(dom, i, null, oldProps[i], isSvg);\n\t\t}\n\t}\n\n\tfor (i in newProps) {\n\t\tif ((!hydrate || typeof newProps[i]=='function') && i!=='value' && i!=='checked' && oldProps[i]!==newProps[i]) {\n\t\t\tsetProperty(dom, i, newProps[i], oldProps[i], isSvg);\n\t\t}\n\t}\n}\n\nfunction setStyle(style, key, value) {\n\tif (key[0] === '-') {\n\t\tstyle.setProperty(key, value);\n\t}\n\telse {\n\t\tstyle[key] = typeof value==='number' && IS_NON_DIMENSIONAL.test(key)===false ? value+'px' : value==null ? '' : value;\n\t}\n}\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {boolean} isSvg Whether or not this DOM node is an SVG node or not\n */\nfunction setProperty(dom, name, value, oldValue, isSvg) {\n\tname = isSvg ? (name==='className' ? 'class' : name) : (name==='class' ? 'className' : name);\n\n\tif (name==='key' || name === 'children') {}\n\telse if (name==='style') {\n\t\tconst s = dom.style;\n\n\t\tif (typeof value==='string') {\n\t\t\ts.cssText = value;\n\t\t}\n\t\telse {\n\t\t\tif (typeof oldValue==='string') {\n\t\t\t\ts.cssText = '';\n\t\t\t\toldValue = null;\n\t\t\t}\n\n\t\t\tif (oldValue) for (let i in oldValue) {\n\t\t\t\tif (!(value && i in value)) {\n\t\t\t\t\tsetStyle(s, i, '');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) for (let i in value) {\n\t\t\t\tif (!oldValue || value[i] !== oldValue[i]) {\n\t\t\t\t\tsetStyle(s, i, value[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0]==='o' && name[1]==='n') {\n\t\tlet useCapture = name !== (name=name.replace(/Capture$/, ''));\n\t\tlet nameLower = name.toLowerCase();\n\t\tname = (nameLower in dom ? nameLower : name).slice(2);\n\n\t\tif (value) {\n\t\t\tif (!oldValue) dom.addEventListener(name, eventProxy, useCapture);\n\t\t\t(dom._listeners || (dom._listeners = {}))[name] = value;\n\t\t}\n\t\telse {\n\t\t\tdom.removeEventListener(name, eventProxy, useCapture);\n\t\t}\n\t}\n\telse if (\n\t\tname!=='list'\n\t\t&& name!=='tagName'\n\t\t// HTMLButtonElement.form and HTMLInputElement.form are read-only but can be set using\n\t\t// setAttribute\n\t\t&& name!=='form'\n\t\t&& !isSvg\n\t\t&& (name in dom)\n\t) {\n\t\tdom[name] = value==null ? '' : value;\n\t}\n\telse if (typeof value!=='function' && name!=='dangerouslySetInnerHTML') {\n\t\tif (name!==(name = name.replace(/^xlink:?/, ''))) {\n\t\t\tif (value==null || value===false) {\n\t\t\t\tdom.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);\n\t\t\t}\n\t\t}\n\t\telse if (value==null || value===false) {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t\telse {\n\t\t\tdom.setAttribute(name, value);\n\t\t}\n\t}\n}\n\n/**\n * Proxy an event to hooked event handlers\n * @param {Event} e The event object from the browser\n * @private\n */\nfunction eventProxy(e) {\n\treturn this._listeners[e.type](options.event ? options.event(e) : e);\n}\n", "import { EMPTY_OBJ, EMPTY_ARR } from '../constants';\nimport { Component, enqueueRender } from '../component';\nimport { Fragment } from '../create-element';\nimport { diffChildren, toChildArray } from './children';\nimport { diffProps } from './props';\nimport { assign, removeNode } from '../util';\nimport options from '../options';\n\n/**\n * Diff two virtual nodes and apply proper changes to the DOM\n * @param {import('../internal').PreactElement} parentDom The parent of the DOM element\n * @param {import('../internal').VNode} newVNode The new virtual node\n * @param {import('../internal').VNode} oldVNode The old virtual node\n * @param {object} context The current context object\n * @param {boolean} isSvg Whether or not this element is an SVG node\n * @param {Array<import('../internal').PreactElement>} excessDomChildren\n * @param {Array<import('../internal').Component>} mounts A list of newly\n * mounted components\n * @param {Element | Text} oldDom The current attached DOM\n * element any new dom elements should be placed around. Likely `null` on first\n * render (except when hydrating). Can be a sibling DOM element when diffing\n * Fragments that have siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n */\nexport function diff(parentDom, newVNode, oldVNode, context, isSvg, excessDomChildren, mounts, oldDom, isHydrating) {\n\tlet tmp, newType = newVNode.type;\n\n\t// When passing through createElement it assigns the object\n\t// constructor as undefined. This to prevent JSON-injection.\n\tif (newVNode.constructor !== undefined) return null;\n\n\tif (tmp = options._diff) tmp(newVNode);\n\n\ttry {\n\t\touter: if (typeof newType==='function') {\n\t\t\tlet c, isNew, oldProps, oldState, snapshot, clearProcessingException;\n\t\t\tlet newProps = newVNode.props;\n\n\t\t\t// Necessary for createContext api. Setting this property will pass\n\t\t\t// the context value as `this.context` just for this component.\n\t\t\ttmp = newType.contextType;\n\t\t\tlet provider = tmp && context[tmp._id];\n\t\t\tlet cctx = tmp ? (provider ? provider.props.value : tmp._defaultValue) : context;\n\n\t\t\t// Get component and set it to `c`\n\t\t\tif (oldVNode._component) {\n\t\t\t\tc = newVNode._component = oldVNode._component;\n\t\t\t\tclearProcessingException = c._processingException = c._pendingError;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Instantiate the new component\n\t\t\t\tif ('prototype' in newType && newType.prototype.render) {\n\t\t\t\t\tnewVNode._component = c = new newType(newProps, cctx); // eslint-disable-line new-cap\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnewVNode._component = c = new Component(newProps, cctx);\n\t\t\t\t\tc.constructor = newType;\n\t\t\t\t\tc.render = doRender;\n\t\t\t\t}\n\t\t\t\tif (provider) provider.sub(c);\n\n\t\t\t\tc.props = newProps;\n\t\t\t\tif (!c.state) c.state = {};\n\t\t\t\tc.context = cctx;\n\t\t\t\tc._context = context;\n\t\t\t\tisNew = c._dirty = true;\n\t\t\t\tc._renderCallbacks = [];\n\t\t\t}\n\n\t\t\t// Invoke getDerivedStateFromProps\n\t\t\tif (c._nextState==null) {\n\t\t\t\tc._nextState = c.state;\n\t\t\t}\n\t\t\tif (newType.getDerivedStateFromProps!=null) {\n\t\t\t\tassign(c._nextState==c.state ? (c._nextState = assign({}, c._nextState)) : c._nextState, newType.getDerivedStateFromProps(newProps, c._nextState));\n\t\t\t}\n\n\t\t\t// Invoke pre-render lifecycle methods\n\t\t\tif (isNew) {\n\t\t\t\tif (newType.getDerivedStateFromProps==null && c.componentWillMount!=null) c.componentWillMount();\n\t\t\t\tif (c.componentDidMount!=null) mounts.push(c);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (newType.getDerivedStateFromProps==null && c._force==null && c.componentWillReceiveProps!=null) {\n\t\t\t\t\tc.componentWillReceiveProps(newProps, cctx);\n\t\t\t\t}\n\n\t\t\t\tif (!c._force && c.shouldComponentUpdate!=null && c.shouldComponentUpdate(newProps, c._nextState, cctx)===false) {\n\t\t\t\t\tc.props = newProps;\n\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t\tc._dirty = false;\n\t\t\t\t\tc._vnode = newVNode;\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t\tfor (tmp = 0; tmp < newVNode._children.length; tmp++) {\n\t\t\t\t\t\tif (newVNode._children[tmp]) newVNode._children[tmp]._parent = newVNode;\n\t\t\t\t\t}\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\n\t\t\t\tif (c.componentWillUpdate!=null) {\n\t\t\t\t\tc.componentWillUpdate(newProps, c._nextState, cctx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toldProps = c.props;\n\t\t\toldState = c.state;\n\n\t\t\tc.context = cctx;\n\t\t\tc.props = newProps;\n\t\t\tc.state = c._nextState;\n\n\t\t\tif (tmp = options._render) tmp(newVNode);\n\n\t\t\tc._dirty = false;\n\t\t\tc._vnode = newVNode;\n\t\t\tc._parentDom = parentDom;\n\n\t\t\ttmp = c.render(c.props, c.state, c.context);\n\t\t\tlet isTopLevelFragment = tmp != null && tmp.type == Fragment && tmp.key == null;\n\t\t\tnewVNode._children = toChildArray(isTopLevelFragment ? tmp.props.children : tmp);\n\n\t\t\tif (c.getChildContext!=null) {\n\t\t\t\tcontext = assign(assign({}, context), c.getChildContext());\n\t\t\t}\n\n\t\t\tif (!isNew && c.getSnapshotBeforeUpdate!=null) {\n\t\t\t\tsnapshot = c.getSnapshotBeforeUpdate(oldProps, oldState);\n\t\t\t}\n\n\t\t\tdiffChildren(parentDom, newVNode, oldVNode, context, isSvg, excessDomChildren, mounts, oldDom, isHydrating);\n\n\t\t\tc.base = newVNode._dom;\n\n\t\t\ttmp = c._renderCallbacks;\n\t\t\tc._renderCallbacks=[];\n\t\t\ttmp.some(cb => { cb.call(c); });\n\n\t\t\t// Don't call componentDidUpdate on mount or when we bailed out via\n\t\t\t// `shouldComponentUpdate`\n\t\t\tif (!isNew && oldProps!=null && c.componentDidUpdate!=null) {\n\t\t\t\tc.componentDidUpdate(oldProps, oldState, snapshot);\n\t\t\t}\n\n\t\t\tif (clearProcessingException) {\n\t\t\t\tc._pendingError = c._processingException = null;\n\t\t\t}\n\n\t\t\tc._force = null;\n\t\t}\n\t\telse {\n\t\t\tnewVNode._dom = diffElementNodes(oldVNode._dom, newVNode, oldVNode, context, isSvg, excessDomChildren, mounts, isHydrating);\n\t\t}\n\n\t\tif (tmp = options.diffed) tmp(newVNode);\n\t}\n\tcatch (e) {\n\t\toptions._catchError(e, newVNode, oldVNode);\n\t}\n\n\treturn newVNode._dom;\n}\n\nexport function commitRoot(mounts, root) {\n\tlet c;\n\twhile ((c = mounts.pop())) {\n\t\ttry {\n\t\t\tc.componentDidMount();\n\t\t}\n\t\tcatch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t}\n\n\tif (options._commit) options._commit(root);\n}\n\n/**\n * Diff two virtual nodes representing DOM element\n * @param {import('../internal').PreactElement} dom The DOM element representing\n * the virtual nodes being diffed\n * @param {import('../internal').VNode} newVNode The new virtual node\n * @param {import('../internal').VNode} oldVNode The old virtual node\n * @param {object} context The current context object\n * @param {boolean} isSvg Whether or not this DOM node is an SVG node\n * @param {*} excessDomChildren\n * @param {Array<import('../internal').Component>} mounts An array of newly\n * mounted components\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @returns {import('../internal').PreactElement}\n */\nfunction diffElementNodes(dom, newVNode, oldVNode, context, isSvg, excessDomChildren, mounts, isHydrating) {\n\tlet i;\n\tlet oldProps = oldVNode.props;\n\tlet newProps = newVNode.props;\n\n\t// Tracks entering and exiting SVG namespace when descending through the tree.\n\tisSvg = newVNode.type==='svg' || isSvg;\n\n\tif (dom==null && excessDomChildren!=null) {\n\t\tfor (i=0; i<excessDomChildren.length; i++) {\n\t\t\tconst child = excessDomChildren[i];\n\n\t\t\tif (child!=null && (newVNode.type===null ? child.nodeType===3 : child.localName===newVNode.type)) {\n\t\t\t\tdom = child;\n\t\t\t\texcessDomChildren[i] = null;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (dom==null) {\n\t\tif (newVNode.type===null) {\n\t\t\treturn document.createTextNode(newProps);\n\t\t}\n\t\tdom = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', newVNode.type) : document.createElement(newVNode.type);\n\t\t// we created a new parent, so none of the previously attached children can be reused:\n\t\texcessDomChildren = null;\n\t}\n\n\tif (newVNode.type===null) {\n\t\tif (excessDomChildren!=null) excessDomChildren[excessDomChildren.indexOf(dom)] = null;\n\t\tif (oldProps !== newProps) {\n\t\t\tdom.data = newProps;\n\t\t}\n\t}\n\telse if (newVNode!==oldVNode) {\n\t\tif (excessDomChildren!=null) {\n\t\t\texcessDomChildren = EMPTY_ARR.slice.call(dom.childNodes);\n\t\t}\n\n\t\toldProps = oldVNode.props || EMPTY_OBJ;\n\n\t\tlet oldHtml = oldProps.dangerouslySetInnerHTML;\n\t\tlet newHtml = newProps.dangerouslySetInnerHTML;\n\n\t\t// During hydration, props are not diffed at all (including dangerouslySetInnerHTML)\n\t\t// @TODO we should warn in debug mode when props don't match here.\n\t\tif (!isHydrating) {\n\t\t\tif (oldProps === EMPTY_OBJ) {\n\t\t\t\toldProps = {};\n\t\t\t\tfor (let i=0; i<dom.attributes.length; i++) {\n\t\t\t\t\toldProps[dom.attributes[i].name] = dom.attributes[i].value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newHtml || oldHtml) {\n\t\t\t\t// Avoid re-applying the same '__html' if it did not changed between re-render\n\t\t\t\tif (!newHtml || !oldHtml || newHtml.__html!=oldHtml.__html) {\n\t\t\t\t\tdom.innerHTML = newHtml && newHtml.__html || '';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdiffProps(dom, newProps, oldProps, isSvg, isHydrating);\n\n\t\tnewVNode._children = newVNode.props.children;\n\n\t\t// If the new vnode didn't have dangerouslySetInnerHTML, diff its children\n\t\tif (!newHtml) {\n\t\t\tdiffChildren(dom, newVNode, oldVNode, context, newVNode.type==='foreignObject' ? false : isSvg, excessDomChildren, mounts, EMPTY_OBJ, isHydrating);\n\t\t}\n\n\t\t// (as above, don't diff props during hydration)\n\t\tif (!isHydrating) {\n\t\t\tif (('value' in newProps) && newProps.value!==undefined && newProps.value !== dom.value) dom.value = newProps.value==null ? '' : newProps.value;\n\t\t\tif (('checked' in newProps) && newProps.checked!==undefined && newProps.checked !== dom.checked) dom.checked = newProps.checked;\n\t\t}\n\t}\n\n\treturn dom;\n}\n\n/**\n * Invoke or update a ref, depending on whether it is a function or object ref.\n * @param {object|function} ref\n * @param {any} value\n * @param {import('../internal').VNode} vnode\n */\nexport function applyRef(ref, value, vnode) {\n\ttry {\n\t\tif (typeof ref=='function') ref(value);\n\t\telse ref.current = value;\n\t}\n\tcatch (e) {\n\t\toptions._catchError(e, vnode);\n\t}\n}\n\n/**\n * Unmount a virtual node from the tree and apply DOM changes\n * @param {import('../internal').VNode} vnode The virtual node to unmount\n * @param {import('../internal').VNode} parentVNode The parent of the VNode that\n * initiated the unmount\n * @param {boolean} [skipRemove] Flag that indicates that a parent node of the\n * current element is already detached from the DOM.\n */\nexport function unmount(vnode, parentVNode, skipRemove) {\n\tlet r;\n\tif (options.unmount) options.unmount(vnode);\n\n\tif (r = vnode.ref) {\n\t\tapplyRef(r, null, parentVNode);\n\t}\n\n\tlet dom;\n\tif (!skipRemove && typeof vnode.type !== 'function') {\n\t\tskipRemove = (dom = vnode._dom)!=null;\n\t}\n\n\tvnode._dom = vnode._lastDomChild = null;\n\n\tif ((r = vnode._component)!=null) {\n\t\tif (r.componentWillUnmount) {\n\t\t\ttry {\n\t\t\t\tr.componentWillUnmount();\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\toptions._catchError(e, parentVNode);\n\t\t\t}\n\t\t}\n\n\t\tr.base = r._parentDom = null;\n\t}\n\n\tif (r = vnode._children) {\n\t\tfor (let i = 0; i < r.length; i++) {\n\t\t\tif (r[i]) unmount(r[i], parentVNode, skipRemove);\n\t\t}\n\t}\n\n\tif (dom!=null) removeNode(dom);\n}\n\n/** The `.render()` method for a PFC backing instance. */\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n\n/**\n * Find the closest error boundary to a thrown error and call it\n * @param {object} error The thrown value\n * @param {import('../internal').VNode} vnode The vnode that threw\n * the error that was caught (except for unmounting when this parameter\n * is the highest parent that was being unmounted)\n * @param {import('../internal').VNode} oldVNode The oldVNode of the vnode\n * that threw, if this VNode threw while diffing\n */\n(options)._catchError = function (error, vnode, oldVNode) {\n\n\t/** @type {import('../internal').Component} */\n\tlet component;\n\n\tfor (; vnode = vnode._parent;) {\n\t\tif ((component = vnode._component) && !component._processingException) {\n\t\t\ttry {\n\t\t\t\tif (component.constructor && component.constructor.getDerivedStateFromError!=null) {\n\t\t\t\t\tcomponent.setState(component.constructor.getDerivedStateFromError(error));\n\t\t\t\t}\n\t\t\t\telse if (component.componentDidCatch!=null) {\n\t\t\t\t\tcomponent.componentDidCatch(error);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturn enqueueRender(component._pendingError = component);\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\t}\n\n\tthrow error;\n};\n", "import { assign } from './util';\nimport { EMPTY_ARR } from './constants';\nimport { createVNode } from './create-element';\n\n/**\n * Clones the given VNode, optionally adding attributes/props and replacing its children.\n * @param {import('./internal').VNode} vnode The virtual DOM element to clone\n * @param {object} props Attributes/props to add when cloning\n * @param {Array<import('./index').ComponentChildren>} rest Any additional arguments will be used as replacement children.\n */\nexport function cloneElement(vnode, props) {\n\tprops = assign(assign({}, vnode.props), props);\n\tif (arguments.length>2) props.children = EMPTY_ARR.slice.call(arguments, 2);\n\treturn createVNode(vnode.type, props, props.key || vnode.key, props.ref || vnode.ref);\n}\n", "import { options } from 'preact';\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\nlet oldBeforeRender = options._render;\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tif (currentComponent.__hooks) {\n\t\tcurrentComponent.__hooks._pendingEffects = handleEffects(currentComponent.__hooks._pendingEffects);\n\t}\n};\n\nlet oldAfterDiff = options.diffed;\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (!c) return;\n\n\tconst hooks = c.__hooks;\n\tif (hooks) {\n\t\thooks._handles = bindHandles(hooks._handles);\n\t\thooks._pendingLayoutEffects = handleEffects(hooks._pendingLayoutEffects);\n\t}\n};\n\n\nlet oldBeforeUnmount = options.unmount;\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (!c) return;\n\n\tconst hooks = c.__hooks;\n\tif (hooks) {\n\t\thooks._list.forEach(hook => hook._cleanup && hook._cleanup());\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @returns {import('./internal').HookState}\n */\nfunction getHookState(index) {\n\tif (options._hook) options._hook(currentComponent);\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks = currentComponent.__hooks || (currentComponent.__hooks = { _list: [], _pendingEffects: [], _pendingLayoutEffects: [], _handles: [] });\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\treturn hooks._list[index];\n}\n\nexport function useState(initialState) {\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\nexport function useReducer(reducer, initialState, init) {\n\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++);\n\tif (!hookState._component) {\n\t\thookState._component = currentComponent;\n\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst nextValue = reducer(hookState._value[0], action);\n\t\t\t\tif (hookState._value[0]!==nextValue) {\n\t\t\t\t\thookState._value[0] = nextValue;\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\t}\n\n\treturn hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useEffect(callback, args) {\n\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t\tafterPaint(currentComponent);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {any[]} args\n */\nexport function useLayoutEffect(callback, args) {\n\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._args = args;\n\t\tcurrentComponent.__hooks._pendingLayoutEffects.push(state);\n\t}\n}\n\nexport function useRef(initialValue) {\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\nexport function useImperativeHandle(ref, createHandle, args) {\n\tconst state = getHookState(currentIndex++);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._args = args;\n\t\tcurrentComponent.__hooks._handles.push({ ref, createHandle });\n\t}\n}\n\nfunction bindHandles(handles) {\n\thandles.some(handle => {\n\t\tif (handle.ref) handle.ref.current = handle.createHandle();\n\t});\n\treturn [];\n}\n\n/**\n * @param {() => any} callback\n * @param {any[]} args\n */\nexport function useMemo(callback, args) {\n\n\t/** @type {import('./internal').MemoHookState} */\n\tconst state = getHookState(currentIndex++);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._args = args;\n\t\tstate._callback = callback;\n\t\treturn state._value = callback();\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {any[]} args\n */\nexport function useCallback(callback, args) {\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\tif (!provider) return context._defaultValue;\n\tconst state = getHookState(currentIndex++);\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(formatter ? formatter(value) : value);\n\t}\n}\n\n// Note: if someone used Component.debounce = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Invoke a component's pending effects after the next frame renders\n * @type {(component: import('./internal').Component) => void}\n */\n/* istanbul ignore next */\nlet afterPaint = () => {};\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tafterPaintEffects.some(component => {\n\t\tcomponent._afterPaintQueued = false;\n\t\tif (component._parentDom) {\n\t\t\tcomponent.__hooks._pendingEffects = handleEffects(component.__hooks._pendingEffects);\n\t\t}\n\t});\n\tafterPaintEffects = [];\n}\n\nconst RAF_TIMEOUT = 100;\n\n/**\n * requestAnimationFrame with a timeout in case it doesn't fire (for example if the browser tab is not visible)\n */\nfunction safeRaf(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tcancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\tconst raf = requestAnimationFrame(done);\n}\n\n/* istanbul ignore else */\nif (typeof window !== 'undefined') {\n\tlet prevRaf = options.requestAnimationFrame;\n\tafterPaint = (component) => {\n\t\tif ((!component._afterPaintQueued && (component._afterPaintQueued = true) && afterPaintEffects.push(component) === 1) ||\n\t\t prevRaf !== options.requestAnimationFrame) {\n\t\t\tprevRaf = options.requestAnimationFrame;\n\n\t\t\t/* istanbul ignore next */\n\t\t\t(options.requestAnimationFrame || safeRaf)(flushAfterPaintEffects);\n\t\t}\n\t};\n}\n\nfunction handleEffects(effects) {\n\teffects.forEach(invokeCleanup);\n\teffects.forEach(invokeEffect);\n\treturn [];\n}\n\nfunction invokeCleanup(hook) {\n\tif (hook._cleanup) hook._cleanup();\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n */\nfunction invokeEffect(hook) {\n\tconst result = hook._value();\n\tif (typeof result === 'function') hook._cleanup = result;\n}\n\nfunction argsChanged(oldArgs, newArgs) {\n\treturn !oldArgs || newArgs.some((arg, index) => arg !== oldArgs[index]);\n}\n\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f === 'function' ? f(arg) : f;\n}\n", "function toVal(mix) {\n\tvar k, y, str='';\n\tif (mix) {\n\t\tif (typeof mix === 'object') {\n\t\t\tif (!!mix.push) {\n\t\t\t\tfor (k=0; k < mix.length; k++) {\n\t\t\t\t\tif (mix[k] && (y = toVal(mix[k]))) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (k in mix) {\n\t\t\t\t\tif (mix[k] && (y = toVal(k))) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof mix !== 'boolean' && !mix.call) {\n\t\t\tstr && (str += ' ');\n\t\t\tstr += mix;\n\t\t}\n\t}\n\treturn str;\n}\n\nexport default function () {\n\tvar i=0, x, str='';\n\twhile (i < arguments.length) {\n\t\tif (x = toVal(arguments[i++])) {\n\t\t\tstr && (str += ' ');\n\t\t\tstr += x\n\t\t}\n\t}\n\treturn str;\n}\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport clsx from 'clsx';\nimport './loading-spinner.css';\n\n// @ts-ignore - tsc doesn't understand bundlers :)\nconst SVG_PATH = require('./loading-spinner.svg');\n\nconst LoadingSpinner_ = () => {\n return <img src={SVG_PATH} alt=\"Loading spinner\" />;\n};\n\n/** @param {{solo?: boolean}} props */\nexport const LoadingSpinner = props => {\n return (\n <div\n className={clsx('loading-spinner', {\n 'loading-spinner--container': !props.solo,\n })}\n >\n <LoadingSpinner_ />\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport clsx from 'clsx';\nimport './paper.css';\n\n/** @param {{children: string|JSX.Element|JSX.Element[], className?: string, key?: any}} props */\nexport const Paper = props => {\n const {children} = props;\n return <div className={clsx('paper', props.className)}>{children}</div>;\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport clsx from 'clsx';\nimport {useState} from 'preact/hooks';\nimport './lhr-viewer-link.css';\n\n/** @typedef {LH.Result|(() => Promise<LH.Result>)} LHResolver */\n\n/** @param {LH.Result} lhr */\nexport function openLhrInClassicViewer(lhr) {\n // Allows for self-hosted viewer uri instead of linking externally\n const VIEWER_ORIGIN = process.env.VIEWER_ORIGIN || 'https://googlechrome.github.io';\n // Chrome doesn't allow us to immediately postMessage to a popup right\n // after it's created. Normally, we could also listen for the popup window's\n // load event, however it is cross-domain and won't fire. Instead, listen\n // for a message from the target app saying \"I'm open\".\n window.addEventListener('message', function msgHandler(messageEvent) {\n if (messageEvent.origin !== VIEWER_ORIGIN) {\n return;\n }\n // https://github.com/GoogleChrome/lighthouse/blob/35f1a6f90e9443bdf42179a4c9823e6d4848a9e6/lighthouse-viewer/app/src/lighthouse-report-viewer.js#L415-L418\n if (popup && messageEvent.data.opened) {\n popup.postMessage({lhresults: lhr}, VIEWER_ORIGIN);\n window.removeEventListener('message', msgHandler);\n }\n });\n\n // The popup's window.name is keyed by version+url+fetchTime, so we reuse/select tabs correctly\n const fetchTime = lhr.fetchTime;\n const windowName = `${lhr.lighthouseVersion}-${lhr.requestedUrl}-${fetchTime}`;\n const popup = window.open(`${VIEWER_ORIGIN}/lighthouse/viewer`, windowName);\n}\n\n/** @param {{children: string|JSX.Element|JSX.Element[], lhr: LHResolver, className?: string}} props */\nexport const LhrViewerLink = props => {\n const {children, lhr: lhrOrResolver} = props;\n const [isLoading, setIsLoading] = useState(false);\n\n return (\n <span\n className={clsx('lhr-viewer-link', props.className, {\n 'lhr-viewer-link--loading': isLoading,\n })}\n onClick={async evt => {\n evt.preventDefault();\n evt.stopImmediatePropagation();\n if (isLoading) return;\n\n if (typeof lhrOrResolver === 'object') return openLhrInClassicViewer(lhrOrResolver);\n\n setIsLoading(true);\n const lhr = await lhrOrResolver();\n setIsLoading(false);\n openLhrInClassicViewer(lhr);\n }}\n >\n {children}\n </span>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport {LhrViewerLink} from './lhr-viewer-link';\nimport './lhr-viewer-button.css';\n\n// @ts-ignore - ts doesn't know how bundlers work :)\nconst LH_ICON_PATH = require('../favicon.svg');\n\n/** @param {{lhr: import('./lhr-viewer-link').LHResolver, label?: string}} props */\nexport const LhrViewerButton = props => {\n const {lhr, label = 'Open Report'} = props;\n return (\n <LhrViewerLink lhr={lhr}>\n <div className=\"lhr-viewer-button\" role=\"button\">\n <img src={LH_ICON_PATH} /> <span>{label}</span>\n </div>\n </LhrViewerLink>\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nexport {LoadingSpinner} from '../../../../server/src/ui/components/loading-spinner.jsx';\nexport {Paper} from '../../../../server/src/ui/components/paper.jsx';\nexport {LhrViewerButton} from '../../../../server/src/ui/components/lhr-viewer-button.jsx';\n\n/** @type {string} */\n// @ts-expect-error - tsc doesn't get parcel :)\nexport const CONFETTI_PATH = require('../../../../server/src/ui/routes/project-list/confetti.svg');\n\n/** @type {string} */\n// @ts-expect-error - tsc doesn't get parcel :)\nexport const LH_LOGO_PATH = require('../../../../server/src/ui/logo.svg');\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport './report-upload-box.css';\nimport {LhrViewerButton} from './lhci-components';\nimport {useState, useEffect, useRef} from 'preact/hooks';\nimport clsx from 'clsx';\n\n/** @typedef {import('../app.jsx').ToastMessage} ToastMessage */\n/** @typedef {import('../app.jsx').ReportData} ReportData */\n/** @typedef {'filename'|'hostname'|'pathname'|'path'|'timestamp-hostname'|'timestamp-pathname'} DisplayType */\n/** @typedef {{variant: 'base'|'compare', displayType: DisplayType, report: ReportData|undefined, setReport: (d: ReportData) => void, addToast: (t: ToastMessage) => void, showOpenLhrLink?: boolean, dragTarget?: 'self' | 'document'}} ReportUploadBoxProps */\n/** @typedef {HTMLElement|undefined} DragData */\n\n/** @param {string} s @return {LH.Result|Error} */\nexport function parseStringAsLhr(s) {\n if (s.includes('<script>window.__LIGHTHOUSE_JSON__ = ')) {\n const match = s.match(/window\\.__LIGHTHOUSE_JSON__ = (.*?});<\\/script>/);\n if (match) s = match[1];\n }\n\n if (s.trim().charAt(0) === '{') {\n try {\n const lhr = JSON.parse(s);\n if (lhr.lighthouseVersion) return lhr;\n return new Error(`JSON did not contain a lighthouseVersion`);\n } catch (err) {\n return new Error(`File was not valid JSON (${err.message})`);\n }\n }\n\n return new Error('File was not a valid report');\n}\n\n/** @param {LH.Result} lhrA @param {LH.Result} lhrB @return {DisplayType} */\nexport function computeBestDisplayType(lhrA, lhrB) {\n const urlA = new URL(lhrA.finalUrl);\n const urlB = new URL(lhrB.finalUrl);\n if (urlA.hostname !== urlB.hostname) return 'hostname';\n if (urlA.pathname !== urlB.pathname) return 'pathname';\n if (urlA.search !== urlB.search) return 'path';\n if (urlA.pathname.length < 5) return 'timestamp-hostname';\n return 'timestamp-pathname';\n}\n\n/** @param {{report: ReportData, displayType: DisplayType}} props */\nconst FilePill = props => {\n const {filename, lhr} = props.report;\n const url = new URL(lhr.finalUrl);\n const timestamp = new Date(lhr.fetchTime).toLocaleString();\n const options = {\n filename,\n hostname: url.hostname,\n pathname: url.pathname,\n path: `${url.pathname}${url.search}`,\n 'timestamp-hostname': `${timestamp} (${url.hostname})`,\n 'timestamp-pathname': `${timestamp} (${url.pathname})`,\n };\n\n const tooltip = `${url.href} at ${timestamp}`;\n return <span title={tooltip}>{options[props.displayType]}</span>;\n};\n\n/** @param {Pick<ReportUploadBoxProps, 'addToast'|'setReport'>} props @param {FileList} fileList */\nfunction handleFileInput(props, fileList) {\n const filename = fileList[0].name;\n const reader = new FileReader();\n reader.readAsText(fileList[0], 'utf-8');\n\n reader.addEventListener('load', () => {\n if (typeof reader.result !== 'string') {\n props.addToast({message: 'File was not readable as text!', level: 'error'});\n return;\n }\n\n const lhr = parseStringAsLhr(reader.result);\n if (lhr instanceof Error) {\n props.addToast({message: `Invalid file: ${lhr.message}`, level: 'error'});\n return;\n }\n\n props.setReport({filename, data: reader.result, lhr});\n });\n\n reader.addEventListener('error', () => {\n props.addToast({message: 'File was not readable!', level: 'error'});\n });\n}\n\n/** @param {ReportUploadBoxProps} props @param {import('preact/hooks').Ref<DragData>} dragTargetRef @param {(b: boolean) => void} setIsDragging @param {Event} e */\nfunction handleDragEnter(props, dragTargetRef, setIsDragging, e) {\n if (!(e.target instanceof HTMLElement)) return;\n e.stopPropagation();\n e.preventDefault();\n setIsDragging(true);\n dragTargetRef.current = e.target;\n}\n\n/** @param {ReportUploadBoxProps} props @param {import('preact/hooks').Ref<DragData>} dragTargetRef @param {(b: boolean) => void} setIsDragging @param {Event} e */\nfunction handleDragLeave(props, dragTargetRef, setIsDragging, e) {\n if (e.target !== dragTargetRef.current) return;\n e.stopPropagation();\n e.preventDefault();\n setIsDragging(false);\n dragTargetRef.current = undefined;\n}\n\n/** @param {ReportUploadBoxProps} props @param {import('preact/hooks').Ref<DragData>} dragTargetRef @param {(b: boolean) => void} setIsDragging @param {Event} e */\nfunction handleDragOver(props, dragTargetRef, setIsDragging, e) {\n if (!dragTargetRef.current) return;\n e.stopPropagation();\n e.preventDefault();\n}\n\n/** @param {Pick<ReportUploadBoxProps, 'addToast'|'setReport'>} props @param {import('preact/hooks').Ref<DragData>} dragTargetRef @param {(b: boolean) => void} setIsDragging @param {Event} e */\nfunction handleDrop(props, dragTargetRef, setIsDragging, e) {\n if (!dragTargetRef.current) return;\n if (!(e instanceof DragEvent)) return;\n if (!e.dataTransfer) return;\n e.stopPropagation();\n e.preventDefault();\n setIsDragging(false);\n dragTargetRef.current = undefined;\n handleFileInput(props, e.dataTransfer.files);\n}\n\n/** @param {ReportUploadBoxProps} props */\nexport const ReportUploadBox = props => {\n const [isDragging, setIsDragging] = useState(false);\n const dragTargetRef = useRef(/** @type {HTMLElement|undefined} */ (undefined));\n\n /** @param {Event} e */\n const onDragEnter = e => handleDragEnter(props, dragTargetRef, setIsDragging, e);\n /** @param {Event} e */\n const onDragLeave = e => handleDragLeave(props, dragTargetRef, setIsDragging, e);\n /** @param {Event} e */\n const onDragOver = e => handleDragOver(props, dragTargetRef, setIsDragging, e);\n /** @param {Event} e */\n const onDrop = e => handleDrop(props, dragTargetRef, setIsDragging, e);\n\n useEffect(() => {\n if (props.dragTarget !== 'document') return;\n\n document.addEventListener('dragenter', onDragEnter);\n document.addEventListener('dragleave', onDragLeave);\n document.addEventListener('dragover', onDragOver);\n document.addEventListener('drop', onDrop);\n\n return () => {\n document.removeEventListener('dragenter', onDragEnter);\n document.removeEventListener('dragleave', onDragLeave);\n document.removeEventListener('dragover', onDragOver);\n document.removeEventListener('drop', onDrop);\n };\n }, [props.dragTarget, props.addToast, props.setReport, dragTargetRef.current]);\n\n return (\n <div\n className={clsx(`report-upload-box report-upload-box--${props.variant}`, {\n 'report-upload-box--drop': isDragging,\n 'report-upload-box--document-target': props.dragTarget === 'document',\n })}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={onDragOver}\n onDrop={onDrop}\n >\n <div className=\"report-upload-box__drop-outline\">Drop your report to upload</div>\n <span className=\"report-upload-box__label\">\n {props.variant === 'base' ? 'Base' : 'Compare'}\n </span>\n <div className=\"report-upload-box__file\">\n {props.report ? (\n <FilePill report={props.report} displayType={props.displayType} />\n ) : (\n <Fragment />\n )}\n </div>\n <div className=\"report-upload-box__lhr-link\">\n {props.report && props.showOpenLhrLink ? (\n <LhrViewerButton lhr={props.report.lhr} label=\"View Report\" />\n ) : null}\n </div>\n <div className=\"report-upload-box__spacer\" />\n <label className=\"report-upload-box__upload\">\n Select file\n <input\n type=\"file\"\n style={{display: 'none'}}\n onChange={e => {\n const input = e.target;\n if (!(input instanceof HTMLInputElement)) return;\n const fileList = input.files;\n if (!fileList || fileList.length !== 1) return;\n handleFileInput(props, fileList);\n }}\n />\n </label>\n </div>\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport './landing.css';\nimport {CONFETTI_PATH, LH_LOGO_PATH, Paper} from '../../components/lhci-components.jsx';\nimport {ReportUploadBox} from '../../components/report-upload-box';\n\n/** @typedef {import('../../app.jsx').ToastMessage} ToastMessage */\n/** @typedef {import('../../app.jsx').ReportData} ReportData */\n\n/** @param {{baseReport?: ReportData, compareReport?: ReportData, setBaseReport: (d: ReportData) => void, setCompareReport: (d: ReportData) => void, addToast: (t: ToastMessage) => void}} props */\nexport const LandingRoute = props => {\n return (\n <div className=\"landing\">\n <div className=\"landing__background\">\n <img src={CONFETTI_PATH} alt=\"Lighthouse CI Background Image\" />\n </div>\n <Paper className=\"landing__paper\">\n <div className=\"landing__logos\">\n <img className=\"landing__logo\" src={LH_LOGO_PATH} alt=\"Lighthouse Logo\" />\n <img className=\"landing__logo landing__logo--diff\" src={LH_LOGO_PATH} alt=\"\" />\n <h1>Lighthouse Report Diff Tool</h1>\n </div>\n <p>Provide two Lighthouse reports to start comparing!</p>\n <p>\n <a href=\"./?baseReport=https://googlechrome.github.io/lighthouse-ci/packages/server/test/fixtures/lh-5-6-0-verge-a.json&compareReport=https://googlechrome.github.io/lighthouse-ci/packages/server/test/fixtures/lh-5-6-0-verge-b.json\">\n View example diff\n </a>\n </p>\n <div className=\"landing__upload\">\n <ReportUploadBox\n variant=\"base\"\n report={props.baseReport}\n setReport={props.setBaseReport}\n addToast={props.addToast}\n displayType=\"filename\"\n dragTarget={props.baseReport ? 'self' : 'document'}\n />\n <ReportUploadBox\n variant=\"compare\"\n report={props.compareReport}\n setReport={props.setCompareReport}\n addToast={props.addToast}\n displayType=\"filename\"\n dragTarget={props.baseReport ? 'document' : 'self'}\n />\n </div>\n <p>Above, drag 'n drop your JSON/HTML, or select the files from disk.</p>\n\n <footer>\n Powered by <a href=\"https://github.com/GoogleChrome/lighthouse-ci\">lighthouse-ci</a>\n </footer>\n </Paper>\n </div>\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport {useState, useEffect} from 'preact/hooks';\nimport clsx from 'clsx';\nimport _ from '@lhci/utils/src/lodash';\nimport {findAuditDiffs, getDiffSeverity} from '@lhci/utils/src/audit-diff-finder';\n\nimport {Dropdown} from '../../components/dropdown';\nimport {AuditDetailPane} from './audit-detail/audit-detail-pane';\nimport {LhrComparisonScores} from './lhr-comparison-scores';\nimport {AuditGroup} from './audit-list/audit-group';\nimport {LhrComparisonLegend} from './lhr-comparison-legend';\nimport {Paper} from '../../components/paper';\nimport {LhrViewerLink} from '../../components/lhr-viewer-link';\n\nimport './lhr-comparison.css';\nimport {Modal} from '../../components/modal';\nimport {LhrRuntimeDiff, computeRuntimeDiffs} from './lhr-comparison-runtime-diff';\n\n/** @typedef {{id: string, pairs: Array<LHCI.AuditPair>, group: {id: string, title: string}, showAsUnchanged: boolean}} AuditGroupDef */\n\n/** @param {(s: string) => void} setAuditId */\nfunction useAuditPermalinkScrollOnLoad(setAuditId) {\n /** @param {number} ms */\n const wait = ms => new Promise(r => setTimeout(r, ms));\n\n /** @param {string} selector */\n const waitUntilSelector = async selector => {\n let attempts = 0;\n while (!document.querySelector(selector) && attempts < 10) {\n await wait(500);\n attempts++;\n }\n };\n\n useEffect(() => {\n if (window.location.hash.length <= 1) return;\n\n Promise.resolve().then(async () => {\n await waitUntilSelector('.lhr-comparison__audit-groups');\n setAuditId(window.location.hash.slice(1));\n });\n }, []);\n}\n\n/**\n * @param {LH.Result} lhr\n * @param {LH.Result|undefined} baseLhr\n * @param {{percentAbsoluteDeltaThreshold: number}} options\n * @return {Array<AuditGroupDef>}\n */\nexport function computeAuditGroups(lhr, baseLhr, options) {\n /** @type {Array<AuditGroupDef>} */\n const auditGroups = [];\n\n for (const [categoryId, category] of Object.entries(lhr.categories)) {\n const categoryAsGroup = {title: category.title, description: category.description};\n const auditRefsGroupedByGroup = _.groupBy(category.auditRefs, ref => ref.group);\n\n const unchangedAuditsGroupId = `unchanged:${categoryId}`;\n /** @type {AuditGroupDef} */\n const unchangedAuditsGroup = {\n id: unchangedAuditsGroupId,\n group: {id: unchangedAuditsGroupId, title: `Unchanged Audits - ${category.title}`},\n pairs: [],\n showAsUnchanged: true,\n };\n\n for (const auditRefGroup of auditRefsGroupedByGroup) {\n let groupId = auditRefGroup[0].group || '';\n let groupWithoutId = lhr.categoryGroups && lhr.categoryGroups[groupId];\n if (!groupWithoutId) {\n // Only use the category as the group if the entire category is ungrouped.\n // The lack of a category when the category otherwise uses groups means it's hidden.\n if (auditRefsGroupedByGroup.length !== 1) continue;\n groupId = `category:${categoryId}`;\n groupWithoutId = categoryAsGroup;\n }\n const group = {...groupWithoutId, id: groupId};\n\n const pairs = auditRefGroup\n .map(ref => {\n const audit = {...lhr.audits[ref.id], id: ref.id};\n const baseAudit = baseLhr && baseLhr.audits[audit.id || ''];\n const diffs = baseAudit\n ? findAuditDiffs(baseAudit, audit, {...options, synthesizeItemKeyDiffs: true})\n : [];\n const maxSeverity = Math.max(...diffs.map(getDiffSeverity), 0);\n return {audit, baseAudit, diffs, maxSeverity, group};\n })\n .sort((a, b) => (a.audit.score || 0) - (b.audit.score || 0));\n\n const pairsWithDiffs = pairs.filter(pair => !pair.baseAudit || pair.diffs.length);\n const pairsWithoutDiffs = pairs.filter(pair => pair.baseAudit && !pair.diffs.length);\n if (pairsWithDiffs.length) {\n auditGroups.push({id: groupId, group, pairs: pairsWithDiffs, showAsUnchanged: false});\n }\n if (pairsWithoutDiffs.length) {\n unchangedAuditsGroup.pairs.push(...pairsWithoutDiffs);\n }\n }\n\n if (unchangedAuditsGroup.pairs.length) {\n auditGroups.push(unchangedAuditsGroup);\n }\n }\n\n return auditGroups;\n}\n\n/** @param {{hookElements: LHCI.HookElements<'dropdowns'>, selectedAuditId?: string | null, lhr?: LH.Result, baseLhr?: LH.Result, percentAbsoluteDeltaThreshold: number, setPercentAbsoluteDeltaThreshold: (x: number) => void}} props */\nconst LhrComparisonScoresAndUrl = props => {\n return (\n <div className=\"lhr-comparison__scores-and-dropdowns\">\n <div className=\"container\">\n <div className=\"lhr-comparison__dropdowns\">\n {props.hookElements.dropdowns}\n <Dropdown\n label=\"Threshold\"\n value={props.percentAbsoluteDeltaThreshold.toString()}\n setValue={value => {\n props.setPercentAbsoluteDeltaThreshold(Number(value));\n }}\n options={[\n {value: '0', label: '0%'},\n {value: '0.05', label: '5%'},\n {value: '0.1', label: '10%'},\n {value: '0.15', label: '15%'},\n {value: '0.25', label: '25%'},\n ]}\n />\n </div>\n {props.selectedAuditId ? <Fragment /> : <LhrComparisonScores {...props} />}\n </div>\n </div>\n );\n};\n\n/** @param {{auditGroups: Array<AuditGroupDef|undefined>, baseLhr?: LH.Result, selectedAuditId: string|null, setSelectedAuditId: (id: string|null) => void, showAsNarrow: boolean}} props */\nconst AuditGroups = props => {\n return (\n <div className=\"lhr-comparison__audit-groups\">\n {props.auditGroups.map(auditGroup => {\n if (!auditGroup) return undefined;\n return (\n <AuditGroup\n key={auditGroup.id}\n showAsNarrow={props.showAsNarrow}\n showAsUnchanged={auditGroup.showAsUnchanged}\n pairs={auditGroup.pairs}\n group={auditGroup.group}\n baseLhr={props.baseLhr}\n selectedAuditId={props.selectedAuditId}\n setSelectedAuditId={props.setSelectedAuditId}\n />\n );\n })}\n </div>\n );\n};\n\n/** @param {{lhr: LH.Result, baseLhr: LH.Result|undefined, hookElements: LHCI.HookElements<'dropdowns'|'warnings'>, className?: string}} props */\nexport const LhrComparison = props => {\n const {lhr, baseLhr} = props;\n const defaultAck = /** @type {'none'|'acknowledged'|'closed'} */ ('none');\n const [percentAbsoluteDeltaThreshold, setDiffThreshold] = useState(0.05);\n const [selectedAuditId, setAuditId] = useState(/** @type {string|null} */ (null));\n const [runtimeDiffAck, setRuntimeDiffAck] = useState(defaultAck);\n useAuditPermalinkScrollOnLoad(setAuditId);\n\n // Attach the LHRs to the window for easy debugging.\n useEffect(() => {\n // @ts-ignore\n window.__LHR__ = lhr;\n // @ts-ignore\n window.__BASE_LHR__ = baseLhr;\n }, [lhr, baseLhr]);\n\n const runtimeDiffs = computeRuntimeDiffs(lhr, baseLhr);\n const runtimeDiffsHaveError = runtimeDiffs.some(diff => diff.severity === 'error');\n const auditGroups = computeAuditGroups(lhr, baseLhr, {percentAbsoluteDeltaThreshold});\n\n return (\n <Fragment>\n {runtimeDiffAck === 'none' && runtimeDiffsHaveError ? (\n <Modal onClose={() => setRuntimeDiffAck('acknowledged')}>\n <LhrRuntimeDiff diffs={runtimeDiffs} variant=\"full\" />\n </Modal>\n ) : null}\n {selectedAuditId ? (\n <AuditDetailPane\n selectedAuditId={selectedAuditId}\n setSelectedAuditId={setAuditId}\n pairs={auditGroups\n .filter(group => !group.showAsUnchanged)\n .map(group => group.pairs)\n .reduce((a, b) => a.concat(b))}\n baseLhr={baseLhr}\n />\n ) : (\n <Fragment />\n )}\n <div\n className={clsx('lhr-comparison', props.className, {\n 'lhr-comparison--with-audit-selection': !!selectedAuditId,\n })}\n >\n <LhrComparisonScoresAndUrl\n lhr={lhr}\n baseLhr={baseLhr}\n selectedAuditId={selectedAuditId}\n hookElements={props.hookElements}\n percentAbsoluteDeltaThreshold={percentAbsoluteDeltaThreshold}\n setPercentAbsoluteDeltaThreshold={setDiffThreshold}\n />\n <div className=\"container\">\n {props.hookElements.warnings}\n {runtimeDiffAck !== 'closed' && runtimeDiffs.length ? (\n <Paper className=\"position-relative\">\n <LhrRuntimeDiff diffs={runtimeDiffs} variant=\"mini\" />\n <div\n className=\"lhr-comparison-runtime-diff__close\"\n onClick={() => setRuntimeDiffAck('closed')}\n >\n <i className=\"material-icons\">close</i>\n </div>\n </Paper>\n ) : null}\n {auditGroups.length && baseLhr ? (\n <Fragment>\n {selectedAuditId ? null : (\n <div className=\"lhr-comparison__legend-container\">\n <LhrComparisonLegend />\n </div>\n )}\n <AuditGroups\n showAsNarrow={!!selectedAuditId}\n auditGroups={auditGroups}\n baseLhr={baseLhr}\n selectedAuditId={selectedAuditId}\n setSelectedAuditId={setAuditId}\n />\n </Fragment>\n ) : props.hookElements.warnings ? null : (\n <Paper className=\"lhr-comparison__warning\">\n <i className=\"material-icons\">sentiment_satisfied_alt</i>\n <div>\n Woah, no differences found! Switch base builds to explore other differences, or{' '}\n <LhrViewerLink className=\"lhr-comparison__warning__lhr-link\" lhr={props.lhr}>\n jump straight to the Lighthouse report.\n </LhrViewerLink>\n </div>\n </Paper>\n )}\n </div>\n </div>\n </Fragment>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport clsx from 'clsx';\nimport './dropdown.css';\n\n/** @param {{options: Array<{value: string, label: string}>, value: string, setValue(v: string): void, className?: string, title?: string, label?: string}} props */\nexport const Dropdown = props => {\n const {options, value, setValue, className, title, label} = props;\n const computedOptions = options.some(option => option.value === value)\n ? options\n : [...options, {value, label: value}];\n return (\n <div\n className={clsx('dropdown', className)}\n style={{position: 'relative'}}\n data-tooltip={title}\n >\n <label>\n {label ? <span className=\"dropdown__label\">{label}</span> : <Fragment />}\n <select\n onChange={evt => {\n if (!(evt.target instanceof HTMLSelectElement)) return;\n setValue(evt.target.value);\n }}\n >\n {computedOptions.map(option => {\n return (\n <option key={option.value} value={option.value} selected={option.value === value}>\n {option.label}\n </option>\n );\n })}\n </select>\n </label>\n <div className=\"dropdown__chevron\">\n <i className=\"material-icons\">arrow_drop_down</i>\n </div>\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {useRef, useEffect} from 'preact/hooks';\n\n/**\n * @template T\n * @param {T} value\n * @return {T|null|undefined}\n */\nexport function usePreviousValue(value) {\n /** @type {import('preact').Ref<T|undefined>} */\n const ref = useRef(undefined);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n // This is returned before our useEffect callback runs to update the value.\n return ref.current;\n}\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\n\n/** @param {{score: number}} props */\nexport const ScoreIcon = props => {\n const score = props.score;\n if (score >= 0.9) return <i className=\"lh-score-pass\" />;\n if (score >= 0.5) return <i className=\"lh-score-average\" />;\n return (\n <i className=\"lh-score-fail\">\n <svg viewBox=\"0 0 120 120\" xmlns=\"http://www.w3.org/2000/svg\">\n <polygon points=\"10,110 60,10 110,110\" />\n </svg>\n </i>\n );\n};\n\n/** @param {{audit: LH.AuditResult}} props */\nexport const ScoreWord = props => {\n const score = props.audit.score || 0;\n if (score >= 0.9) return <span className=\"lh-score-word\">Pass</span>;\n return <span className=\"lh-score-word\">Fail</span>;\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport {splitMarkdownLink} from '@lhci/utils/src/markdown.js';\n\n/** @param {{text: string}} props */\nexport const Markdown = props => {\n const segments = splitMarkdownLink(props.text);\n\n return (\n <Fragment>\n {segments.map((segment, i) => {\n if (!segment.isLink) return <span key={i}>{segment.text}</span>;\n\n const url = new URL(segment.linkHref);\n\n const DOCS_ORIGINS = ['https://developers.google.com', 'https://web.dev'];\n if (DOCS_ORIGINS.includes(url.origin)) {\n url.searchParams.set('utm_source', 'lighthouse');\n url.searchParams.set('utm_medium', 'ci');\n }\n\n return (\n <a key={i} href={url.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {segment.text}\n </a>\n );\n })}\n </Fragment>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\n\nexport const Nbsp = () => {\n return <span style={{display: 'inline-block', width: 4, height: 1}} />;\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {Fragment, h} from 'preact';\nimport {Nbsp} from '../../../components/nbsp';\nimport './simple-details.css';\nimport {getDiffLabel, getDeltaStats} from '@lhci/utils/src/audit-diff-finder.js';\n\n/** @param {{type: LH.DetailsType, baseValue: any, compareValue: any, diff?: LHCI.NumericItemAuditDiff}} props */\nexport const SimpleDetails = props => {\n let type = props.type;\n const {compareValue, baseValue, diff} = props;\n const value = compareValue === undefined ? baseValue : compareValue;\n\n if (typeof value === 'object' && value.type) {\n type = value.type;\n }\n\n const label = diff ? getDiffLabel(diff) : 'neutral';\n\n const numericBase = Number.isFinite(baseValue) ? baseValue : 0;\n const numericCompare = Number.isFinite(compareValue) ? compareValue : 0;\n const baseDisplay = `Base Value: ${Math.round(numericBase).toLocaleString()}`;\n const compareDisplay = `Compare Value: ${Math.round(numericCompare).toLocaleString()}`;\n const numericTitle = `${baseDisplay}, ${compareDisplay}`;\n const deltaPercent =\n diff && getDeltaStats(diff).percentAbsoluteDelta !== 1\n ? ` (${(getDeltaStats(diff).percentAbsoluteDelta * 100).toLocaleString(undefined, {\n maximumFractionDigits: 0,\n })}%)`\n : '';\n\n switch (type) {\n case 'bytes': {\n const kb = Math.abs((numericCompare - numericBase) / 1024);\n return (\n <pre className={`simple-details--${label}`} data-tooltip={numericTitle}>\n {numericCompare >= numericBase ? '+' : '-'}\n {kb.toLocaleString(undefined, {maximumFractionDigits: Math.abs(kb) < 1 ? 1 : 0})}\n <Nbsp />\n KB\n {deltaPercent}\n </pre>\n );\n }\n case 'ms':\n case 'timespanMs': {\n const ms = Math.abs(Math.round(numericCompare - numericBase));\n return (\n <pre className={`simple-details--${label}`} data-tooltip={numericTitle}>\n {numericCompare >= numericBase ? '+' : '-'}\n {ms.toLocaleString()}\n <Nbsp />\n ms\n {deltaPercent}\n </pre>\n );\n }\n case 'thumbnail':\n return (\n <img\n style={{width: 48, height: 48, objectFit: 'cover'}}\n src={value}\n onError={evt => {\n const img = evt.srcElement;\n if (!(img instanceof HTMLImageElement)) return;\n\n // On failure just replace the image with a 1x1 transparent gif.\n img.onerror = null;\n img.src =\n 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';\n }}\n />\n );\n case 'url': {\n let display = value;\n let hostname = '';\n try {\n const url = new URL(value);\n display = url.pathname;\n hostname = url.hostname;\n } catch (_) {}\n\n // FIXME: use title instead of data-tooltip because of the `overflow: hidden` constraints on the table cell.\n return (\n <span title={value}>\n {display}\n {hostname ? <span className=\"simple-details__url-hostname\">({hostname})</span> : ''}\n </span>\n );\n }\n case 'link': {\n if (!value.url) return <span>{value.text}</span>;\n return (\n <a target=\"_blank\" rel=\"noopener noreferrer\" href={value.url}>\n {value.text}\n </a>\n );\n }\n case 'code':\n return <pre>{value}</pre>;\n case 'numeric': {\n return (\n <pre className={`simple-details--${label}`}>\n {numericCompare >= numericBase ? '+' : '-'}\n {Math.abs(numericCompare - numericBase).toLocaleString()}\n {deltaPercent}\n </pre>\n );\n }\n case 'text':\n return <span>{value}</span>;\n case 'node':\n return <pre>{value.snippet}</pre>;\n case 'source-location': {\n if (!value.url) return <pre>{JSON.stringify(value)}</pre>;\n const {url, line, column} = value;\n return (\n <pre>\n {url}:{line}:{column}\n </pre>\n );\n }\n case 'debugdata': {\n return <Fragment />;\n }\n default: {\n const debugdata = JSON.stringify(props);\n return <pre data-tooltip={debugdata}>{debugdata.slice(0, 20)}</pre>;\n }\n }\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport './table-details.css';\nimport {SimpleDetails} from './simple-details';\nimport {\n zipBaseAndCompareItems,\n sortZippedBaseAndCompareItems,\n getRowLabelForIndex,\n} from '@lhci/utils/src/audit-diff-finder';\n\n/** @param {LH.DetailsType} itemType @return {boolean} */\nfunction isNumericValueType(itemType) {\n switch (itemType) {\n case 'bytes':\n case 'ms':\n case 'timespanMs':\n case 'numeric':\n return true;\n default:\n return false;\n }\n}\n\n/** @param {{pair: LHCI.AuditPair}} props */\nexport const TableDetails = props => {\n const {audit, baseAudit, diffs: allDiffs} = props.pair;\n if (!audit.details) return <Fragment />;\n const {headings: compareHeadings, items: compareItems} = audit.details;\n if (!compareHeadings || !compareItems) return <Fragment />;\n\n const baseHeadings = (baseAudit && baseAudit.details && baseAudit.details.headings) || [];\n const baseItems = (baseAudit && baseAudit.details && baseAudit.details.items) || [];\n\n const zippedItems = zipBaseAndCompareItems(baseItems, compareItems);\n const sortedItems = sortZippedBaseAndCompareItems(allDiffs, zippedItems);\n const headings = compareHeadings.length ? compareHeadings : baseHeadings;\n // We'll insert the row label before the first numeric heading, or last if none is found.\n let insertRowLabelAfterIndex =\n headings.findIndex(heading =>\n isNumericValueType(heading.valueType || heading.itemType || 'unknown')\n ) - 1;\n if (insertRowLabelAfterIndex < 0) insertRowLabelAfterIndex = headings.length - 1;\n\n return (\n <div className=\"table-details\">\n <table>\n <thead>\n <tr>\n {headings.map((heading, i) => {\n const itemType = heading.valueType || heading.itemType || 'unknown';\n return (\n <Fragment key={i}>\n <th className={`table-column--${itemType}`}>{heading.label || heading.text}</th>\n {insertRowLabelAfterIndex === i ? <th /> : null}\n </Fragment>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {sortedItems.map(({base, compare, diffs}) => {\n const definedItem = compare || base;\n // This should never be true, but make tsc happy\n if (!definedItem) return null;\n\n const key = `${base && base.index}-${compare && compare.index}`;\n const state = getRowLabelForIndex(\n allDiffs,\n compare && compare.index,\n base && base.index\n );\n\n return (\n <tr key={key}>\n {headings.map((heading, j) => {\n const itemType = heading.valueType || heading.itemType || 'unknown';\n const diff = diffs.find(\n /** @return {diff is LHCI.NumericItemAuditDiff} */\n diff => diff.type === 'itemDelta' && diff.itemKey === heading.key\n );\n\n // With the introduction of subitems, not every item will have a value for every heading.\n const compareItem = heading.key && compare && compare.item[heading.key];\n const baseItem = heading.key && base && base.item[heading.key];\n\n return (\n <Fragment key={j}>\n <td className={`table-column--${itemType}`}>\n {compareItem || baseItem ? (\n <SimpleDetails\n type={itemType}\n compareValue={compareItem}\n baseValue={baseItem}\n diff={diff}\n />\n ) : (\n <Fragment />\n )}\n </td>\n {insertRowLabelAfterIndex === j ? (\n <td className=\"table-column--row-label\">\n {state === 'added' || state === 'removed' ? state : ''}\n </td>\n ) : null}\n </Fragment>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport {getDeltaLabel} from '@lhci/utils/src/audit-diff-finder';\nimport clsx from 'clsx';\nimport {Nbsp} from '../../../components/nbsp';\nimport './numeric-diff.css';\n\nconst BIG_PICTURE_LIMITS = {\n 'first-contentful-paint': [0, 10000],\n 'first-meaningful-paint': [0, 10000],\n 'largest-contentful-paint': [0, 15000],\n 'speed-index': [0, 15000],\n 'first-cpu-idle': [0, 15000],\n 'interactive': [0, 20000],\n 'estimated-input-latency': [0, 1500],\n 'max-potential-fid': [0, 1500],\n 'total-blocking-time': [0, 1500],\n 'experimental-interaction-to-next-paint': [0, 3500],\n 'cumulative-layout-shift': [0, 1],\n __default__: [0, 30 * 1000],\n};\n\n/** @param {LH.AuditResult|undefined} audit @param {'lower'|'upper'} limitType */\nconst getBigPictureLimit = (audit, limitType) => {\n const auditId = /** @type {keyof typeof BIG_PICTURE_LIMITS} */ (audit && audit.id) || '';\n const limits = BIG_PICTURE_LIMITS[auditId] || BIG_PICTURE_LIMITS.__default__;\n return limits[limitType === 'lower' ? 0 : 1];\n};\n\n/** @param {number} x @param {'up'|'down'} direction */\nconst toNearestRoundNumber = (x, direction) => {\n const fn = direction === 'up' ? Math.ceil : Math.floor;\n if (x < 10) return fn(x);\n if (x < 100) return fn(x / 10) * 10;\n if (x < 1000) return fn(x / 100) * 100;\n if (x < 10000) return fn(x / 1000) * 1000;\n return fn(x / 2500) * 2500;\n};\n\n/**\n * @param {LH.AuditResult|undefined} audit\n * @param {string|undefined} groupId\n * @return {'ms'|'bytes'|'none'}\n */\nconst getUnitFromAudit = (audit, groupId) => {\n if (audit && audit.id === 'cumulative-layout-shift') return 'none';\n if (groupId === 'metrics') return 'ms';\n if (groupId === 'load-opportunities') return 'ms';\n if (!audit) return 'none';\n\n if (audit.details) {\n const details = audit.details;\n if (details.overallSavingsMs) return 'ms';\n }\n\n const displayValue = audit.displayValue || '';\n if (/[0-9,.]+\\s(ms|s)$/.test(displayValue)) return 'ms';\n if (/[0-9,.]+\\s(KB|MB)$/.test(displayValue)) return 'bytes';\n\n return 'none';\n};\n\n/** @param {number} x @param {{asDelta?: boolean, unit: 'ms'|'bytes'|'none', withSuffix?: boolean, preventSecondsConversion?: boolean}} options */\nconst toDisplay = (x, options) => {\n const {asDelta = false, withSuffix = false, unit = 'none'} = options;\n let value = Math.round(x);\n let fractionDigits = 0;\n let suffixUnit = '';\n\n if (unit === 'ms') {\n suffixUnit = 'ms';\n\n if (Math.abs(value) >= 1000 && !options.preventSecondsConversion) {\n value /= 1000;\n fractionDigits = 1;\n suffixUnit = 's';\n }\n }\n\n if (unit === 'bytes') {\n suffixUnit = 'KB';\n value /= 1024;\n\n if (Math.abs(value) >= 500) {\n value /= 1024;\n fractionDigits = 1;\n suffixUnit = 'MB';\n }\n }\n\n if (unit === 'none') {\n if (Math.abs(x) < 1) {\n value = x;\n fractionDigits = 3;\n } else if (Math.abs(value) < 10) {\n value = x;\n fractionDigits = 1;\n } else if (Math.abs(value) >= 50) {\n value /= 1000;\n fractionDigits = 1;\n suffixUnit = 'K';\n }\n }\n\n const string = value.toLocaleString(undefined, {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n });\n\n const numericSign = asDelta && value >= 0 ? '+' : '';\n const resultStr = numericSign + string + (withSuffix ? suffixUnit : '');\n return {\n element: (\n <span>\n {numericSign}\n {string}\n {withSuffix ? (\n <Fragment>\n <Nbsp />\n {suffixUnit}\n </Fragment>\n ) : (\n ''\n )}\n </span>\n ),\n string: resultStr,\n length: resultStr.length,\n };\n};\n\n/** @param {{diff: LHCI.NumericAuditDiff, audit?: LH.AuditResult, groupId?: string, showAsBigPicture?: boolean, showAsNarrow?: boolean}} props */\nexport const NumericDiff = props => {\n const {diff, audit, groupId} = props;\n const unit = getUnitFromAudit(audit, groupId);\n const currentNumericValue = diff.compareValue;\n const baseNumericValue = diff.baseValue;\n\n if (typeof baseNumericValue !== 'number' || typeof currentNumericValue !== 'number') {\n return <span>No diff available</span>;\n }\n\n const delta = currentNumericValue - baseNumericValue;\n const minValue = Math.min(currentNumericValue, baseNumericValue);\n const maxValue = Math.max(currentNumericValue, baseNumericValue);\n const lowerLimit = props.showAsBigPicture\n ? getBigPictureLimit(audit, 'lower')\n : toNearestRoundNumber(minValue * 0.8, 'down');\n const upperLimit = props.showAsBigPicture\n ? getBigPictureLimit(audit, 'upper')\n : toNearestRoundNumber(maxValue * 1.2, 'up');\n const range = upperLimit - lowerLimit;\n\n const minValueConstrainted = Math.min(Math.max(minValue, lowerLimit), upperLimit);\n const maxValueConstrainted = Math.min(Math.max(maxValue, lowerLimit), upperLimit);\n const boxLeft = (100 * (minValueConstrainted - lowerLimit)) / range;\n const boxRight = 100 - (100 * (maxValueConstrainted - lowerLimit)) / range;\n const deltaType = getDeltaLabel(delta, 'audit');\n const minValueIsCurrentValue = minValue === currentNumericValue;\n const hoverDisplay = `${toDisplay(baseNumericValue, {unit, withSuffix: true}).string} to ${\n toDisplay(currentNumericValue, {\n withSuffix: true,\n unit,\n }).string\n }`;\n\n if (props.showAsNarrow) {\n return (\n <div className={clsx('audit-numeric-diff', `text--${deltaType}`)} data-tooltip={hoverDisplay}>\n {\n toDisplay(delta, {asDelta: true, withSuffix: true, preventSecondsConversion: true, unit})\n .element\n }\n </div>\n );\n }\n\n // We want to ensure there's ~10px per character of space for the delta label.\n // The min-width of the bar is ~300px, so if the deltaLabel is going to take up more than\n // the narrowCutoffThresholdInPercent we want to flip it over to the other side.\n const {element: deltaLabel, length: deltaLabelLength} = toDisplay(delta, {\n asDelta: true,\n withSuffix: true,\n preventSecondsConversion: true,\n unit,\n });\n const narrowCutoffThresholdInPercent = (deltaLabelLength * 10 * 100) / 300;\n\n return (\n <Fragment>\n <div className=\"audit-numeric-diff\">\n <div className=\"audit-numeric-diff__left-label\">\n {toDisplay(lowerLimit, {unit}).element}\n </div>\n <div className=\"audit-numeric-diff__bar\">\n <div\n className={clsx('audit-numeric-diff__box', {\n 'audit-numeric-diff__box--improvement': deltaType === 'improvement',\n 'audit-numeric-diff__box--regression': deltaType === 'regression',\n })}\n style={{left: `${boxLeft}%`, right: `${boxRight}%`}}\n data-tooltip={hoverDisplay}\n >\n <div\n className=\"audit-numeric-diff__now\"\n style={{left: minValueIsCurrentValue ? '0%' : '100%'}}\n />\n <div\n className={clsx('audit-numeric-diff__delta-label', {\n 'audit-numeric-diff__delta-label--narrow-left':\n deltaType === 'improvement' && boxLeft < narrowCutoffThresholdInPercent,\n 'audit-numeric-diff__delta-label--narrow-right':\n deltaType === 'regression' && boxRight < narrowCutoffThresholdInPercent,\n })}\n style={{[minValueIsCurrentValue ? 'right' : 'left']: '100%'}}\n >\n {deltaLabel}\n </div>\n </div>\n </div>\n <div className=\"audit-numeric-diff__right-label\">\n {toDisplay(upperLimit, {unit}).element}\n </div>\n </div>\n </Fragment>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport * as _ from '@lhci/utils/src/lodash';\nimport {h, Fragment} from 'preact';\nimport {ScoreWord} from '../../../components/score-icon';\nimport {NumericDiff} from './numeric-diff';\nimport {getDiffLabel, getRowLabelForIndex} from '@lhci/utils/src/audit-diff-finder';\nimport clsx from 'clsx';\n\n/** @type {Record<string, string>} */\nconst ICONS_BY_AUDIT_ID = {\n 'font-display': 'font_download',\n 'uses-rel-preconnect': 'language',\n\n 'user-timings': 'timer',\n 'bootup-time': 'speed',\n 'mainthread-work-breakdown': 'speed',\n\n 'third-party-summary': 'language',\n\n deprecations: 'error',\n 'errors-in-console': 'error',\n 'font-sizes': 'format_size',\n};\n\n/** @param {{audit: LH.AuditResult, groupId: string}} props */\nconst IconForAuditItems = props => {\n const auditId = props.audit.id || '';\n const groupId = props.groupId || '';\n\n let icon = '';\n if (groupId.includes('opportunities')) icon = 'web_asset';\n if (groupId.includes('a11y')) icon = 'code';\n if (auditId.includes('image')) icon = 'photo';\n icon = ICONS_BY_AUDIT_ID[auditId] || icon || 'list_alt';\n\n return <i className=\"material-icons\">{icon}</i>;\n};\n\n/** @param {{diff: LHCI.AuditDiff, audit: LH.AuditResult, baseAudit: LH.AuditResult}} props */\nconst ScoreDiff = props => {\n return (\n <Fragment>\n <ScoreWord audit={props.baseAudit} />\n <i\n className={`material-icons audit-group__diff-arrow audit-group__diff-arrow--${getDiffLabel(\n props.diff\n )}`}\n >\n arrow_forward\n </i>\n <ScoreWord audit={props.audit} />\n </Fragment>\n );\n};\n\n/** @param {{diff: LHCI.DisplayValueAuditDiff, audit: LH.AuditResult, baseAudit: LH.AuditResult}} props */\nconst DisplayValueDiff = props => {\n return (\n <Fragment>\n <span>{props.diff.baseValue}</span>\n <i\n className={`material-icons audit-group__diff-arrow audit-group__diff-arrow--${getDiffLabel(\n props.diff\n )}`}\n >\n arrow_forward\n </i>\n <span>{props.diff.compareValue}</span>\n </Fragment>\n );\n};\n\n/** @param {import('@lhci/utils/src/audit-diff-finder').RowLabel} rowLabel @return {'regression'|'improvement'|'neutral'} */\nfunction getDiffLabelForRowLabel(rowLabel) {\n switch (rowLabel) {\n case 'added':\n case 'worse':\n case 'ambiguous':\n return 'regression';\n case 'removed':\n case 'better':\n return 'improvement';\n case 'no change':\n return 'neutral';\n }\n}\n\n/** @param {Array<LHCI.AuditDiff>} diffs */\nfunction getUniqueBaseCompareIndexPairs(diffs) {\n return _.uniqBy(\n diffs\n .map(diff => ({\n base: 'baseItemIndex' in diff ? diff.baseItemIndex : undefined,\n compare: 'compareItemIndex' in diff ? diff.compareItemIndex : undefined,\n }))\n .filter(indexes => typeof indexes.base === 'number' || typeof indexes.compare === 'number'),\n idx => `${idx.base}-${idx.compare}`\n );\n}\n\n/** @param {{diffs: Array<LHCI.AuditDiff>, audit: LH.AuditResult, baseAudit: LH.AuditResult, groupId: string, showAsNarrow?: boolean}} props */\nexport const ItemDiff = props => {\n const {diffs, baseAudit, groupId} = props;\n const baseAuditItems = (baseAudit.details && baseAudit.details.items) || [];\n\n const rowIndexes = getUniqueBaseCompareIndexPairs(diffs);\n const rowLabels = rowIndexes\n .map(pair => getRowLabelForIndex(diffs, pair.compare, pair.base))\n .map(getDiffLabelForRowLabel);\n\n const regressionCount = rowLabels.filter(label => label === 'regression').length;\n const improvementCount = rowLabels.filter(label => label === 'improvement').length;\n\n const baseElements = (\n <Fragment>\n <div className=\"audit-group__diff-badge-group\">\n <IconForAuditItems audit={props.audit} groupId={groupId} />\n <div className=\"audit-group__diff-badges\">\n <span className=\"audit-group__diff-badge\">{baseAuditItems.length}</span>\n </div>\n </div>\n <i\n className={`material-icons audit-group__diff-arrow audit-group__diff-arrow--${\n improvementCount > regressionCount ? 'improvement' : 'regression'\n }`}\n >\n arrow_forward\n </i>\n </Fragment>\n );\n\n return (\n <Fragment>\n {props.showAsNarrow ? <Fragment /> : baseElements}\n <div className={clsx(`audit-group__diff-badge-group`)}>\n <IconForAuditItems audit={props.audit} groupId={groupId} />\n <div\n className={clsx('audit-group__diff-badges', {\n 'audit-group__diff-badge-group--multiple': Boolean(regressionCount && improvementCount),\n })}\n >\n {regressionCount ? (\n <span className=\"audit-group__diff-badge audit-group__diff-badge--regression\">\n {regressionCount}\n </span>\n ) : null}\n {improvementCount ? (\n <span className=\"audit-group__diff-badge audit-group__diff-badge--improvement\">\n {improvementCount}\n </span>\n ) : null}\n </div>\n </div>\n </Fragment>\n );\n};\n\nconst NoBaseAudit = () => (\n <div className=\"audit-group__error-message\" data-tooltip=\"Audit did not run in the base report\">\n <i className=\"material-icons\">error_outline</i> Audit Missing\n </div>\n);\n\n/** @param {{audit: LH.AuditResult, baseAudit: LH.AuditResult}} props */\nconst ErrorDiff = props => {\n let message = 'An unknown error occurred while trying to compare the audit results.';\n if (props.audit.scoreDisplayMode === 'error') {\n message = `Audit in compare report errored: ${props.audit.errorMessage}`;\n } else if (props.baseAudit.scoreDisplayMode === 'error') {\n message = `Audit in base report errored: ${props.baseAudit.errorMessage}`;\n }\n\n return (\n <div className=\"audit-group__error-message\" data-tooltip={message}>\n <i className=\"material-icons\">error_outline</i> Audit Error\n </div>\n );\n};\n\n/** @param {{pair: LHCI.AuditPair, showAsBigPicture: boolean, showAsNarrow: boolean}} props */\nexport const AuditDiff = props => {\n const {audit, baseAudit, diffs, group} = props.pair;\n const noDiffAvailable = <span>No diff available</span>;\n\n if (!baseAudit) return <NoBaseAudit />;\n\n const errorDiff = diffs.find(diff => diff.type === 'error');\n if (errorDiff) return <ErrorDiff audit={audit} baseAudit={baseAudit} />;\n\n const numericDiff = diffs.find(diff => diff.type === 'numericValue');\n if (numericDiff && numericDiff.type === 'numericValue') {\n return (\n <NumericDiff\n diff={numericDiff}\n audit={audit}\n groupId={group.id}\n showAsBigPicture={props.showAsBigPicture}\n showAsNarrow={props.showAsNarrow}\n />\n );\n }\n\n const hasItemDiff = diffs.some(\n diff => diff.type === 'itemAddition' || diff.type === 'itemRemoval' || diff.type === 'itemDelta'\n );\n if (hasItemDiff) {\n return (\n <ItemDiff\n diffs={diffs}\n audit={audit}\n baseAudit={baseAudit}\n groupId={group.id}\n showAsNarrow={props.showAsNarrow}\n />\n );\n }\n\n const scoreDiff = diffs.find(diff => diff.type === 'score');\n if (scoreDiff) return <ScoreDiff diff={scoreDiff} audit={audit} baseAudit={baseAudit} />;\n\n const displayValueDiff = diffs.find(diff => diff.type === 'displayValue');\n if (!displayValueDiff || displayValueDiff.type !== 'displayValue') return noDiffAvailable;\n return <DisplayValueDiff diff={displayValueDiff} audit={audit} baseAudit={baseAudit} />;\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport clsx from 'clsx';\nimport {ScoreWord, ScoreIcon} from '../../../components/score-icon';\nimport {Markdown} from '../../../components/markdown';\nimport {TableDetails} from './table-details';\nimport {NumericDiff} from '../audit-list/numeric-diff';\nimport {ItemDiff} from '../audit-list/audit-diff';\nimport {getDiffLabel} from '@lhci/utils/src/audit-diff-finder';\n\n/** @param {{pair: LHCI.AuditPair, diff: LHCI.AuditDiff}} props */\nconst ScoreOnlyDetails = props => {\n const {audit, baseAudit} = props.pair;\n if (!baseAudit) return null;\n\n return (\n <div className=\"audit-detail-pane__audit-details--binary\">\n <ScoreWord audit={baseAudit} />\n <i\n className={`material-icons audit-group__diff-arrow audit-group__diff-arrow--${getDiffLabel(\n props.diff\n )}`}\n >\n arrow_forward\n </i>\n <ScoreWord audit={audit} />\n </div>\n );\n};\n\n/** @param {{pair: LHCI.AuditPair}} props */\nconst ErrorDetails = props => {\n const erroredAudit =\n props.pair.audit.scoreDisplayMode === 'error' ? props.pair.audit : props.pair.baseAudit;\n if (!erroredAudit) return null;\n return (\n <Fragment>\n <div className=\"audit-detail-pane__audit-details-summary\">\n Error occurred in the{' '}\n {erroredAudit === props.pair.baseAudit ? 'base report:' : 'compare report:'}\n </div>\n <pre>{erroredAudit.errorMessage || 'Unknown error'}</pre>\n </Fragment>\n );\n};\n\n/** @param {{pair: LHCI.AuditPair, key?: string}} props */\nconst Details = props => {\n const {pair} = props;\n const details = pair.audit.details || {type: 'unknown'};\n const baseDetails = (pair.baseAudit && pair.baseAudit.details) || {type: 'unknown'};\n const hasItems = Boolean((details.items || []).length || (baseDetails.items || []).length);\n\n let itemDiff = undefined;\n let tableDetails = undefined;\n let numericDetails = undefined;\n\n if (pair.audit.errorMessage || (pair.baseAudit && pair.baseAudit.errorMessage)) {\n return <ErrorDetails pair={pair} />;\n }\n\n if ((details.type === 'table' || details.type === 'opportunity') && hasItems) {\n tableDetails = <TableDetails pair={pair} />;\n if (pair.baseAudit) {\n itemDiff = <ItemDiff {...pair} baseAudit={pair.baseAudit} groupId={pair.group.id} />;\n }\n }\n\n const numericDiff = pair.diffs.find(diff => diff.type === 'numericValue');\n if (numericDiff && numericDiff.type === 'numericValue') {\n numericDetails = <NumericDiff diff={numericDiff} audit={pair.audit} />;\n }\n\n if (tableDetails || numericDiff) {\n return (\n <Fragment>\n <div className=\"audit-detail-pane__audit-details-summary\">{numericDetails || itemDiff}</div>\n {tableDetails}\n </Fragment>\n );\n }\n\n const scoreDiff = pair.diffs.find(diff => diff.type === 'score');\n if (scoreDiff && scoreDiff.type === 'score')\n return <ScoreOnlyDetails diff={scoreDiff} pair={props.pair} />;\n\n return <pre>{JSON.stringify(props.pair, null, 2)}</pre>;\n};\n\n/** @param {{pair: LHCI.AuditPair, key?: string}} props */\nexport const AuditDetail = props => {\n const {audit} = props.pair;\n\n return (\n <div id={`audit-detail-pane-audit--${audit.id}`} className={clsx('audit-detail-pane__audit')}>\n <div className=\"audit-detail-pane__score\">\n <ScoreIcon score={audit.score || 0} />\n </div>\n <div className=\"audit-detail-pane__audit-title\">{audit.title}</div>\n <div className=\"audit-detail-pane__audit-description\">\n <Markdown text={audit.description || ''} />\n </div>\n <div className=\"audit-detail-pane__audit-details\">\n <Details pair={props.pair} />\n </div>\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport './audit-detail-pane.css';\nimport {usePreviousValue} from '../../../hooks/use-previous-value.jsx';\nimport {useEffect, useRef} from 'preact/hooks';\nimport {AuditDetail} from './audit-detail';\n\n/**\n * @param {{selectedAuditId: string, setSelectedAuditId: (id: string|null) => void, pairs: Array<LHCI.AuditPair>, baseLhr?: LH.Result}} props\n */\nexport const AuditDetailPane = props => {\n /** @type {import('preact').Ref<HTMLElement|undefined>} */\n const paneElementRef = useRef(undefined);\n const previouslySelectedAuditId = usePreviousValue(props.selectedAuditId);\n\n // Scroll to the selected audit *when it changes*\n useEffect(() => {\n const auditId = props.selectedAuditId;\n const paneElement = paneElementRef.current;\n if (!paneElement || !auditId || auditId === previouslySelectedAuditId) return;\n\n const childElement = paneElement.querySelector(`#audit-detail-pane-audit--${auditId}`);\n if (!childElement || !(childElement instanceof HTMLElement)) return;\n\n paneElement.scrollTo(0, childElement.offsetTop);\n }, [props.selectedAuditId, previouslySelectedAuditId]);\n\n return (\n <div className=\"audit-detail-pane\" ref={el => (paneElementRef.current = el)}>\n <div className=\"audit-detail-pane__close\" onClick={() => props.setSelectedAuditId(null)}>\n <i className=\"material-icons\">close</i>\n </div>\n {props.pairs.map(pair => {\n const {audit} = pair;\n if (!audit.id) return undefined;\n return <AuditDetail key={audit.id} pair={pair} />;\n })}\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport clsx from 'clsx';\nimport './gauge.css';\nimport {getDiffLabel} from '@lhci/utils/src/audit-diff-finder';\n\n/** @param {{className?: string, score: number, diff?: LHCI.NumericAuditDiff}} props */\nexport const Gauge = props => {\n const score = Math.round(props.score * 100);\n const rawBaseScore = props.diff ? props.diff.baseValue : props.score;\n const baseScore = Math.round(rawBaseScore * 100);\n const label = props.diff ? getDiffLabel(props.diff) : 'neutral';\n\n // 352 is ~= 2 * Math.PI * gauge radius (56)\n // https://codepen.io/xgad/post/svg-radial-progress-meters\n // score of 50: `stroke-dasharray: 176 352`;\n // The roundcap on the arc makes it extend slightly past where it should, so we need to adjust it by a few pts.\n const baseDasharrayScore = Math.max(0, props.score * 352 - 2);\n const baseStrokeDasharray = `${baseDasharrayScore} 352`;\n const delta = Math.abs(baseScore - score);\n const deltaDasharrayScore = Math.max(0, (delta / 100) * 352 - 2);\n const deltaStrokeDasharray = `${deltaDasharrayScore} 352`;\n const deltaTransform = `rotate(${(Math.min(score, baseScore) / 100) * 360}deg)`;\n const indicatorTransform = `rotate(${props.score * 360}deg)`;\n\n return (\n <div className={clsx('gauge', `gauge--${label}`)}>\n <div className=\"gauge-arc\">\n <svg viewBox=\"0 0 120 120\">\n <circle\n className=\"gauge-arc__arc\"\n transform=\"rotate(-90 60 60)\"\n r=\"56\"\n cx=\"60\"\n cy=\"60\"\n style={{strokeDasharray: baseStrokeDasharray}}\n />\n </svg>\n <div\n className=\"gauge-arc__delta-wrapper\"\n style={{transform: deltaTransform, display: deltaDasharrayScore < 1 ? 'none' : 'block'}}\n >\n <svg viewBox=\"0 0 120 120\">\n <circle\n className=\"gauge-arc__arc\"\n transform=\"rotate(-90 60 60)\"\n r=\"56\"\n cx=\"60\"\n cy=\"60\"\n style={{strokeDasharray: deltaStrokeDasharray}}\n />\n </svg>\n </div>\n <div className=\"gauge-arc__indicator-wrapper\" style={{transform: indicatorTransform}}>\n <div className=\"gauge-arc__indicator\" />\n </div>\n </div>\n <span>{score}</span>\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport clsx from 'clsx';\n\nimport * as _ from '@lhci/utils/src/lodash.js';\nimport './pwa-gauge.css';\n\n// For SVG to function properly, we need to use the real attribtues that preact doesn't set.\n/* eslint-disable react/no-unknown-property */\n\n/** @typedef {{optimized: boolean, installable: boolean, fastAndReliable: boolean}} PWABadgeStatus */\n\n/** @param {{deltaType: import('@lhci/utils/src/audit-diff-finder').DiffLabel}} props */\nexport const FastReliableIcon = props => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n class={`pwa-icon pwa-icon--${props.deltaType}`}\n >\n <g fill-rule=\"nonzero\" fill=\"none\">\n <circle class={`pwa-icon__background`} cx=\"12\" cy=\"12\" r=\"12\" />\n <path\n d=\"M12 4.3l6.3 2.8v4.2c0 3.88-2.69 7.52-6.3 8.4-3.61-.88-6.3-4.51-6.3-8.4V7.1L12 4.3zm-.56 12.88l3.3-5.79.04-.08c.05-.1.01-.29-.26-.29h-1.96l.56-3.92h-.56L9.3 12.82c0 .03.07-.12-.03.07-.11.2-.12.37.2.37h1.97l-.56 3.92h.56z\"\n fill=\"#FFF\"\n />\n </g>\n </svg>\n );\n};\n\n/** @param {{deltaType: import('@lhci/utils/src/audit-diff-finder').DiffLabel}} props */\nexport const InstallableIcon = props => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n class={`pwa-icon pwa-icon--${props.deltaType}`}\n >\n <g fill-rule=\"nonzero\" fill=\"none\">\n <circle class={`pwa-icon__background`} cx=\"12\" cy=\"12\" r=\"12\" />\n <path\n d=\"M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z\"\n fill=\"#FFF\"\n />\n </g>\n </svg>\n );\n};\n\n/** @param {{deltaType: import('@lhci/utils/src/audit-diff-finder').DiffLabel}} props */\nexport const OptimizedIcon = props => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n class={`pwa-icon pwa-icon--${props.deltaType}`}\n >\n <g fill=\"none\" fill-rule=\"evenodd\">\n <rect class={`pwa-icon__background`} width=\"24\" height=\"24\" rx=\"12\" />\n <path d=\"M5 5h14v14H5z\" />\n <path\n fill=\"#FFF\"\n d=\"M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z\"\n />\n </g>\n </svg>\n );\n};\n\n/**\n *\n * @param {PWABadgeStatus} base\n * @param {PWABadgeStatus} compare\n * @param {keyof PWABadgeStatus} key\n * @return {import('@lhci/utils/src/audit-diff-finder').DiffLabel}\n */\nexport function getBadgeDiffType(base, compare, key) {\n if (base[key] === compare[key]) return 'neutral';\n if (compare[key]) return 'improvement';\n return 'regression';\n}\n\n/** @param {LH.Result} lhr @return {PWABadgeStatus} */\nexport function getBadgeStatus(lhr) {\n const pwaCategory = lhr.categories.pwa;\n const auditsByCategory = _.groupIntoMap(pwaCategory.auditRefs, ref => ref.group);\n /** @param {LH.CategoryResult['auditRefs']} [refs] */\n const hasEveryPass = (refs = []) =>\n refs.map(ref => lhr.audits[ref.id]).every(audit => audit && audit.score === 1);\n return {\n optimized: hasEveryPass(auditsByCategory.get('pwa-optimized') || []),\n installable: hasEveryPass(auditsByCategory.get('pwa-installable') || []),\n fastAndReliable: hasEveryPass(auditsByCategory.get('pwa-fast-reliable') || []),\n };\n}\n\n/** @param {{status: PWABadgeStatus}} props */\nexport const PWAGauge = props => {\n const {status} = props;\n const all = status.optimized && status.installable && status.fastAndReliable;\n\n return (\n <div\n className={clsx('pwa-gauge', {\n 'pwa-gauge--all': all,\n 'pwa-gauge--pwa-optimized': !all && status.optimized,\n 'pwa-gauge--pwa-installable': !all && status.installable,\n 'pwa-gauge--pwa-fast-reliable': !all && status.fastAndReliable,\n })}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 60\">\n <defs>\n <linearGradient\n id=\"pwa-gauge__check-circle__gradient\"\n x1=\"50%\"\n y1=\"0%\"\n x2=\"50%\"\n y2=\"100%\"\n >\n <stop stop-color=\"#00C852\" offset=\"0%\" />\n <stop stop-color=\"#009688\" offset=\"100%\" />\n </linearGradient>\n <linearGradient\n id=\"pwa-gauge__installable__shadow-gradient\"\n x1=\"76.056%\"\n x2=\"24.111%\"\n y1=\"82.995%\"\n y2=\"24.735%\"\n >\n <stop stop-color=\"#A5D6A7\" offset=\"0%\" />\n <stop stop-color=\"#80CBC4\" offset=\"100%\" />\n </linearGradient>\n <linearGradient\n id=\"pwa-gauge__fast-reliable__shadow-gradient\"\n x1=\"76.056%\"\n y1=\"82.995%\"\n x2=\"25.678%\"\n y2=\"26.493%\"\n >\n <stop stop-color=\"#64B5F6\" offset=\"0%\" />\n <stop stop-color=\"#2979FF\" offset=\"100%\" />\n </linearGradient>\n\n <g id=\"pwa-gauge__fast-reliable-badge\">\n <circle fill=\"#FFFFFF\" cx=\"10\" cy=\"10\" r=\"10\" />\n <path\n fill=\"#304FFE\"\n d=\"M10 3.58l5.25 2.34v3.5c0 3.23-2.24 6.26-5.25 7-3.01-.74-5.25-3.77-5.25-7v-3.5L10 3.58zm-.47 10.74l2.76-4.83.03-.07c.04-.08 0-.24-.22-.24h-1.64l.47-3.26h-.47l-2.7 4.77c-.02.01.05-.1-.04.05-.09.16-.1.31.18.31h1.63l-.47 3.27h.47z\"\n />\n </g>\n <g id=\"pwa-gauge__installable-badge\">\n <circle fill=\"#FFFFFF\" cx=\"10\" cy=\"10\" r=\"10\" />\n <path\n fill=\"#009688\"\n d=\"M10 4.167A5.835 5.835 0 0 0 4.167 10 5.835 5.835 0 0 0 10 15.833 5.835 5.835 0 0 0 15.833 10 5.835 5.835 0 0 0 10 4.167zm2.917 6.416h-2.334v2.334H9.417v-2.334H7.083V9.417h2.334V7.083h1.166v2.334h2.334v1.166z\"\n />\n </g>\n </defs>\n\n <g stroke=\"none\" fill-rule=\"nonzero\">\n {/* Background and PWA logo (color by default) */}\n <circle class=\"pwa-gauge__disc\" cx=\"30\" cy=\"30\" r=\"30\" />\n <g class=\"pwa-gauge__logo\">\n <path\n class=\"pwa-gauge__logo--secondary-color\"\n d=\"M35.66 19.39l.7-1.75h2L37.4 15 38.6 12l3.4 9h-2.51l-.58-1.61z\"\n />\n <path\n class=\"pwa-gauge__logo--primary-color\"\n d=\"M33.52 21l3.65-9h-2.42l-2.5 5.82L30.5 12h-1.86l-1.9 5.82-1.35-2.65-1.21 3.72L25.4 21h2.38l1.72-5.2 1.64 5.2z\"\n />\n <path\n class=\"pwa-gauge__logo--secondary-color\"\n fill-rule=\"nonzero\"\n d=\"M20.3 17.91h1.48c.45 0 .85-.05 1.2-.15l.39-1.18 1.07-3.3a2.64 2.64 0 0 0-.28-.37c-.55-.6-1.36-.91-2.42-.91H18v9h2.3V17.9zm1.96-3.84c.22.22.33.5.33.87 0 .36-.1.65-.29.87-.2.23-.59.35-1.15.35h-.86v-2.41h.87c.52 0 .89.1 1.1.32z\"\n />\n </g>\n\n {/* No badges. */}\n <rect\n class=\"pwa-gauge__component pwa-gauge__na-line\"\n fill=\"#FFFFFF\"\n x=\"20\"\n y=\"32\"\n width=\"20\"\n height=\"4\"\n rx=\"2\"\n />\n\n {/* Just fast and reliable. */}\n <g\n class=\"pwa-gauge__component pwa-gauge__fast-reliable-badge\"\n transform=\"translate(20, 29)\"\n >\n <path\n fill=\"url(#pwa-gauge__fast-reliable__shadow-gradient)\"\n d=\"M33.63 19.49A30 30 0 0 1 16.2 30.36L3 17.14 17.14 3l16.49 16.49z\"\n />\n <use href=\"#pwa-gauge__fast-reliable-badge\" />\n </g>\n\n {/* Just installable. */}\n <g\n class=\"pwa-gauge__component pwa-gauge__installable-badge\"\n transform=\"translate(20, 29)\"\n >\n <path\n fill=\"url(#pwa-gauge__installable__shadow-gradient)\"\n d=\"M33.629 19.487c-4.272 5.453-10.391 9.39-17.415 10.869L3 17.142 17.142 3 33.63 19.487z\"\n />\n <use href=\"#pwa-gauge__installable-badge\" />\n </g>\n\n {/* Fast and reliable and installable. */}\n <g class=\"pwa-gauge__component pwa-gauge__fast-reliable-installable-badges\">\n <g transform=\"translate(8, 29)\">\n {/* fast and reliable */}\n <path\n fill=\"url(#pwa-gauge__fast-reliable__shadow-gradient)\"\n d=\"M16.321 30.463L3 17.143 17.142 3l22.365 22.365A29.864 29.864 0 0 1 22 31c-1.942 0-3.84-.184-5.679-.537z\"\n />\n <use href=\"#pwa-gauge__fast-reliable-badge\" />\n </g>\n <g transform=\"translate(32, 29)\">\n {/* installable */}\n <path\n fill=\"url(#pwa-gauge__installable__shadow-gradient)\"\n d=\"M25.982 11.84a30.107 30.107 0 0 1-13.08 15.203L3 17.143 17.142 3l8.84 8.84z\"\n />\n <use href=\"#pwa-gauge__installable-badge\" />\n </g>\n </g>\n\n {/* Full PWA. */}\n <g class=\"pwa-gauge__component pwa-gauge__check-circle\" transform=\"translate(18, 28)\">\n <circle fill=\"#FFFFFF\" cx=\"12\" cy=\"12\" r=\"12\" />\n <path\n fill=\"url(#pwa-gauge__check-circle__gradient)\"\n d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n />\n </g>\n </g>\n </svg>\n </div>\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport './score-delta-badge.css';\nimport {getDiffLabel} from '@lhci/utils/src/audit-diff-finder';\nimport clsx from 'clsx';\n\n/** @param {{diff: LHCI.NumericAuditDiff, className?: string}} props */\nexport const ScoreDeltaBadge = props => {\n const delta = Math.round((props.diff.compareValue - props.diff.baseValue) * 100);\n return (\n <div\n className={clsx(\n 'score-delta-badge',\n `score-delta-badge--${getDiffLabel(props.diff)}`,\n props.className\n )}\n >\n {delta < 0 ? delta : `+${delta}`}\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport './lhr-comparison-scores.css';\nimport clsx from 'clsx';\n\nimport {Gauge} from '../../components/gauge';\nimport {\n PWAGauge,\n getBadgeStatus,\n FastReliableIcon,\n InstallableIcon,\n OptimizedIcon,\n getBadgeDiffType,\n} from '../../components/pwa-gauge';\nimport {ScoreDeltaBadge} from '../../components/score-delta-badge';\n\n/** @param {{lhr: LH.Result, baseLhr?: LH.Result, categoryId: string}} props */\nconst StandardScoreItem = props => {\n const {lhr, baseLhr, categoryId} = props;\n const category = lhr.categories[categoryId];\n const baseCategory = baseLhr && baseLhr.categories[categoryId];\n /** @type {LHCI.NumericAuditDiff|undefined} */\n const diff = baseCategory && {\n auditId: '',\n type: 'score',\n baseValue: baseCategory.score,\n compareValue: category.score,\n };\n\n return (\n <div key={categoryId} className={clsx('lhr-comparison-scores-item')}>\n <Gauge score={category.score} diff={diff} />\n <div className=\"lhr-comparison-scores-item__label\">{category.title}</div>\n {diff ? <ScoreDeltaBadge diff={diff} className=\"lhr-comparison-scores-item__delta\" /> : null}\n </div>\n );\n};\n\n/** @param {{lhr: LH.Result, baseLhr?: LH.Result, categoryId: string}} props */\nconst PwaScoreItem = props => {\n const {lhr, baseLhr, categoryId} = props;\n const compareStatus = getBadgeStatus(lhr);\n let deltaEl;\n const overallStatus = 'neutral';\n\n if (baseLhr) {\n const baseStatus = getBadgeStatus(baseLhr);\n const diffTypes = {\n fastAndReliable: getBadgeDiffType(baseStatus, compareStatus, 'fastAndReliable'),\n installable: getBadgeDiffType(baseStatus, compareStatus, 'installable'),\n optimized: getBadgeDiffType(baseStatus, compareStatus, 'optimized'),\n };\n const allEqual = Object.values(diffTypes).every(type => type === 'neutral');\n\n const individualBadges = (\n <Fragment>\n {diffTypes.fastAndReliable === 'neutral' ? (\n <Fragment />\n ) : (\n <FastReliableIcon deltaType={diffTypes.fastAndReliable} />\n )}\n {diffTypes.installable === 'neutral' ? (\n <Fragment />\n ) : (\n <InstallableIcon deltaType={diffTypes.installable} />\n )}\n {diffTypes.optimized === 'neutral' ? (\n <Fragment />\n ) : (\n <OptimizedIcon deltaType={diffTypes.optimized} />\n )}\n </Fragment>\n );\n\n deltaEl = (\n <div className={clsx('lhr-comparison-scores-item__delta')}>\n {allEqual ? '-' : individualBadges}\n </div>\n );\n }\n\n return (\n <div\n key={categoryId}\n className={clsx(\n 'lhr-comparison-scores-item',\n `lhr-comparison-scores-item--pwa`,\n `lhr-comparison-scores-item--${overallStatus}`\n )}\n >\n <PWAGauge status={compareStatus} />\n <div className=\"lhr-comparison-scores-item__label\">PWA</div>\n {deltaEl}\n </div>\n );\n};\n\n/**\n * @param {{lhr?: LH.Result, baseLhr?: LH.Result}} props\n */\nexport const LhrComparisonScores = props => {\n const {lhr, baseLhr} = props;\n if (!lhr) return null;\n\n const compareCategoryIds = Object.keys(lhr.categories);\n const baseCategoryIds = baseLhr ? Object.keys(baseLhr.categories) : compareCategoryIds;\n const categoryIds = compareCategoryIds.filter(id => baseCategoryIds.includes(id));\n\n return (\n <div className=\"lhr-comparison-scores\">\n {categoryIds\n .sort((idA, idB) => {\n const sortKeyA = idA === 'pwa' ? Infinity : categoryIds.indexOf(idA);\n const sortKeyB = idB === 'pwa' ? Infinity : categoryIds.indexOf(idB);\n return sortKeyA - sortKeyB;\n })\n .map(id => {\n return id === 'pwa' ? (\n <PwaScoreItem lhr={lhr} baseLhr={baseLhr} categoryId={id} />\n ) : (\n <StandardScoreItem lhr={lhr} baseLhr={baseLhr} categoryId={id} />\n );\n })}\n </div>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport './audit-group.css';\nimport {Paper} from '../../../components/paper';\nimport {ScoreIcon} from '../../../components/score-icon';\nimport clsx from 'clsx';\nimport {AuditDiff} from './audit-diff';\nimport {useState} from 'preact/hooks';\nimport {openLhrInClassicViewer} from '../../../components/lhr-viewer-link';\n\n/** @typedef {{key?: string, group: {id: string, title: string}, selectedAuditId: string|null, setSelectedAuditId: (id: string|null) => void, pairs: Array<LHCI.AuditPair>, baseLhr?: LH.Result, showAsNarrow: boolean, showAsUnchanged: boolean}} Props */\n\n/** @param {Props & {showAsBigPicture: boolean, setShowAsBigPicture: (b: boolean) => void}} props */\nconst MetricsTabHeader = props => {\n return (\n <div className=\"audit-group__big-picture-tabs\">\n <span\n className={clsx('big-picture-tabs__tab', {\n 'big-picture-tabs__tab--selected': props.showAsBigPicture,\n })}\n onClick={() => props.setShowAsBigPicture(true)}\n >\n Overview\n </span>\n <span\n className={clsx('big-picture-tabs__tab', {\n 'big-picture-tabs__tab--selected': !props.showAsBigPicture,\n })}\n onClick={() => props.setShowAsBigPicture(false)}\n >\n Magnified\n </span>\n </div>\n );\n};\n\n/** @param {Props & {showAsBigPicture: boolean}} props */\nconst ChangedAuditList = props => {\n return (\n <Fragment>\n {props.pairs.map(pair => {\n const {audit} = pair;\n\n // Only metrics are allowed to display the numericValue diff in this view.\n if (props.group.id !== 'metrics') {\n pair = {...pair, diffs: pair.diffs.filter(diff => diff.type !== 'numericValue')};\n }\n\n return (\n <div\n key={audit.id}\n className={clsx('audit-group__audit')}\n onClick={() => props.setSelectedAuditId(audit.id || null)}\n >\n <div className=\"audit-group__audit-score\">\n <ScoreIcon score={audit.score || 0} />\n </div>\n <div className=\"audit-group__audit-title\">{audit.title}</div>\n <div className=\"audit-group__audit-diff\">\n <AuditDiff\n pair={pair}\n showAsBigPicture={props.showAsBigPicture}\n showAsNarrow={props.showAsNarrow}\n />\n </div>\n </div>\n );\n })}\n </Fragment>\n );\n};\n\n/** @param {Props & {expanded: boolean}} props */\nconst UnchangedAuditList = props => {\n const baseLhr = props.baseLhr;\n if (!baseLhr || !props.expanded) return <Fragment />;\n\n return (\n <Fragment>\n {props.pairs.map(pair => {\n const {audit} = pair;\n\n return (\n <div\n key={audit.id}\n className={clsx('audit-group__audit', 'audit-group__audit--unchanged')}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n openLhrInClassicViewer(baseLhr);\n }}\n >\n <div className=\"audit-group__audit-score\">\n <ScoreIcon score={audit.score || 0} />\n </div>\n <div className=\"audit-group__audit-title\">{audit.title}</div>\n <div className=\"audit-group__audit-diff\">Open Report</div>\n </div>\n );\n })}\n </Fragment>\n );\n};\n\n/** @param {Props} props */\nexport const AuditGroup = props => {\n const {group} = props;\n const [showAsBigPicture, setShowAsBigPicture] = useState(group.id === 'metrics');\n const [expanded, setExpanded] = useState(false);\n\n return (\n <Paper\n className={clsx('audit-group', {\n 'audit-group--expanded': expanded,\n 'audit-group--unchanged': props.showAsUnchanged,\n })}\n >\n <div className=\"audit-group__header\" onClick={() => setExpanded(!expanded)}>\n <div className=\"audit-group__title\">\n {group.title} {props.showAsUnchanged ? `(${props.pairs.length})` : ''}\n </div>\n <div className=\"audit-group__expand-toggle\">\n <i className=\"material-icons\">chevron_right</i>\n </div>\n {group.id === 'metrics' && !props.showAsNarrow ? (\n <MetricsTabHeader\n {...props}\n showAsBigPicture={showAsBigPicture}\n setShowAsBigPicture={setShowAsBigPicture}\n />\n ) : (\n <Fragment />\n )}\n </div>\n <div className=\"audit-group__audits\">\n {props.showAsUnchanged ? (\n <UnchangedAuditList {...props} expanded={expanded} />\n ) : (\n <ChangedAuditList {...props} showAsBigPicture={showAsBigPicture} />\n )}\n </div>\n </Paper>\n );\n};\n", "/**\n * @license Copyright 2019 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport './lhr-comparison-legend.css';\nimport {ScoreIcon} from '../../components/score-icon';\n\nexport const LhrComparisonLegend = () => {\n return (\n <div className=\"lhr-comparison-legend\">\n <ScoreIcon score={0} />\n <span className=\"lhr-comparison-legend__label\">0-49</span>\n <ScoreIcon score={0.5} />\n <span className=\"lhr-comparison-legend__label\">50-89</span>\n <ScoreIcon score={1} />\n <span className=\"lhr-comparison-legend__label\">90-100</span>\n <i className=\"lhr-comparison-legend__chip lhr-comparison-legend__chip--regression\" />\n <span className=\"lhr-comparison-legend__label\">Regression</span>\n <i className=\"lhr-comparison-legend__chip lhr-comparison-legend__chip--improvement\" />\n <span className=\"lhr-comparison-legend__label\">Improvement</span>\n </div>\n );\n};\n", "/**\n * Assign properties from `props` to `obj`\n * @template O, P The obj and props types\n * @param {O} obj The object to copy properties to\n * @param {P} props The object to copy properties from\n * @returns {O & P}\n */\nexport function assign(obj, props) {\n\tfor (let i in props) obj[i] = props[i];\n\treturn /** @type {O & P} */ (obj);\n}\n\n/**\n * Remove a child node from its parent if attached. This is a workaround for\n * IE11 which doesn't support `Element.prototype.remove()`. Using this function\n * is smaller than including a dedicated polyfill.\n * @param {Node} node The node to remove\n */\nexport function removeNode(node) {\n\tlet parentNode = node.parentNode;\n\tif (parentNode) parentNode.removeChild(node);\n}\n", "import { Component, createElement, _unmount as unmount, options } from 'preact';\nimport { removeNode } from '../../src/util';\n\nconst oldCatchError = options._catchError;\noptions._catchError = function (error, newVNode, oldVNode) {\n\tif (error.then && oldVNode) {\n\n\t\t/** @type {import('./internal').Component} */\n\t\tlet component;\n\t\tlet vnode = newVNode;\n\n\t\tfor (; vnode = vnode._parent;) {\n\t\t\tif ((component = vnode._component) && component._childDidSuspend) {\n\t\t\t\tif (oldVNode) {\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t}\n\n\t\t\t\tcomponent._childDidSuspend(error);\n\t\t\t\treturn; // Don't call oldCatchError if we found a Suspense\n\t\t\t}\n\t\t}\n\t}\n\n\toldCatchError(error, newVNode, oldVNode);\n};\n\nfunction detachDom(children) {\n\tfor (let i = 0; i < children.length; i++) {\n\t\tlet child = children[i];\n\t\tif (child != null) {\n\t\t\tif (typeof child.type !== 'function' && child._dom) {\n\t\t\t\tremoveNode(child._dom);\n\t\t\t}\n\t\t\telse if (child._children) {\n\t\t\t\tdetachDom(child._children);\n\t\t\t}\n\t\t}\n\t}\n}\n\n// having custom inheritance instead of a class here saves a lot of bytes\nexport function Suspense() {\n\t// we do not call super here to golf some bytes...\n\tthis._suspensions = [];\n}\n\n// Things we do here to save some bytes but are not proper JS inheritance:\n// - call `new Component()` as the prototype\n// - do not set `Suspense.prototype.constructor` to `Suspense`\nSuspense.prototype = new Component();\n\n/**\n * @param {Promise} promise The thrown promise\n */\nSuspense.prototype._childDidSuspend = function(promise) {\n\n\t/** @type {import('./internal').SuspenseComponent} */\n\tconst c = this;\n\tc._suspensions.push(promise);\n\n\tconst onSuspensionComplete = () => {\n\t\t// From https://twitter.com/Rich_Harris/status/1125850391155965952\n\t\tc._suspensions[c._suspensions.indexOf(promise)] = c._suspensions[c._suspensions.length - 1];\n\t\tc._suspensions.pop();\n\n\t\tif (c._suspensions.length == 0) {\n\t\t\tunmount(c.props.fallback);\n\t\t\tc._vnode._dom = null;\n\n\t\t\tc._vnode._children = c.state._parkedChildren;\n\t\t\tc.setState({ _parkedChildren: null });\n\t\t}\n\t};\n\n\tif (c.state._parkedChildren == null) {\n\t\tc.setState({ _parkedChildren: c._vnode._children });\n\t\tdetachDom(c._vnode._children);\n\t\tc._vnode._children = [];\n\t}\n\n\tpromise.then(onSuspensionComplete, onSuspensionComplete);\n};\n\nSuspense.prototype.render = function(props, state) {\n\treturn state._parkedChildren ? props.fallback : props.children;\n};\n\nexport function lazy(loader) {\n\tlet prom;\n\tlet component;\n\tlet error;\n\n\tfunction Lazy(props) {\n\t\tif (!prom) {\n\t\t\tprom = loader();\n\t\t\tprom.then(\n\t\t\t\t(exports) => { component = exports.default; },\n\t\t\t\t(e) => { error = e; },\n\t\t\t);\n\t\t}\n\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (!component) {\n\t\t\tthrow prom;\n\t\t}\n\n\t\treturn createElement(component, props);\n\t}\n\n\tLazy.displayName = 'Lazy';\n\tLazy._forwarded = true;\n\treturn Lazy;\n}\n", "import { hydrate, render as preactRender, cloneElement as preactCloneElement, createRef, h, Component, options, toChildArray, createContext, Fragment, _unmount } from 'preact';\nimport { useState, useReducer, useEffect, useLayoutEffect, useRef, useImperativeHandle, useMemo, useCallback, useContext, useDebugValue } from 'preact/hooks';\nimport { Suspense, lazy } from './suspense';\nimport { assign, removeNode } from '../../src/util';\n\nconst version = '16.8.0'; // trick libraries to think we are react\n\n/* istanbul ignore next */\nconst REACT_ELEMENT_TYPE = (typeof Symbol!=='undefined' && Symbol.for && Symbol.for('react.element')) || 0xeac7;\n\nconst CAMEL_PROPS = /^(?:accent|alignment|arabic|baseline|cap|clip|color|fill|flood|font|glyph|horiz|marker|overline|paint|stop|strikethrough|stroke|text|underline|unicode|units|v|vector|vert|word|writing|x)[A-Z]/;\n\nlet oldEventHook = options.event;\noptions.event = e => {\n\t/* istanbul ignore next */\n\tif (oldEventHook) e = oldEventHook(e);\n\te.persist = () => {};\n\treturn e.nativeEvent = e;\n};\n\n/**\n * Legacy version of createElement.\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor\n */\nfunction createFactory(type) {\n\treturn createElement.bind(null, type);\n}\n\n/**\n * Normalize DOM vnode properties.\n * @param {import('./internal').VNode} vnode The vnode to normalize props of\n * @param {object | null | undefined} props props to normalize\n */\nfunction handleElementVNode(vnode, props) {\n\tlet shouldSanitize, attrs, i;\n\tfor (i in props) if ((shouldSanitize = CAMEL_PROPS.test(i))) break;\n\tif (shouldSanitize) {\n\t\tattrs = vnode.props = {};\n\t\tfor (i in props) {\n\t\t\tattrs[CAMEL_PROPS.test(i) ? i.replace(/([A-Z0-9])/, '-$1').toLowerCase() : i] = props[i];\n\t\t}\n\t}\n}\n\n/**\n * Proxy render() since React returns a Component reference.\n * @param {import('./internal').VNode} vnode VNode tree to render\n * @param {import('./internal').PreactElement} parent DOM node to render vnode tree into\n * @param {() => void} [callback] Optional callback that will be called after rendering\n * @returns {import('./internal').Component | null} The root component reference or null\n */\nfunction render(vnode, parent, callback) {\n\t// React destroys any existing DOM nodes, see #1727\n\t// ...but only on the first render, see #1828\n\tif (parent._children==null) {\n\t\twhile (parent.firstChild) {\n\t\t\tremoveNode(parent.firstChild);\n\t\t}\n\t}\n\n\tpreactRender(vnode, parent);\n\tif (typeof callback==='function') callback();\n\n\treturn vnode ? vnode._component : null;\n}\n\nclass ContextProvider {\n\tgetChildContext() {\n\t\treturn this.props.context;\n\t}\n\trender(props) {\n\t\treturn props.children;\n\t}\n}\n\n/**\n * Portal component\n * @param {object | null | undefined} props\n */\nfunction Portal(props) {\n\tlet _this = this;\n\tlet container = props.container;\n\tlet wrap = h(ContextProvider, { context: _this.context }, props.vnode);\n\n\t// When we change container we should clear our old container and\n\t// indicate a new mount.\n\tif (_this._container && _this._container !== container) {\n\t\tif (_this._temp.parentNode) _this._container.removeChild(_this._temp);\n\t\t_unmount(_this._wrap);\n\t\t_this._hasMounted = false;\n\t}\n\n\t// When props.vnode is undefined/false/null we are dealing with some kind of\n\t// conditional vnode. This should not trigger a render.\n\tif (props.vnode) {\n\t\tif (!_this._hasMounted) {\n\t\t\t// Create a placeholder that we can use to insert into.\n\t\t\t_this._temp = document.createTextNode('');\n\t\t\t// Hydrate existing nodes to keep the dom intact, when rendering\n\t\t\t// wrap into the container.\n\t\t\thydrate('', container);\n\t\t\t// Append to the container (this matches React's behavior)\n\t\t\tcontainer.appendChild(_this._temp);\n\t\t\t// At this point we have mounted and should set our container.\n\t\t\t_this._hasMounted = true;\n\t\t\t_this._container = container;\n\t\t\t// Render our wrapping element into temp.\n\t\t\tpreactRender(wrap, container, _this._temp);\n\t\t\t_this._children = this._temp._children;\n\t\t}\n\t\telse {\n\t\t\t// When we have mounted and the vnode is present it means the\n\t\t\t// props have changed or a parent is triggering a rerender.\n\t\t\t// This implies we only need to call render. But we need to keep\n\t\t\t// the old tree around, otherwise will treat the vnodes as new and\n\t\t\t// will wrongly call `componentDidMount` on them\n\t\t\tcontainer._children = _this._children;\n\t\t\tpreactRender(wrap, container);\n\t\t\t_this._children = container._children;\n\t\t}\n\t}\n\t// When we come from a conditional render, on a mounted\n\t// portal we should clear the DOM.\n\telse if (_this._hasMounted) {\n\t\tif (_this._temp.parentNode) _this._container.removeChild(_this._temp);\n\t\t_unmount(_this._wrap);\n\t}\n\t// Set the wrapping element for future unmounting.\n\t_this._wrap = wrap;\n\n\t_this.componentWillUnmount = () => {\n\t\tif (_this._temp.parentNode) _this._container.removeChild(_this._temp);\n\t\t_unmount(_this._wrap);\n\t};\n\n\treturn null;\n}\n\n/**\n * Create a `Portal` to continue rendering the vnode tree at a different DOM node\n * @param {import('./internal').VNode} vnode The vnode to render\n * @param {import('./internal').PreactElement} container The DOM node to continue rendering in to.\n */\nfunction createPortal(vnode, container) {\n\treturn h(Portal, { vnode, container });\n}\n\nconst mapFn = (children, fn) => {\n\tif (!children) return null;\n\treturn toChildArray(children).map(fn);\n};\n\n// This API is completely unnecessary for Preact, so it's basically passthrough.\nlet Children = {\n\tmap: mapFn,\n\tforEach: mapFn,\n\tcount(children) {\n\t\treturn children ? toChildArray(children).length : 0;\n\t},\n\tonly(children) {\n\t\tchildren = toChildArray(children);\n\t\tif (children.length!==1) throw new Error('Children.only() expects only one child.');\n\t\treturn children[0];\n\t},\n\ttoArray: toChildArray\n};\n\n/**\n * Wrap `createElement` to apply various vnode normalizations.\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor\n * @param {object | null | undefined} [props] The vnode's properties\n * @param {Array<import('./internal').ComponentChildren>} [children] The vnode's children\n * @returns {import('./internal').VNode}\n */\nfunction createElement(...args) {\n\tlet vnode = h(...args);\n\n\tlet type = vnode.type, props = vnode.props;\n\tif (typeof type!='function') {\n\t\tif (props.defaultValue) {\n\t\t\tif (!props.value && props.value!==0) {\n\t\t\t\tprops.value = props.defaultValue;\n\t\t\t}\n\t\t\tdelete props.defaultValue;\n\t\t}\n\n\t\tif (Array.isArray(props.value) && props.multiple && type==='select') {\n\t\t\ttoChildArray(props.children).forEach((child) => {\n\t\t\t\tif (props.value.indexOf(child.props.value)!=-1) {\n\t\t\t\t\tchild.props.selected = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tdelete props.value;\n\t\t}\n\t\thandleElementVNode(vnode, props);\n\t}\n\n\tvnode.preactCompatNormalized = false;\n\treturn normalizeVNode(vnode);\n}\n\n/**\n * Normalize a vnode\n * @param {import('./internal').VNode} vnode\n */\nfunction normalizeVNode(vnode) {\n\tvnode.preactCompatNormalized = true;\n\tapplyClassName(vnode);\n\treturn vnode;\n}\n\n/**\n * Wrap `cloneElement` to abort if the passed element is not a valid element and apply\n * all vnode normalizations.\n * @param {import('./internal').VNode} element The vnode to clone\n * @param {object} props Props to add when cloning\n * @param {Array<import('./internal').ComponentChildren>} rest Optional component children\n */\nfunction cloneElement(element) {\n\tif (!isValidElement(element)) return element;\n\tlet vnode = normalizeVNode(preactCloneElement.apply(null, arguments));\n\treturn vnode;\n}\n\n/**\n * Check if the passed element is a valid (p)react node.\n * @param {*} element The element to check\n * @returns {boolean}\n */\nfunction isValidElement(element) {\n\treturn !!element && element.$$typeof===REACT_ELEMENT_TYPE;\n}\n\n/**\n * Normalize event handlers like react does. Most famously it uses `onChange` for any input element.\n * @param {import('./internal').VNode} vnode The vnode to normalize events on\n */\nfunction applyEventNormalization({ type, props }) {\n\tif (!props || typeof type!='string') return;\n\tlet newProps = {};\n\n\tfor (let i in props) {\n\t\tif (/^on(Ani|Tra)/.test(i)) {\n\t\t\tprops[i.toLowerCase()] = props[i];\n\t\t\tdelete props[i];\n\t\t}\n\t\tnewProps[i.toLowerCase()] = i;\n\n\t}\n\tif (newProps.ondoubleclick) {\n\t\tprops.ondblclick = props[newProps.ondoubleclick];\n\t\tdelete props[newProps.ondoubleclick];\n\t}\n\tif (newProps.onbeforeinput) {\n\t\tprops.onbeforeinput = props[newProps.onbeforeinput];\n\t\tdelete props[newProps.onbeforeinput];\n\t}\n\t// for *textual inputs* (incl textarea), normalize `onChange` -> `onInput`:\n\tif (newProps.onchange && (type==='textarea' || (type.toLowerCase()==='input' && !/^fil|che|ra/i.test(props.type)))) {\n\t\tlet normalized = newProps.oninput || 'oninput';\n\t\tif (!props[normalized]) {\n\t\t\tprops[normalized] = props[newProps.onchange];\n\t\t\tdelete props[newProps.onchange];\n\t\t}\n\t}\n}\n\n/**\n * Remove a component tree from the DOM, including state and event handlers.\n * @param {import('./internal').PreactElement} container\n * @returns {boolean}\n */\nfunction unmountComponentAtNode(container) {\n\tif (container._children) {\n\t\tpreactRender(null, container);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Alias `class` prop to `className` if available\n * @param {import('./internal').VNode} vnode\n */\nfunction applyClassName(vnode) {\n\tlet a = vnode.props;\n\tif (a.class || a.className) {\n\t\tclassNameDescriptor.enumerable = 'className' in a;\n\t\tif (a.className) a.class = a.className;\n\t\tObject.defineProperty(a, 'className', classNameDescriptor);\n\t}\n}\n\nlet classNameDescriptor = {\n\tconfigurable: true,\n\tget() { return this.class; }\n};\n\n/**\n * Check if two objects have a different shape\n * @param {object} a\n * @param {object} b\n * @returns {boolean}\n */\nfunction shallowDiffers(a, b) {\n\tfor (let i in a) if (i !== '__source' && !(i in b)) return true;\n\tfor (let i in b) if (i !== '__source' && a[i]!==b[i]) return true;\n\treturn false;\n}\n\n/**\n * Get the matching DOM node for a component\n * @param {import('./internal').Component} component\n * @returns {import('./internal').PreactElement | null}\n */\nfunction findDOMNode(component) {\n\treturn component && (component.base || component.nodeType === 1 && component) || null;\n}\n\n/**\n * Component class with a predefined `shouldComponentUpdate` implementation\n */\nclass PureComponent extends Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\t// Some third-party libraries check if this property is present\n\t\tthis.isPureReactComponent = true;\n\t}\n\n\tshouldComponentUpdate(props, state) {\n\t\treturn shallowDiffers(this.props, props) || shallowDiffers(this.state, state);\n\t}\n}\n\n// Some libraries like `react-virtualized` explicitly check for this.\nComponent.prototype.isReactComponent = {};\n\n/**\n * Memoize a component, so that it only updates when the props actually have\n * changed. This was previously known as `React.pure`.\n * @param {import('./internal').FunctionalComponent} c functional component\n * @param {(prev: object, next: object) => boolean} [comparer] Custom equality function\n * @returns {import('./internal').FunctionalComponent}\n */\nfunction memo(c, comparer) {\n\tfunction shouldUpdate(nextProps) {\n\t\tlet ref = this.props.ref;\n\t\tlet updateRef = ref==nextProps.ref;\n\t\tif (!updateRef && ref) {\n\t\t\tref.call ? ref(null) : (ref.current = null);\n\t\t}\n\t\treturn (!comparer\n\t\t\t? shallowDiffers(this.props, nextProps)\n\t\t\t: !comparer(this.props, nextProps)) || !updateRef;\n\t}\n\n\tfunction Memoed(props) {\n\t\tthis.shouldComponentUpdate = shouldUpdate;\n\t\treturn h(c, assign({}, props));\n\t}\n\tMemoed.prototype.isReactComponent = true;\n\tMemoed.displayName = 'Memo(' + (c.displayName || c.name) + ')';\n\tMemoed._forwarded = true;\n\treturn Memoed;\n}\n\n/**\n * Pass ref down to a child. This is mainly used in libraries with HOCs that\n * wrap components. Using `forwardRef` there is an easy way to get a reference\n * of the wrapped component instead of one of the wrapper itself.\n * @param {import('./internal').ForwardFn} fn\n * @returns {import('./internal').FunctionalComponent}\n */\nfunction forwardRef(fn) {\n\tfunction Forwarded(props) {\n\t\tlet ref = props.ref;\n\t\tdelete props.ref;\n\t\treturn fn(props, ref);\n\t}\n\tForwarded.prototype.isReactComponent = true;\n\tForwarded._forwarded = true;\n\tForwarded.displayName = 'ForwardRef(' + (fn.displayName || fn.name) + ')';\n\treturn Forwarded;\n}\n\n// Patch in `UNSAFE_*` lifecycle hooks\nfunction setSafeDescriptor(proto, key) {\n\tif (proto['UNSAFE_'+key] && !proto[key]) {\n\t\tObject.defineProperty(proto, key, {\n\t\t\tconfigurable: false,\n\t\t\tget() { return this['UNSAFE_' + key]; },\n\t\t\tset(v) { this['UNSAFE_' + key] = v; }\n\t\t});\n\t}\n}\n\nlet oldVNodeHook = options.vnode;\noptions.vnode = vnode => {\n\tvnode.$$typeof = REACT_ELEMENT_TYPE;\n\n\tapplyEventNormalization(vnode);\n\tlet type = vnode.type;\n\tif (type && type._forwarded && vnode.ref) {\n\t\tvnode.props.ref = vnode.ref;\n\t\tvnode.ref = null;\n\t}\n\n\t// We can't just patch the base component class, because components that use\n\t// inheritance and are transpiled down to ES5 will overwrite our patched\n\t// getters and setters. See #1941\n\tif (typeof type === 'function' && !type._patchedLifecycles && type.prototype) {\n\t\tsetSafeDescriptor(type.prototype, 'componentWillMount');\n\t\tsetSafeDescriptor(type.prototype, 'componentWillReceiveProps');\n\t\tsetSafeDescriptor(type.prototype, 'componentWillUpdate');\n\t\ttype._patchedLifecycles = true;\n\t}\n\t/* istanbul ignore next */\n\tif (oldVNodeHook) oldVNodeHook(vnode);\n};\n\n/**\n * Deprecated way to control batched rendering inside the reconciler, but we\n * already schedule in batches inside our rendering code\n * @template Arg\n * @param {(arg: Arg) => void} callback function that triggers the updated\n * @param {Arg} [arg] Optional argument that can be passed to the callback\n */\n// eslint-disable-next-line camelcase\nconst unstable_batchedUpdates = (callback, arg) => callback(arg);\n\nexport * from 'preact/hooks';\nexport {\n\tversion,\n\tChildren,\n\trender,\n\trender as hydrate,\n\tunmountComponentAtNode,\n\tcreatePortal,\n\tcreateElement,\n\tcreateContext,\n\tcreateFactory,\n\tcloneElement,\n\tcreateRef,\n\tFragment,\n\tisValidElement,\n\tfindDOMNode,\n\tComponent,\n\tPureComponent,\n\tmemo,\n\tforwardRef,\n\t// eslint-disable-next-line camelcase\n\tunstable_batchedUpdates,\n\tSuspense,\n\tlazy\n};\n\n// React copies the named exports to the default one.\nexport default {\n\tuseState,\n\tuseReducer,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseCallback,\n\tuseContext,\n\tuseDebugValue,\n\tversion,\n\tChildren,\n\trender,\n\thydrate: render,\n\tunmountComponentAtNode,\n\tcreatePortal,\n\tcreateElement,\n\tcreateContext,\n\tcreateFactory,\n\tcloneElement,\n\tcreateRef,\n\tFragment,\n\tisValidElement,\n\tfindDOMNode,\n\tComponent,\n\tPureComponent,\n\tmemo,\n\tforwardRef,\n\tunstable_batchedUpdates,\n\tSuspense,\n\tlazy\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport {createPortal, useRef, useEffect} from 'preact/compat';\nimport clsx from 'clsx';\nimport './modal.css';\n\n/** @param {{className?: string, children: LHCI.PreactNode, onClose: () => void}} props */\nexport const Modal = props => {\n const modalRootRef = useRef(\n document.getElementById('preact-modal-root') || document.createElement('div')\n );\n\n useEffect(() => {\n modalRootRef.current.id = 'preact-modal-root';\n document.body.appendChild(modalRootRef.current);\n return () => document.body.removeChild(modalRootRef.current);\n }, []);\n\n return createPortal(\n <div className=\"modal-backdrop\">\n <div className={clsx('modal', props.className)} style={{position: 'relative'}}>\n {props.children}\n <div className=\"modal__close\" onClick={props.onClose}>\n <i className=\"material-icons\">close</i>\n </div>\n </div>\n </div>,\n modalRootRef.current\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport './lhr-comparison-runtime-diff.css';\nimport clsx from 'clsx';\n\n/** @typedef {{label: string, base: string, compare: string, severity: 'warn'|'error'}} RuntimeDiff */\n\n/** @param {any} value */\nfunction getStringValueFromRawConfigSetting(value) {\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return value.toString();\n if (typeof value === 'undefined') return 'Unset';\n if (typeof value === 'boolean') return value ? 'Enabled' : 'Disabled';\n if (Array.isArray(value)) return value.join(', ');\n return 'Unknown';\n}\n\n/**\n * @param {LH.Result} lhr\n * @param {LH.Result|undefined} baseLhr\n * @return {Array<RuntimeDiff>}\n */\nexport function computeRuntimeDiffs(lhr, baseLhr) {\n if (!baseLhr) return [];\n\n /** @type {Array<RuntimeDiff>} */\n const diffs = [];\n\n const {benchmarkIndex} = lhr.environment;\n const {benchmarkIndex: baseBenchmarkIndex} = baseLhr.environment;\n const benchmarkMultiplicativeDelta =\n Math.abs(benchmarkIndex - baseBenchmarkIndex) / Math.min(benchmarkIndex, baseBenchmarkIndex);\n if (benchmarkMultiplicativeDelta > 1.5) {\n diffs.push({\n label: 'CPU/Memory Power',\n base: baseLhr.environment.benchmarkIndex.toString(),\n compare: lhr.environment.benchmarkIndex.toString(),\n severity: benchmarkMultiplicativeDelta > 2 ? 'error' : 'warn',\n });\n }\n\n const settings = lhr.configSettings;\n const baseSettings = baseLhr.configSettings;\n const throttling = settings.throttling || {};\n const baseThrottling = settings.throttling || {};\n const potentialDiffs = [\n ['Lighthouse Version', baseLhr.lighthouseVersion, lhr.lighthouseVersion],\n ['Storage Reset', baseSettings.disableStorageReset, settings.disableStorageReset],\n ['Emulated Form Factor', baseSettings.emulatedFormFactor, settings.emulatedFormFactor],\n ['Throttling Method', baseSettings.throttlingMethod, settings.throttlingMethod],\n ['CPU Throttling', baseThrottling.cpuSlowdownMultiplier, throttling.cpuSlowdownMultiplier],\n ['Network RTT', baseThrottling.rttMs, throttling.rttMs],\n ['Network Throughput', baseThrottling.throughputKbps, throttling.throughputKbps],\n ['Network RTT', baseThrottling.requestLatencyMs, throttling.requestLatencyMs],\n [\n 'Network Throughput (Up)',\n baseThrottling.uploadThroughputKbps,\n throttling.uploadThroughputKbps,\n ],\n [\n 'Network Throughput (Down)',\n baseThrottling.downloadThroughputKbps,\n throttling.downloadThroughputKbps,\n ],\n ];\n\n for (const [label, rawBase, rawCompare] of potentialDiffs) {\n const base = getStringValueFromRawConfigSetting(rawBase);\n const compare = getStringValueFromRawConfigSetting(rawCompare);\n if (base === compare) continue;\n diffs.push({label, base, compare, severity: 'error'});\n }\n\n return diffs;\n}\n\n/**\n * @param {{diffs: Array<RuntimeDiff>, variant: 'mini'|'full'}} props\n */\nexport const LhrRuntimeDiff = props => {\n const {diffs} = props;\n\n return (\n <div\n className={clsx(\n 'lhr-comparison-runtime-diff',\n `lhr-comparison-runtime-diff--${props.variant}`\n )}\n >\n <div className=\"lhr-comparison__warning\">\n <i className=\"material-icons\">info</i>\n <div>\n Changes of runtime settings or the environment can substantially affect your Lighthouse\n scores and might be the reason for the differences here.\n </div>\n </div>\n <div className=\"lhr-comparison-runtime-diff__diffs\">\n The following runtime differences were detected:\n <table>\n <thead>\n <tr>\n <th />\n <th>Base</th>\n <th>Compare</th>\n </tr>\n </thead>\n <tbody>\n {diffs.map(diff => (\n <tr key={diff.label}>\n <td>{diff.label}</td>\n <td>{diff.base}</td>\n <td>{diff.compare}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport './comparison.css';\nimport {LH_LOGO_PATH} from '../../components/lhci-components.jsx';\nimport {ReportUploadBox, computeBestDisplayType} from '../../components/report-upload-box';\nimport {LhrComparison} from '../../../../../server/src/ui/routes/build-view/lhr-comparison';\n\n/** @typedef {import('../../app.jsx').ToastMessage} ToastMessage */\n/** @typedef {import('../../app.jsx').ReportData} ReportData */\n\n/** @param {{baseReport: ReportData, compareReport: ReportData, setBaseReport: (d: ReportData|undefined) => void, setCompareReport: (d: ReportData|undefined) => void, addToast: (t: ToastMessage) => void}} props */\nexport const ComparisonRoute = props => {\n const displayType = computeBestDisplayType(props.baseReport.lhr, props.compareReport.lhr);\n return (\n <div className=\"comparison\">\n <div className=\"comparison-header\">\n <div\n className=\"comparison-header__switcher\"\n onClick={() => {\n props.setBaseReport(props.compareReport);\n props.setCompareReport(props.baseReport);\n }}\n >\n <i className=\"material-icons\">swap_horiz</i>\n </div>\n <div className=\"comparison-header__logo\">\n <img\n src={LH_LOGO_PATH}\n alt=\"Lighthouse Logo\"\n onClick={() => {\n props.setBaseReport(undefined);\n props.setCompareReport(undefined);\n }}\n />\n </div>\n <div className=\"comparison-header__upload\">\n <ReportUploadBox\n variant=\"base\"\n dragTarget=\"self\"\n report={props.baseReport}\n setReport={props.setBaseReport}\n addToast={props.addToast}\n displayType={displayType}\n showOpenLhrLink\n />\n <ReportUploadBox\n variant=\"compare\"\n dragTarget=\"self\"\n report={props.compareReport}\n setReport={props.setCompareReport}\n addToast={props.addToast}\n displayType={displayType}\n showOpenLhrLink\n />\n </div>\n <a className=\"comparison-header__info\" href=\"https://github.com/GoogleChrome/lighthouse-ci\">\n <i className=\"material-icons\">info</i>\n </a>\n </div>\n <div className=\"comparison-body\">\n <LhrComparison\n lhr={props.compareReport.lhr}\n baseLhr={props.baseReport.lhr}\n hookElements={{}}\n />\n </div>\n </div>\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h} from 'preact';\nimport './toast.css';\nimport {useEffect} from 'preact/hooks';\n\n/** @typedef {import('../app.jsx').ToastMessage} ToastMessage */\n\n/** @param {{toast: ToastMessage, setToasts: import('preact/hooks/src').StateUpdater<Array<ToastMessage>>}} props */\nexport const Toast = props => {\n const setToasts = props.setToasts;\n const {message, level = 'info'} = props.toast;\n\n useEffect(() => {\n const interval = setTimeout(\n () => setToasts(toasts => toasts.filter(t => t !== props.toast)),\n 5000\n );\n return () => clearInterval(interval);\n }, []);\n\n return <div className={`toast toast--${level}`}>{message}</div>;\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, Fragment} from 'preact';\nimport {useState, useEffect, useCallback} from 'preact/hooks';\nimport '../../../server/src/ui/app.css';\nimport './app.css';\nimport {LandingRoute} from './routes/landing/landing.jsx';\nimport {ComparisonRoute} from './routes/comparison/comparison.jsx';\nimport {LoadingSpinner} from './components/lhci-components.jsx';\nimport {parseStringAsLhr} from './components/report-upload-box.jsx';\nimport {Toast} from './components/toast.jsx';\n\nconst SEARCH_PARAMS = new URLSearchParams(location.search);\nconst INITIAL_BASE_URL = SEARCH_PARAMS.get('baseReport');\nconst INITIAL_COMPARE_URL = SEARCH_PARAMS.get('compareReport');\n\n/**\n * @typedef {{filename: string, data: string, lhr: LH.Result}} ReportData\n */\n/**\n * @typedef {{message: string, level?: 'error' | 'info'}} ToastMessage\n */\n\n/**\n * @param {string} url\n * @param {(r: ReportData) => void} setReport\n */\nasync function loadReportFromURL(url, setReport) {\n const filename = new URL(url).pathname.split('/').slice(-1)[0] || 'Unknown';\n const response = await fetch(url);\n const data = await response.text();\n const lhr = parseStringAsLhr(data);\n if (lhr instanceof Error) throw lhr;\n setReport({filename, data, lhr});\n}\n\n/**\n * @param {(r: ReportData) => void} setBaseReport\n * @param {(r: ReportData) => void} setCompareReport\n * @param {(b: boolean) => void} setIsLoading\n * @param {(t: ToastMessage) => void} addToast\n */\nasync function loadInitialReports(setBaseReport, setCompareReport, setIsLoading, addToast) {\n if (window.location.hostname === 'localhost') {\n const lastBaseReport = localStorage.getItem('lastBaseReport');\n const lastCompareReport = localStorage.getItem('lastCompareReport');\n if (lastBaseReport) setBaseReport(JSON.parse(lastBaseReport));\n if (lastCompareReport) setCompareReport(JSON.parse(lastCompareReport));\n }\n\n const promises = [\n INITIAL_BASE_URL && loadReportFromURL(INITIAL_BASE_URL, setBaseReport),\n INITIAL_COMPARE_URL && loadReportFromURL(INITIAL_COMPARE_URL, setCompareReport),\n ].filter(/** @return {p is Promise<void>} */ p => !!p);\n if (!promises.length) return;\n\n setIsLoading(true);\n await Promise.all(\n promises.map(p =>\n p.catch(err => {\n console.error(err); // eslint-disable-line no-console\n addToast({message: `Failed loading report from URL: ${err.message}`, level: 'error'});\n })\n )\n );\n setIsLoading(false);\n}\n\nexport const App = () => {\n const initialReport = /** @type {ReportData|undefined} */ (undefined);\n const [isLoading, setIsLoading] = useState(false);\n const [baseReport, setBaseReport] = useState(initialReport);\n const [compareReport, setCompareReport] = useState(initialReport);\n const [toasts, setToasts] = useState(/** @type {Array<ToastMessage>} */ ([]));\n /** @param {ToastMessage} toast */\n const addToastUnmemoized = toast => setToasts(toasts => [...toasts, toast]);\n const addToast = useCallback(addToastUnmemoized, [setToasts]);\n\n useEffect(() => {\n loadInitialReports(setBaseReport, setCompareReport, setIsLoading, addToast);\n }, []);\n\n useEffect(() => {\n if (baseReport) localStorage.setItem('lastBaseReport', JSON.stringify(baseReport));\n if (compareReport) localStorage.setItem('lastCompareReport', JSON.stringify(compareReport));\n }, [baseReport, compareReport]);\n\n return (\n <div className=\"lhci-viewer\">\n {isLoading ? (\n <div className=\"loading-container\">\n <LoadingSpinner />\n </div>\n ) : (\n <Fragment />\n )}\n <div className=\"toast-container\">\n {toasts.map(toast => (\n <Toast key={toast.message} toast={toast} setToasts={setToasts} />\n ))}\n </div>\n {baseReport && compareReport ? (\n <ComparisonRoute\n baseReport={baseReport}\n setBaseReport={setBaseReport}\n compareReport={compareReport}\n setCompareReport={setCompareReport}\n addToast={addToast}\n />\n ) : (\n <LandingRoute\n baseReport={baseReport}\n setBaseReport={setBaseReport}\n compareReport={compareReport}\n setCompareReport={setCompareReport}\n addToast={addToast}\n />\n )}\n </div>\n );\n};\n", "/**\n * @license Copyright 2020 Google Inc. All Rights Reserved.\n * 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\n * 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.\n */\n\nimport {h, render} from 'preact';\nimport {App} from './app.jsx';\n\n// Fontsource for fonts/icons instead of google cdn\nimport '@fontsource/roboto/400.css';\nimport '@fontsource/roboto/500.css';\nimport '@fontsource/roboto-mono/400.css';\nimport '@fontsource/roboto-mono/500.css';\nimport '@fontsource/material-icons';\n\nconst preactRoot = document.getElementById('preact-root');\nif (!preactRoot) throw new Error('Missing #preact-root');\nrender(<App />, preactRoot);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_lodash", "__commonJSMin", "exports", "module", "merge", "v1", "v2", "i", "o1", "o2", "o1Keys", "o2Keys", "key", "kebabCase", "s", "opts", "kebabed", "groupIntoMap", "items", "keyFn", "groups", "item", "group", "debounce", "fn", "time", "timeout", "cancel", "debouncedFn", "args", "from", "to", "by", "numbers", "word", "length", "padding", "depth", "v", "k", "o", "seen", "out", "maxItem", "maxValue", "value", "a", "b", "object", "propertiesToPick", "key_", "propertiesToDrop", "options", "uuid", "string", "number", "pluralForm", "id", "require_lhr_generator", "__commonJSMin", "exports", "module", "_", "LOREM_IPSUM", "getCategoryForAuditId", "auditId", "getGroupForAuditId", "generateNumericValue", "average", "prandom", "maxDelta", "createLHR", "pageUrl", "auditDefs", "audits", "loremIpsumTokens", "auditDef", "averageNumericValue", "averageWastedMs", "unit", "groupId", "numericValue", "score", "wastedMs", "hasBytes", "item", "wastedBytes", "passRate", "headersAsObject", "items", "_a", "_b", "url", "inclusionRate", "rest", "__objRest", "key", "dataKey", "v", "valueType", "averageValue", "details", "header", "__spreadProps", "__spreadValues", "categories", "auditsGroupedByCategory", "pair", "category", "sum", "next", "id", "fetchTimeBase", "fetchTimeOffset", "fetchTime", "require_audit_diff_finder", "__commonJSMin", "exports", "module", "_", "getGroupForAuditId", "auditsToNotDIff", "getDeltaLabel", "delta", "deltaType", "isImprovement", "getDiffLabel", "diff", "getDeltaStats", "getRowLabel", "diffs", "itemDeltaDiffs", "getMatchingDiffsForIndex", "compareItemIndex", "baseItemIndex", "compareIndex", "baseIndex", "getRowLabelForIndex", "getWorstNumericDeltaForIndex", "numericDiffs", "isNumericAuditDiff", "getMostSevereDiffLabel", "labels", "l", "getScoreLevel", "score", "getMetricScoreLevel", "value", "cutoffs", "getDiffSeverity", "baseValue", "compareValue", "absoluteDelta", "percentDelta", "percentAbsoluteDelta", "createAuditDiff", "auditId", "type", "itemKey", "numericDiffResult", "__spreadProps", "__spreadValues", "findAuditDetailItemKeyDiffs", "baseEntry", "compareEntry", "headings", "key", "heading", "synthesizeItemKeyDiffs", "baseItems", "compareItems", "itemKeyDiffs", "item", "itemIndexKeyName", "itemIndexValue", "replaceNondeterministicStrings", "s", "url", "err", "deepPruneItemForKeySerialization", "entry", "itemAsRecord", "keysToKeep", "copy", "getItemKey", "source", "zipBaseAndCompareItems", "groupedByKey", "i", "zipped", "entries", "sortZippedBaseAndCompareItems", "zippedItems", "rowLabelSortOrder", "b", "compareIndexA", "baseIndexA", "compareIndexB", "baseIndexB", "rowStateIndexA", "rowStateIndexB", "labelValueA", "labelValueB", "numericValueA", "numericValueB", "findAuditDetailItemsDiffs", "base", "compare", "normalizeScore", "audit", "getNumericValue", "normalizeNumericValue", "normalizeDetails", "findAuditDiffs", "baseAudit", "compareAudit", "options", "percentAbsoluteDeltaThreshold", "hasItemDetails", "baseAuditDetails", "compareAuditDetails", "baseHeadings", "compareHeadings", "filteredDiffs", "isAllPassing", "require_markdown", "__commonJSMin", "exports", "module", "splitMarkdownLink", "text", "segments", "parts", "preambleText", "linkText", "linkHref", "const", "options", "isValidElement", "q", "defer", "prevDebounce", "IS_HYDRATE", "i", "EMPTY_OBJ", "EMPTY_ARR", "IS_NON_DIMENSIONAL", "assign", "obj", "props", "removeNode", "node", "parentNode", "removeChild", "createElement", "type", "children", "ref", "key", "arguments", "length", "push", "defaultProps", "createVNode", "vnode", "_children", "_parent", "_depth", "_dom", "_lastDomChild", "_component", "constructor", "undefined", "Fragment", "props", "children", "coerceToVNode", "possibleVNode", "createVNode", "_dom", "_component", "vnode", "type", "key", "Component", "context", "getDomSibling", "childIndex", "_parent", "_children", "indexOf", "sibling", "length", "updateParentDomPointers", "i", "child", "base", "enqueueRender", "c", "_dirty", "q", "push", "prevDebounce", "options", "debounceRendering", "defer", "process", "p", "component", "mounts", "newDom", "oldDom", "parentDom", "sort", "a", "b", "_vnode", "_depth", "pop", "_parentDom", "diff", "assign", "_context", "ownerSVGElement", "commitRoot", "diffChildren", "newParentVNode", "oldParentVNode", "isSvg", "excessDomChildren", "isHydrating", "j", "oldVNode", "sibDom", "firstChildDom", "refs", "oldChildren", "EMPTY_ARR", "oldChildrenLength", "EMPTY_OBJ", "toChildArray", "childVNode", "undefined", "ref", "_lastDomChild", "parentNode", "outer", "appendChild", "nextSibling", "insertBefore", "value", "removeNode", "unmount", "applyRef", "callback", "flattened", "Array", "isArray", "diffProps", "dom", "newProps", "oldProps", "hydrate", "setProperty", "setStyle", "style", "IS_NON_DIMENSIONAL", "test", "name", "oldValue", "s", "useCapture", "nameLower", "cssText", "replace", "toLowerCase", "slice", "addEventListener", "eventProxy", "_listeners", "removeEventListener", "removeAttributeNS", "setAttributeNS", "removeAttribute", "setAttribute", "e", "this", "event", "newVNode", "tmp", "isNew", "oldState", "snapshot", "clearProcessingException", "provider", "cctx", "newType", "constructor", "_diff", "contextType", "_id", "_defaultValue", "_processingException", "_pendingError", "prototype", "render", "doRender", "sub", "state", "_renderCallbacks", "_nextState", "getDerivedStateFromProps", "componentWillMount", "componentDidMount", "_force", "componentWillReceiveProps", "shouldComponentUpdate", "componentWillUpdate", "_render", "getChildContext", "getSnapshotBeforeUpdate", "some", "cb", "call", "componentDidUpdate", "diffElementNodes", "diffed", "_catchError", "root", "_commit", "oldHtml", "newHtml", "nodeType", "localName", "document", "createTextNode", "createElementNS", "createElement", "data", "childNodes", "dangerouslySetInnerHTML", "attributes", "__html", "innerHTML", "checked", "current", "parentVNode", "skipRemove", "r", "componentWillUnmount", "replaceNode", "_root", "IS_HYDRATE", "options", "isValidElement", "vnode", "constructor", "Component", "prototype", "setState", "update", "callback", "s", "this", "_nextState", "state", "assign", "props", "_vnode", "_force", "_renderCallbacks", "push", "enqueueRender", "forceUpdate", "render", "Fragment", "q", "defer", "Promise", "then", "bind", "resolve", "setTimeout", "prevDebounce", "debounceRendering", "_catchError", "error", "oldVNode", "component", "_parent", "_component", "_processingException", "getDerivedStateFromError", "componentDidCatch", "_pendingError", "e", "IS_HYDRATE", "EMPTY_OBJ", "i", "let", "currentIndex", "currentComponent", "afterPaintEffects", "oldBeforeRender", "options", "_render", "vnode", "_component", "__hooks", "_pendingEffects", "handleEffects", "oldAfterDiff", "diffed", "c", "hooks", "_handles", "some", "handle", "ref", "current", "createHandle", "_pendingLayoutEffects", "oldBeforeUnmount", "unmount", "getHookState", "index", "_hook", "_list", "length", "push", "useState", "initialState", "useReducer", "invokeOrReturn", "reducer", "init", "hookState", "_value", "action", "nextValue", "setState", "useEffect", "callback", "args", "state", "argsChanged", "_args", "afterPaint", "useRef", "initialValue", "useMemo", "current", "useMemo", "callback", "args", "state", "getHookState", "currentIndex", "argsChanged", "_args", "_callback", "_value", "useCallback", "options", "unmount", "vnode", "oldBeforeUnmount", "c", "_component", "hooks", "__hooks", "_list", "forEach", "hook", "_cleanup", "let", "afterPaint", "flushAfterPaintEffects", "afterPaintEffects", "some", "component", "_afterPaintQueued", "_parentDom", "_pendingEffects", "handleEffects", "window", "prevRaf", "requestAnimationFrame", "push", "callback", "done", "clearTimeout", "timeout", "cancelAnimationFrame", "raf", "setTimeout", "effects", "invokeCleanup", "invokeEffect", "result", "_value", "argsChanged", "oldArgs", "newArgs", "arg", "index", "invokeOrReturn", "f", "toVal", "mix", "k", "y", "str", "clsx_m_default", "i", "x", "SVG_PATH", "LoadingSpinner_", "h", "LoadingSpinner", "props", "clsx_m_default", "Paper", "props", "children", "h", "clsx_m_default", "openLhrInClassicViewer", "lhr", "VIEWER_ORIGIN", "msgHandler", "messageEvent", "popup", "fetchTime", "windowName", "LhrViewerLink", "props", "children", "lhrOrResolver", "isLoading", "setIsLoading", "c", "h", "clsx_m_default", "evt", "__async", "LH_ICON_PATH", "LhrViewerButton", "props", "lhr", "label", "h", "LhrViewerLink", "CONFETTI_PATH", "LH_LOGO_PATH", "parseStringAsLhr", "s", "match", "lhr", "err", "computeBestDisplayType", "lhrA", "lhrB", "urlA", "urlB", "FilePill", "props", "filename", "url", "timestamp", "options", "tooltip", "h", "handleFileInput", "fileList", "reader", "handleDragEnter", "dragTargetRef", "setIsDragging", "e", "handleDragLeave", "handleDragOver", "handleDrop", "ReportUploadBox", "isDragging", "c", "d", "onDragEnter", "onDragLeave", "onDragOver", "onDrop", "v", "clsx_m_default", "LhrViewerButton", "input", "LandingRoute", "props", "h", "CONFETTI_PATH", "Paper", "LH_LOGO_PATH", "ReportUploadBox", "import_lodash", "import_audit_diff_finder", "Dropdown", "props", "options", "value", "setValue", "className", "title", "label", "computedOptions", "option", "h", "clsx_m_default", "d", "evt", "usePreviousValue", "value", "ref", "d", "v", "ScoreIcon", "props", "score", "h", "ScoreWord", "import_markdown", "Markdown", "props", "segments", "h", "d", "segment", "i", "url", "Nbsp", "h", "import_audit_diff_finder", "SimpleDetails", "props", "type", "compareValue", "baseValue", "diff", "value", "label", "numericBase", "numericCompare", "baseDisplay", "compareDisplay", "numericTitle", "deltaPercent", "kb", "h", "Nbsp", "ms", "evt", "img", "display", "hostname", "url", "_", "line", "column", "d", "debugdata", "import_audit_diff_finder", "isNumericValueType", "itemType", "TableDetails", "props", "audit", "baseAudit", "allDiffs", "h", "d", "compareHeadings", "compareItems", "baseHeadings", "baseItems", "zippedItems", "sortedItems", "headings", "insertRowLabelAfterIndex", "heading", "i", "base", "compare", "diffs", "key", "state", "j", "diff", "compareItem", "baseItem", "SimpleDetails", "import_audit_diff_finder", "BIG_PICTURE_LIMITS", "getBigPictureLimit", "audit", "limitType", "auditId", "toNearestRoundNumber", "x", "direction", "fn", "getUnitFromAudit", "groupId", "displayValue", "toDisplay", "options", "asDelta", "withSuffix", "unit", "value", "fractionDigits", "suffixUnit", "string", "numericSign", "resultStr", "h", "d", "Nbsp", "NumericDiff", "props", "diff", "currentNumericValue", "baseNumericValue", "delta", "minValue", "maxValue", "lowerLimit", "upperLimit", "range", "minValueConstrainted", "maxValueConstrainted", "boxLeft", "boxRight", "deltaType", "minValueIsCurrentValue", "hoverDisplay", "clsx_m_default", "deltaLabel", "deltaLabelLength", "narrowCutoffThresholdInPercent", "_", "import_audit_diff_finder", "ICONS_BY_AUDIT_ID", "IconForAuditItems", "props", "auditId", "groupId", "icon", "h", "ScoreDiff", "d", "ScoreWord", "DisplayValueDiff", "getDiffLabelForRowLabel", "rowLabel", "getUniqueBaseCompareIndexPairs", "diffs", "diff", "indexes", "idx", "ItemDiff", "baseAudit", "baseAuditItems", "rowLabels", "pair", "regressionCount", "label", "improvementCount", "baseElements", "clsx_m_default", "NoBaseAudit", "ErrorDiff", "message", "AuditDiff", "audit", "group", "noDiffAvailable", "numericDiff", "NumericDiff", "scoreDiff", "displayValueDiff", "import_audit_diff_finder", "ScoreOnlyDetails", "props", "audit", "baseAudit", "h", "ScoreWord", "ErrorDetails", "erroredAudit", "d", "Details", "pair", "details", "baseDetails", "hasItems", "itemDiff", "tableDetails", "numericDetails", "TableDetails", "ItemDiff", "__spreadProps", "__spreadValues", "numericDiff", "diff", "NumericDiff", "scoreDiff", "AuditDetail", "clsx_m_default", "ScoreIcon", "Markdown", "AuditDetailPane", "props", "paneElementRef", "d", "previouslySelectedAuditId", "usePreviousValue", "v", "auditId", "paneElement", "childElement", "h", "el", "pair", "audit", "AuditDetail", "import_audit_diff_finder", "Gauge", "props", "score", "rawBaseScore", "baseScore", "label", "baseStrokeDasharray", "delta", "deltaDasharrayScore", "deltaStrokeDasharray", "deltaTransform", "indicatorTransform", "h", "clsx_m_default", "_", "FastReliableIcon", "props", "h", "InstallableIcon", "OptimizedIcon", "getBadgeDiffType", "base", "compare", "key", "getBadgeStatus", "lhr", "pwaCategory", "auditsByCategory", "ref", "hasEveryPass", "refs", "audit", "PWAGauge", "status", "all", "clsx_m_default", "import_audit_diff_finder", "ScoreDeltaBadge", "props", "delta", "h", "clsx_m_default", "StandardScoreItem", "props", "lhr", "baseLhr", "categoryId", "category", "baseCategory", "diff", "h", "clsx_m_default", "Gauge", "ScoreDeltaBadge", "PwaScoreItem", "compareStatus", "getBadgeStatus", "deltaEl", "overallStatus", "baseStatus", "diffTypes", "getBadgeDiffType", "allEqual", "type", "individualBadges", "d", "FastReliableIcon", "InstallableIcon", "OptimizedIcon", "PWAGauge", "LhrComparisonScores", "compareCategoryIds", "baseCategoryIds", "categoryIds", "id", "idA", "idB", "sortKeyA", "sortKeyB", "MetricsTabHeader", "props", "h", "clsx_m_default", "ChangedAuditList", "d", "pair", "audit", "__spreadProps", "__spreadValues", "diff", "ScoreIcon", "AuditDiff", "UnchangedAuditList", "baseLhr", "e", "openLhrInClassicViewer", "AuditGroup", "group", "showAsBigPicture", "setShowAsBigPicture", "c", "expanded", "setExpanded", "Paper", "LhrComparisonLegend", "h", "ScoreIcon", "removeNode", "node", "parentNode", "removeChild", "const", "oldCatchError", "options", "_catchError", "Suspense", "_suspensions", "options", "_catchError", "error", "newVNode", "oldVNode", "then", "component", "vnode", "_parent", "_component", "_childDidSuspend", "_dom", "_children", "oldCatchError", "Suspense", "prototype", "Component", "promise", "c", "this", "_suspensions", "push", "onSuspensionComplete", "indexOf", "length", "pop", "unmount", "props", "fallback", "_vnode", "state", "_parkedChildren", "setState", "detachDom", "children", "i", "child", "type", "removeNode", "render", "children", "REACT_ELEMENT_TYPE", "Symbol", "for", "children", "oldEventHook", "options", "event", "options", "event", "e", "oldEventHook", "persist", "nativeEvent", "ContextProvider", "Portal", "props", "_this", "this", "container", "wrap", "h", "context", "vnode", "_container", "_temp", "parentNode", "removeChild", "_unmount", "_wrap", "_hasMounted", "_children", "preactRender", "document", "createTextNode", "hydrate", "appendChild", "componentWillUnmount", "createPortal", "getChildContext", "render", "children", "shallowDiffers", "a", "b", "i", "PureComponent", "constructor", "props", "isPureReactComponent", "n", "e", "shouldComponentUpdate", "state", "shallowDiffers", "this", "Component", "setSafeDescriptor", "proto", "key", "Object", "defineProperty", "configurable", "get", "this", "set", "v", "Component", "prototype", "isReactComponent", "let", "oldVNodeHook", "options", "vnode", "$$typeof", "REACT_ELEMENT_TYPE", "ref", "props", "type", "newProps", "i", "test", "toLowerCase", "ondoubleclick", "ondblclick", "onbeforeinput", "onchange", "normalized", "oninput", "applyEventNormalization", "_forwarded", "_patchedLifecycles", "Modal", "props", "modalRootRef", "d", "v", "j", "h", "clsx_m_default", "getStringValueFromRawConfigSetting", "value", "computeRuntimeDiffs", "lhr", "baseLhr", "diffs", "benchmarkIndex", "baseBenchmarkIndex", "benchmarkMultiplicativeDelta", "settings", "baseSettings", "throttling", "baseThrottling", "potentialDiffs", "label", "rawBase", "rawCompare", "base", "compare", "LhrRuntimeDiff", "props", "h", "clsx_m_default", "diff", "useAuditPermalinkScrollOnLoad", "setAuditId", "wait", "ms", "r", "waitUntilSelector", "selector", "__async", "attempts", "v", "computeAuditGroups", "lhr", "baseLhr", "options", "auditGroups", "categoryId", "category", "categoryAsGroup", "auditRefsGroupedByGroup", "_", "ref", "unchangedAuditsGroupId", "unchangedAuditsGroup", "auditRefGroup", "groupId", "groupWithoutId", "group", "__spreadProps", "__spreadValues", "pairs", "audit", "baseAudit", "diffs", "maxSeverity", "a", "b", "pairsWithDiffs", "pair", "pairsWithoutDiffs", "LhrComparisonScoresAndUrl", "props", "h", "Dropdown", "value", "d", "LhrComparisonScores", "AuditGroups", "auditGroup", "AuditGroup", "LhrComparison", "defaultAck", "percentAbsoluteDeltaThreshold", "setDiffThreshold", "c", "selectedAuditId", "runtimeDiffAck", "setRuntimeDiffAck", "runtimeDiffs", "computeRuntimeDiffs", "runtimeDiffsHaveError", "diff", "Modal", "LhrRuntimeDiff", "AuditDetailPane", "clsx_m_default", "Paper", "LhrComparisonLegend", "LhrViewerLink", "ComparisonRoute", "props", "displayType", "computeBestDisplayType", "h", "LH_LOGO_PATH", "ReportUploadBox", "LhrComparison", "Toast", "props", "setToasts", "message", "level", "v", "interval", "toasts", "t", "h", "SEARCH_PARAMS", "INITIAL_BASE_URL", "INITIAL_COMPARE_URL", "loadReportFromURL", "url", "setReport", "__async", "filename", "data", "lhr", "parseStringAsLhr", "loadInitialReports", "setBaseReport", "setCompareReport", "setIsLoading", "addToast", "lastBaseReport", "lastCompareReport", "promises", "p", "err", "App", "isLoading", "c", "baseReport", "compareReport", "toasts", "setToasts", "s", "toast", "v", "h", "LoadingSpinner", "d", "Toast", "ComparisonRoute", "LandingRoute", "preactRoot", "I", "h", "App"]
|
|
7
|
+
}
|