diff --git a/CHANGELOG.md b/CHANGELOG.md
index 98485a2..a0a065f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,38 @@
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+and this project adheres to [Semantic
+Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v2.1.3] - 2024-07-12
+
+### Added
+
+- Added `isElementVisible` function
+
+### Changed
+
+- Updated the logger `debug` method to be controlled by the presence of a
+ `ytpdc-debug=true` search param in the URL
+
+### Fixed
+
+- Fixed (hopefully) a rare bug where the extension would not load despite the
+ playlist being visible
+ - This was caused by unreliable logic in the `checkPlaylistReady` function
+
+## [v2.1.2] - 2024-04-16
+
+### Fixed
+
+- Fixed bug with extension on non-playlist pages where it would spam error logs
+ due to not finding a playlist element
+- Fixed bug where playlists containing "Upcoming" videos would not calculate a
+ total duration
+- Fixed bug where the yt-navigate-finish event listener was not being removed
+ before a new one could be added
+- Added browser console logs to indicate when the extension loads & when it
+ cannot find a playlist
## [v2.1.1] - 2024-04-13
@@ -23,7 +54,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Added ability to sort playlists by different criteria (index, duration, views, channel name, upload date)
+- Added ability to sort playlists by different criteria (index, duration, views,
+ channel name, upload date)
- Added i18n support & language translations:
- English (en, en-GB, en-IN, en-US)
- Spanish (es, es-419, es-us)
@@ -39,6 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Fixed several bugs
- - Bug with mutation observer not disconnecting when navigating between playlists
+ - Bug with mutation observer not disconnecting when navigating between
+ playlists
- Bug where timestamps were not being summed properly
- Addressed vulnerabilities reported by pnpm audit and dependabot
diff --git a/docs/testing.md b/docs/testing.md
index 05292c0..93d7f9b 100644
--- a/docs/testing.md
+++ b/docs/testing.md
@@ -64,3 +64,7 @@ This document describes the process involved in testing the extension.
recalulation of the playlist duration
- For non-playlist pages, after 15 seconds have elapsed there should be a yellow
warning log in the browser console with the text `Could not find a playlist.`
+- Appending `?ytpdc-debug=true` or `&ytpdc-debug=true` to the URL should enable
+ & output extension debug logs to the browser console
+ - Note: To see the logs, you must have `DEBUG` logs selected in the console
+ for Firefox and `VERBOSE` for Chrome
diff --git a/package.json b/package.json
index fd06ac6..8bf6302 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "An extension to calculate & display the total duration of a youtube playlist.",
"author": "nrednav",
"private": true,
- "version": "2.1.2",
+ "version": "2.1.3",
"type": "module",
"engines": {
"node": ">=20",
@@ -20,14 +20,14 @@
"prepare": "husky install"
},
"devDependencies": {
- "eslint": "^8.49.0",
- "eslint-config-prettier": "^9.0.0",
- "eslint-plugin-import": "^2.28.1",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-import": "^2.29.1",
"husky": "^8.0.3",
"lint-staged": "^14.0.1",
- "prettier": "^3.0.3",
- "vite": "^4.5.2",
- "vite-plugin-web-extension": "^4.1.3",
+ "prettier": "^3.3.2",
+ "vite": "^4.5.3",
+ "vite-plugin-web-extension": "^4.1.6",
"webextension-polyfill": "^0.10.0"
},
"lint-staged": {
@@ -38,7 +38,8 @@
},
"pnpm": {
"overrides": {
- "postcss@<8.4.31": ">=8.4.31"
+ "postcss@<8.4.31": ">=8.4.31",
+ "del-cli@5.1.0>braces": "3.0.3"
}
},
"dependencies": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 42f146a..3bdbefc 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -6,6 +6,7 @@ settings:
overrides:
postcss@<8.4.31: '>=8.4.31'
+ del-cli@5.1.0>braces: 3.0.3
dependencies:
del-cli:
@@ -14,14 +15,14 @@ dependencies:
devDependencies:
eslint:
- specifier: ^8.49.0
- version: 8.49.0
+ specifier: ^8.57.0
+ version: 8.57.0
eslint-config-prettier:
- specifier: ^9.0.0
- version: 9.0.0(eslint@8.49.0)
+ specifier: ^9.1.0
+ version: 9.1.0(eslint@8.57.0)
eslint-plugin-import:
- specifier: ^2.28.1
- version: 2.28.1(eslint@8.49.0)
+ specifier: ^2.29.1
+ version: 2.29.1(eslint@8.57.0)
husky:
specifier: ^8.0.3
version: 8.0.3
@@ -29,46 +30,42 @@ devDependencies:
specifier: ^14.0.1
version: 14.0.1
prettier:
- specifier: ^3.0.3
- version: 3.0.3
+ specifier: ^3.3.2
+ version: 3.3.2
vite:
- specifier: ^4.5.2
+ specifier: ^4.5.3
version: 4.5.3
vite-plugin-web-extension:
- specifier: ^4.1.3
- version: 4.1.3
+ specifier: ^4.1.6
+ version: 4.1.6
webextension-polyfill:
specifier: ^0.10.0
version: 0.10.0
packages:
- /@aashutoshrathi/word-wrap@1.2.6:
- resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /@babel/code-frame@7.22.13:
- resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
+ /@babel/code-frame@7.24.7:
+ resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/highlight': 7.22.20
- chalk: 2.4.2
+ '@babel/highlight': 7.24.7
+ picocolors: 1.0.1
- /@babel/helper-validator-identifier@7.22.20:
- resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ /@babel/helper-validator-identifier@7.24.7:
+ resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
engines: {node: '>=6.9.0'}
- /@babel/highlight@7.22.20:
- resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
+ /@babel/highlight@7.24.7:
+ resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
engines: {node: '>=6.9.0'}
dependencies:
- '@babel/helper-validator-identifier': 7.22.20
+ '@babel/helper-validator-identifier': 7.24.7
chalk: 2.4.2
js-tokens: 4.0.0
+ picocolors: 1.0.1
- /@babel/runtime@7.23.9:
- resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==}
+ /@babel/runtime@7.24.7:
+ resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.1
@@ -93,7 +90,7 @@ packages:
'@devicefarmer/adbkit-monkey': 1.2.1
bluebird: 3.7.2
commander: 9.5.0
- debug: 4.3.4
+ debug: 4.3.5
node-forge: 1.3.1
split: 1.0.1
transitivePeerDependencies:
@@ -298,30 +295,30 @@ packages:
dev: true
optional: true
- /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0):
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
- eslint: 8.49.0
+ eslint: 8.57.0
eslint-visitor-keys: 3.4.3
dev: true
- /@eslint-community/regexpp@4.8.1:
- resolution: {integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==}
+ /@eslint-community/regexpp@4.11.0:
+ resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
dev: true
- /@eslint/eslintrc@2.1.2:
- resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==}
+ /@eslint/eslintrc@2.1.4:
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
- debug: 4.3.4
+ debug: 4.3.5
espree: 9.6.1
- globals: 13.21.0
- ignore: 5.2.4
+ globals: 13.24.0
+ ignore: 5.3.1
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
@@ -330,17 +327,18 @@ packages:
- supports-color
dev: true
- /@eslint/js@8.49.0:
- resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==}
+ /@eslint/js@8.57.0:
+ resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
- /@humanwhocodes/config-array@0.11.11:
- resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==}
+ /@humanwhocodes/config-array@0.11.14:
+ resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
dependencies:
- '@humanwhocodes/object-schema': 1.2.1
- debug: 4.3.4
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.3.5
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -351,8 +349,9 @@ packages:
engines: {node: '>=12.22'}
dev: true
- /@humanwhocodes/object-schema@1.2.1:
- resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ /@humanwhocodes/object-schema@2.0.3:
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ deprecated: Use @eslint/object-schema instead
dev: true
/@nodelib/fs.scandir@2.1.5:
@@ -371,7 +370,7 @@ packages:
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.15.0
+ fastq: 1.17.1
/@pnpm/config.env-replace@1.1.0:
resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
@@ -406,8 +405,8 @@ packages:
defer-to-connect: 2.0.1
dev: true
- /@types/http-cache-semantics@4.0.2:
- resolution: {integrity: sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==}
+ /@types/http-cache-semantics@4.0.4:
+ resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
dev: true
/@types/json5@0.0.29:
@@ -422,31 +421,37 @@ packages:
resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
dev: false
- /@types/node@20.6.2:
- resolution: {integrity: sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==}
+ /@types/node@20.14.10:
+ resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==}
+ dependencies:
+ undici-types: 5.26.5
dev: true
/@types/normalize-package-data@2.4.4:
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
dev: false
- /acorn-jsx@5.3.2(acorn@8.10.0):
+ /@ungap/structured-clone@1.2.0:
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+ dev: true
+
+ /acorn-jsx@5.3.2(acorn@8.12.1):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
- acorn: 8.10.0
+ acorn: 8.12.1
dev: true
- /acorn@8.10.0:
- resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
+ /acorn@8.12.1:
+ resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
- /adm-zip@0.5.10:
- resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==}
- engines: {node: '>=6.0'}
+ /adm-zip@0.5.14:
+ resolution: {integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==}
+ engines: {node: '>=12.0'}
dev: true
/aggregate-error@4.0.1:
@@ -466,13 +471,13 @@ packages:
uri-js: 4.4.1
dev: true
- /ajv@8.12.0:
- resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ /ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
dependencies:
fast-deep-equal: 3.1.3
+ fast-uri: 3.0.1
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- uri-js: 4.4.1
dev: true
/ansi-align@3.0.1:
@@ -524,11 +529,12 @@ packages:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
- /array-buffer-byte-length@1.0.0:
- resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+ /array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- is-array-buffer: 3.0.2
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
dev: true
/array-differ@4.0.0:
@@ -536,14 +542,15 @@ packages:
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: true
- /array-includes@3.1.7:
- resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
+ /array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
- get-intrinsic: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
is-string: 1.0.7
dev: true
@@ -552,48 +559,50 @@ packages:
engines: {node: '>=12'}
dev: true
- /array.prototype.findlastindex@1.2.3:
- resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==}
+ /array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
- es-shim-unscopables: 1.0.0
- get-intrinsic: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
dev: true
/array.prototype.flat@1.3.2:
resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
- es-shim-unscopables: 1.0.0
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
dev: true
/array.prototype.flatmap@1.3.2:
resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
- es-shim-unscopables: 1.0.0
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
dev: true
- /arraybuffer.prototype.slice@1.0.2:
- resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
+ /arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
engines: {node: '>= 0.4'}
dependencies:
- array-buffer-byte-length: 1.0.0
- call-bind: 1.0.2
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
- get-intrinsic: 1.2.1
- is-array-buffer: 3.0.2
- is-shared-array-buffer: 1.0.2
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.3
dev: true
/arrify@1.0.1:
@@ -601,12 +610,12 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
- /async-lock@1.4.0:
- resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==}
+ /async-lock@1.4.1:
+ resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==}
dev: true
- /async@3.2.4:
- resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
+ /async@3.2.5:
+ resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
dev: true
/at-least-node@1.0.0:
@@ -614,9 +623,11 @@ packages:
engines: {node: '>= 4.0.0'}
dev: true
- /available-typed-arrays@1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
+ /available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
+ dependencies:
+ possible-typed-array-names: 1.0.0
dev: true
/balanced-match@1.0.2:
@@ -650,11 +661,11 @@ packages:
balanced-match: 1.0.2
concat-map: 0.0.1
- /braces@3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ /braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
dependencies:
- fill-range: 7.0.1
+ fill-range: 7.1.1
/buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
@@ -666,7 +677,7 @@ packages:
hasBin: true
optionalDependencies:
dtrace-provider: 0.8.8
- moment: 2.29.4
+ moment: 2.30.1
mv: 2.1.1
safe-json-stringify: 1.2.0
dev: true
@@ -676,24 +687,28 @@ packages:
engines: {node: '>=14.16'}
dev: true
- /cacheable-request@10.2.13:
- resolution: {integrity: sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==}
+ /cacheable-request@10.2.14:
+ resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==}
engines: {node: '>=14.16'}
dependencies:
- '@types/http-cache-semantics': 4.0.2
+ '@types/http-cache-semantics': 4.0.4
get-stream: 6.0.1
http-cache-semantics: 4.1.1
- keyv: 4.5.3
+ keyv: 4.5.4
mimic-response: 4.0.0
- normalize-url: 8.0.0
+ normalize-url: 8.0.1
responselike: 3.0.0
dev: true
- /call-bind@1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ /call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
dependencies:
- function-bind: 1.1.1
- get-intrinsic: 1.2.1
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.2
dev: true
/callsites@3.1.0:
@@ -746,21 +761,21 @@ packages:
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
dev: true
- /chrome-launcher@0.15.1:
- resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==}
+ /chrome-launcher@1.1.0:
+ resolution: {integrity: sha512-rJYWeEAERwWIr3c3mEVXwNiODPEdMRlRxHc47B1qHPOolHZnkj7rMv1QSUfPoG6MgatWj5AxSpnKKR4QEwEQIQ==}
engines: {node: '>=12.13.0'}
hasBin: true
dependencies:
- '@types/node': 20.6.2
+ '@types/node': 20.14.10
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
- lighthouse-logger: 1.4.2
+ lighthouse-logger: 2.0.1
transitivePeerDependencies:
- supports-color
dev: true
- /ci-info@3.8.0:
- resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
+ /ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
dev: true
@@ -862,8 +877,8 @@ packages:
xdg-basedir: 5.1.0
dev: true
- /core-util-is@1.0.2:
- resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
dev: true
/cross-spawn@7.0.3:
@@ -905,6 +920,33 @@ packages:
resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
dev: true
+ /data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
/debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
dev: true
@@ -928,7 +970,7 @@ packages:
supports-color:
optional: true
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
dev: true
/debug@4.3.4:
@@ -943,6 +985,18 @@ packages:
ms: 2.1.2
dev: true
+ /debug@4.3.5:
+ resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
/decamelize-keys@1.1.1:
resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
engines: {node: '>=0.10.0'}
@@ -982,21 +1036,21 @@ packages:
engines: {node: '>=10'}
dev: true
- /define-data-property@1.1.0:
- resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==}
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
gopd: 1.0.1
- has-property-descriptors: 1.0.0
dev: true
/define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
dependencies:
- define-data-property: 1.1.0
- has-property-descriptors: 1.0.0
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
object-keys: 1.1.1
dev: true
@@ -1083,7 +1137,7 @@ packages:
engines: {node: '>=0.10'}
requiresBuild: true
dependencies:
- nan: 2.18.0
+ nan: 2.20.0
dev: true
optional: true
@@ -1109,64 +1163,90 @@ packages:
dependencies:
is-arrayish: 0.2.1
- /es-abstract@1.22.2:
- resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==}
+ /es-abstract@1.23.3:
+ resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
engines: {node: '>= 0.4'}
dependencies:
- array-buffer-byte-length: 1.0.0
- arraybuffer.prototype.slice: 1.0.2
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- es-set-tostringtag: 2.0.1
+ array-buffer-byte-length: 1.0.1
+ arraybuffer.prototype.slice: 1.0.3
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ data-view-buffer: 1.0.1
+ data-view-byte-length: 1.0.1
+ data-view-byte-offset: 1.0.0
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-set-tostringtag: 2.0.3
es-to-primitive: 1.2.1
function.prototype.name: 1.1.6
- get-intrinsic: 1.2.1
- get-symbol-description: 1.0.0
- globalthis: 1.0.3
+ get-intrinsic: 1.2.4
+ get-symbol-description: 1.0.2
+ globalthis: 1.0.4
gopd: 1.0.1
- has: 1.0.3
- has-property-descriptors: 1.0.0
- has-proto: 1.0.1
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
- internal-slot: 1.0.5
- is-array-buffer: 3.0.2
+ hasown: 2.0.2
+ internal-slot: 1.0.7
+ is-array-buffer: 3.0.4
is-callable: 1.2.7
- is-negative-zero: 2.0.2
+ is-data-view: 1.0.1
+ is-negative-zero: 2.0.3
is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
+ is-shared-array-buffer: 1.0.3
is-string: 1.0.7
- is-typed-array: 1.1.12
+ is-typed-array: 1.1.13
is-weakref: 1.0.2
- object-inspect: 1.12.3
+ object-inspect: 1.13.2
object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.5.1
- safe-array-concat: 1.0.1
- safe-regex-test: 1.0.0
- string.prototype.trim: 1.2.8
- string.prototype.trimend: 1.0.7
- string.prototype.trimstart: 1.0.7
- typed-array-buffer: 1.0.0
- typed-array-byte-length: 1.0.0
- typed-array-byte-offset: 1.0.0
- typed-array-length: 1.0.4
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.2
+ safe-array-concat: 1.1.2
+ safe-regex-test: 1.0.3
+ string.prototype.trim: 1.2.9
+ string.prototype.trimend: 1.0.8
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.2
+ typed-array-byte-length: 1.0.1
+ typed-array-byte-offset: 1.0.2
+ typed-array-length: 1.0.6
unbox-primitive: 1.0.2
- which-typed-array: 1.1.11
+ which-typed-array: 1.1.15
+ dev: true
+
+ /es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
dev: true
- /es-set-tostringtag@2.0.1:
- resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
+ /es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.3
- has-tostringtag: 1.0.0
+ es-errors: 1.3.0
dev: true
- /es-shim-unscopables@1.0.0:
- resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ /es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- has: 1.0.3
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
+
+ /es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+ dependencies:
+ hasown: 2.0.2
dev: true
/es-to-primitive@1.2.1:
@@ -1231,27 +1311,27 @@ packages:
engines: {node: '>=12'}
dev: false
- /eslint-config-prettier@9.0.0(eslint@8.49.0):
- resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==}
+ /eslint-config-prettier@9.1.0(eslint@8.57.0):
+ resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
dependencies:
- eslint: 8.49.0
+ eslint: 8.57.0
dev: true
/eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
dependencies:
debug: 3.2.7
- is-core-module: 2.13.0
- resolve: 1.22.6
+ is-core-module: 2.14.0
+ resolve: 1.22.8
transitivePeerDependencies:
- supports-color
dev: true
- /eslint-module-utils@2.8.0(eslint-import-resolver-node@0.3.9)(eslint@8.49.0):
- resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
+ /eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
+ resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
@@ -1272,14 +1352,14 @@ packages:
optional: true
dependencies:
debug: 3.2.7
- eslint: 8.49.0
+ eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
dev: true
- /eslint-plugin-import@2.28.1(eslint@8.49.0):
- resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==}
+ /eslint-plugin-import@2.29.1(eslint@8.57.0):
+ resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
@@ -1288,24 +1368,24 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
- array-includes: 3.1.7
- array.prototype.findlastindex: 1.2.3
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
array.prototype.flat: 1.3.2
array.prototype.flatmap: 1.3.2
debug: 3.2.7
doctrine: 2.1.0
- eslint: 8.49.0
+ eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.0(eslint-import-resolver-node@0.3.9)(eslint@8.49.0)
- has: 1.0.3
- is-core-module: 2.13.0
+ eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
+ hasown: 2.0.2
+ is-core-module: 2.14.0
is-glob: 4.0.3
minimatch: 3.1.2
- object.fromentries: 2.0.7
- object.groupby: 1.0.1
- object.values: 1.1.7
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
semver: 6.3.1
- tsconfig-paths: 3.14.2
+ tsconfig-paths: 3.15.0
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -1325,36 +1405,37 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
- /eslint@8.49.0:
- resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==}
+ /eslint@8.57.0:
+ resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0)
- '@eslint-community/regexpp': 4.8.1
- '@eslint/eslintrc': 2.1.2
- '@eslint/js': 8.49.0
- '@humanwhocodes/config-array': 0.11.11
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+ '@eslint-community/regexpp': 4.11.0
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.57.0
+ '@humanwhocodes/config-array': 0.11.14
'@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.2.0
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
- debug: 4.3.4
+ debug: 4.3.5
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3
espree: 9.6.1
- esquery: 1.5.0
+ esquery: 1.6.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 6.0.1
find-up: 5.0.0
glob-parent: 6.0.2
- globals: 13.21.0
+ globals: 13.24.0
graphemer: 1.4.0
- ignore: 5.2.4
+ ignore: 5.3.1
imurmurhash: 0.1.4
is-glob: 4.0.3
is-path-inside: 3.0.3
@@ -1364,7 +1445,7 @@ packages:
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
- optionator: 0.9.3
+ optionator: 0.9.4
strip-ansi: 6.0.1
text-table: 0.2.0
transitivePeerDependencies:
@@ -1375,13 +1456,13 @@ packages:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- acorn: 8.10.0
- acorn-jsx: 5.3.2(acorn@8.10.0)
+ acorn: 8.12.1
+ acorn-jsx: 5.3.2(acorn@8.12.1)
eslint-visitor-keys: 3.4.3
dev: true
- /esquery@1.5.0:
- resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ /esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
engines: {node: '>=0.10'}
dependencies:
estraverse: 5.3.0
@@ -1417,7 +1498,7 @@ packages:
human-signals: 4.3.1
is-stream: 3.0.0
merge-stream: 2.0.0
- npm-run-path: 5.1.0
+ npm-run-path: 5.3.0
onetime: 6.0.0
signal-exit: 3.0.7
strip-final-newline: 3.0.0
@@ -1435,7 +1516,7 @@ packages:
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.5
+ micromatch: 4.0.7
dev: false
/fast-json-stable-stringify@2.1.0:
@@ -1446,8 +1527,12 @@ packages:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
dev: true
- /fastq@1.15.0:
- resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ /fast-uri@3.0.1:
+ resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==}
+ dev: true
+
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
dependencies:
reusify: 1.0.4
@@ -1455,11 +1540,11 @@ packages:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
- flat-cache: 3.1.0
+ flat-cache: 3.2.0
dev: true
- /fill-range@7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ /fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
dependencies:
to-regex-range: 5.0.1
@@ -1471,28 +1556,28 @@ packages:
locate-path: 6.0.0
path-exists: 4.0.0
- /firefox-profile@4.5.0:
- resolution: {integrity: sha512-goE2XxbmYVSafvCjcy64/AK3xOr14HCUCD4+TpYWEIMy4nrJfNAacLGzwqKwZhCW0hHI2TYMGH+G/YBvOE8L6g==}
+ /firefox-profile@4.6.0:
+ resolution: {integrity: sha512-I9rAm1w8U3CdhgO4EzTJsCvgcbvynZn9lOySkZf78wUdUIQH2w9QOKf3pAX+THt2XMSSR3kJSuM8P7bYux9j8g==}
hasBin: true
dependencies:
- adm-zip: 0.5.10
+ adm-zip: 0.5.14
fs-extra: 9.0.1
ini: 2.0.0
minimist: 1.2.8
xml2js: 0.5.0
dev: true
- /flat-cache@3.1.0:
- resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==}
- engines: {node: '>=12.0.0'}
+ /flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
dependencies:
- flatted: 3.2.9
- keyv: 4.5.3
+ flatted: 3.3.1
+ keyv: 4.5.4
rimraf: 3.0.2
dev: true
- /flatted@3.2.9:
- resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
+ /flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
dev: true
/for-each@0.3.3:
@@ -1512,7 +1597,7 @@ packages:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
- universalify: 2.0.0
+ universalify: 2.0.1
dev: true
/fs-extra@11.2.0:
@@ -1521,7 +1606,7 @@ packages:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
- universalify: 2.0.0
+ universalify: 2.0.1
dev: true
/fs-extra@9.0.1:
@@ -1545,16 +1630,16 @@ packages:
dev: true
optional: true
- /function-bind@1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
/function.prototype.name@1.1.6:
resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-abstract: 1.23.3
functions-have-names: 1.2.3
dev: true
@@ -1574,13 +1659,15 @@ packages:
winreg: 0.0.12
dev: true
- /get-intrinsic@1.2.1:
- resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+ /get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- function-bind: 1.1.1
- has: 1.0.3
- has-proto: 1.0.1
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
+ hasown: 2.0.2
dev: true
/get-stream@6.0.1:
@@ -1588,12 +1675,13 @@ packages:
engines: {node: '>=10'}
dev: true
- /get-symbol-description@1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ /get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
dev: true
/glob-parent@5.1.2:
@@ -1616,6 +1704,7 @@ packages:
/glob@6.0.4:
resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==}
+ deprecated: Glob versions prior to v9 are no longer supported
requiresBuild: true
dependencies:
inflight: 1.0.6
@@ -1628,6 +1717,7 @@ packages:
/glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
@@ -1643,18 +1733,19 @@ packages:
ini: 2.0.0
dev: true
- /globals@13.21.0:
- resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==}
+ /globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
engines: {node: '>=8'}
dependencies:
type-fest: 0.20.2
dev: true
- /globalthis@1.0.3:
- resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
+ /globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
dependencies:
define-properties: 1.2.1
+ gopd: 1.0.1
dev: true
/globby@13.2.2:
@@ -1663,7 +1754,7 @@ packages:
dependencies:
dir-glob: 3.0.1
fast-glob: 3.3.2
- ignore: 5.2.4
+ ignore: 5.3.1
merge2: 1.4.1
slash: 4.0.0
dev: false
@@ -1671,7 +1762,7 @@ packages:
/gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
- get-intrinsic: 1.2.1
+ get-intrinsic: 1.2.4
dev: true
/got@12.6.1:
@@ -1681,11 +1772,11 @@ packages:
'@sindresorhus/is': 5.6.0
'@szmarczak/http-timer': 5.0.1
cacheable-lookup: 7.0.0
- cacheable-request: 10.2.13
+ cacheable-request: 10.2.14
decompress-response: 6.0.0
form-data-encoder: 2.1.4
get-stream: 6.0.1
- http2-wrapper: 2.2.0
+ http2-wrapper: 2.2.1
lowercase-keys: 3.0.0
p-cancelable: 3.0.0
responselike: 3.0.0
@@ -1728,14 +1819,14 @@ packages:
engines: {node: '>=8'}
dev: true
- /has-property-descriptors@1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ /has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
dependencies:
- get-intrinsic: 1.2.1
+ es-define-property: 1.0.0
dev: true
- /has-proto@1.0.1:
- resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
+ /has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
engines: {node: '>= 0.4'}
dev: true
@@ -1744,8 +1835,8 @@ packages:
engines: {node: '>= 0.4'}
dev: true
- /has-tostringtag@1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
@@ -1756,11 +1847,11 @@ packages:
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: true
- /has@1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- function-bind: 1.1.1
+ function-bind: 1.1.2
/hosted-git-info@4.1.0:
resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
@@ -1786,8 +1877,8 @@ packages:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
dev: true
- /http2-wrapper@2.2.0:
- resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==}
+ /http2-wrapper@2.2.1:
+ resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
engines: {node: '>=10.19.0'}
dependencies:
quick-lru: 5.1.1
@@ -1805,8 +1896,8 @@ packages:
hasBin: true
dev: true
- /ignore@5.2.4:
- resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
+ /ignore@5.3.1:
+ resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
engines: {node: '>= 4'}
/immediate@3.0.6:
@@ -1838,6 +1929,7 @@ packages:
/inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
dependencies:
once: 1.4.0
wrappy: 1.0.2
@@ -1854,13 +1946,13 @@ packages:
engines: {node: '>=10'}
dev: true
- /internal-slot@1.0.5:
- resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
+ /internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.3
- side-channel: 1.0.4
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
dev: true
/is-absolute@0.1.7:
@@ -1870,12 +1962,12 @@ packages:
is-relative: 0.1.3
dev: true
- /is-array-buffer@3.0.2:
- resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+ /is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-typed-array: 1.1.12
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
dev: true
/is-arrayish@0.2.1:
@@ -1891,8 +1983,8 @@ packages:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
dev: true
/is-buffer@1.1.6:
@@ -1908,19 +2000,27 @@ packages:
resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
hasBin: true
dependencies:
- ci-info: 3.8.0
+ ci-info: 3.9.0
dev: true
- /is-core-module@2.13.0:
- resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
+ /is-core-module@2.14.0:
+ resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+
+ /is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
dependencies:
- has: 1.0.3
+ is-typed-array: 1.1.13
+ dev: true
/is-date-object@1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
engines: {node: '>= 0.4'}
dependencies:
- has-tostringtag: 1.0.0
+ has-tostringtag: 1.0.2
dev: true
/is-docker@2.2.1:
@@ -1957,8 +2057,8 @@ packages:
is-path-inside: 3.0.3
dev: true
- /is-negative-zero@2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ /is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
engines: {node: '>= 0.4'}
dev: true
@@ -1971,7 +2071,7 @@ packages:
resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
engines: {node: '>= 0.4'}
dependencies:
- has-tostringtag: 1.0.0
+ has-tostringtag: 1.0.2
dev: true
/is-number@7.0.0:
@@ -2003,12 +2103,24 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
+ /is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /is-primitive@3.0.1:
+ resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
dev: true
/is-relative@0.1.3:
@@ -2016,10 +2128,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /is-shared-array-buffer@1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ /is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
dev: true
/is-stream@3.0.0:
@@ -2031,7 +2144,7 @@ packages:
resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
engines: {node: '>= 0.4'}
dependencies:
- has-tostringtag: 1.0.0
+ has-tostringtag: 1.0.2
dev: true
/is-symbol@1.0.4:
@@ -2041,11 +2154,11 @@ packages:
has-symbols: 1.0.3
dev: true
- /is-typed-array@1.1.12:
- resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
+ /is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
engines: {node: '>= 0.4'}
dependencies:
- which-typed-array: 1.1.11
+ which-typed-array: 1.1.15
dev: true
/is-typedarray@1.0.0:
@@ -2055,7 +2168,7 @@ packages:
/is-weakref@1.0.2:
resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
dev: true
/is-wsl@2.2.0:
@@ -2086,6 +2199,11 @@ packages:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
+ /isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -2104,8 +2222,8 @@ packages:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
dev: false
- /json-parse-even-better-errors@3.0.1:
- resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==}
+ /json-parse-even-better-errors@3.0.2:
+ resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
dev: true
@@ -2137,7 +2255,7 @@ packages:
/jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
dependencies:
- universalify: 2.0.0
+ universalify: 2.0.1
optionalDependencies:
graceful-fs: 4.2.11
dev: true
@@ -2151,8 +2269,8 @@ packages:
setimmediate: 1.0.5
dev: true
- /keyv@4.5.3:
- resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==}
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
dependencies:
json-buffer: 3.0.1
dev: true
@@ -2183,8 +2301,8 @@ packages:
immediate: 3.0.6
dev: true
- /lighthouse-logger@1.4.2:
- resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==}
+ /lighthouse-logger@2.0.1:
+ resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==}
dependencies:
debug: 2.6.9
marky: 1.2.5
@@ -2201,8 +2319,8 @@ packages:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
dev: false
- /lines-and-columns@2.0.3:
- resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==}
+ /lines-and-columns@2.0.4:
+ resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: true
@@ -2249,7 +2367,7 @@ packages:
colorette: 2.0.20
eventemitter3: 5.0.1
log-update: 5.0.1
- rfdc: 1.3.0
+ rfdc: 1.4.1
wrap-ansi: 8.1.0
dev: true
@@ -2292,6 +2410,7 @@ packages:
engines: {node: '>=10'}
dependencies:
yallist: 4.0.0
+ dev: false
/make-error@1.3.6:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
@@ -2350,8 +2469,17 @@ packages:
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
engines: {node: '>=8.6'}
dependencies:
- braces: 3.0.2
+ braces: 3.0.3
+ picomatch: 2.3.1
+ dev: true
+
+ /micromatch@4.0.7:
+ resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.3
picomatch: 2.3.1
+ dev: false
/mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
@@ -2405,14 +2533,14 @@ packages:
dev: true
optional: true
- /mkdirp@1.0.4:
- resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ /mkdirp@3.0.1:
+ resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==}
engines: {node: '>=10'}
hasBin: true
dev: true
- /moment@2.29.4:
- resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
+ /moment@2.30.1:
+ resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
requiresBuild: true
dev: true
optional: true
@@ -2425,6 +2553,10 @@ packages:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
dev: true
+ /ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: true
+
/multimatch@6.0.0:
resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -2454,8 +2586,8 @@ packages:
thenify-all: 1.6.0
dev: true
- /nan@2.18.0:
- resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==}
+ /nan@2.20.0:
+ resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==}
requiresBuild: true
dev: true
optional: true
@@ -2487,7 +2619,7 @@ packages:
dependencies:
growly: 1.3.0
is-wsl: 2.2.0
- semver: 7.5.4
+ semver: 7.6.2
shellwords: 0.1.1
uuid: 8.3.2
which: 2.0.2
@@ -2498,18 +2630,18 @@ packages:
engines: {node: '>=10'}
dependencies:
hosted-git-info: 4.1.0
- is-core-module: 2.13.0
- semver: 7.5.4
+ is-core-module: 2.14.0
+ semver: 7.6.2
validate-npm-package-license: 3.0.4
dev: false
- /normalize-url@8.0.0:
- resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
+ /normalize-url@8.0.1:
+ resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==}
engines: {node: '>=14.16'}
dev: true
- /npm-run-path@5.1.0:
- resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
+ /npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
path-key: 4.0.0
@@ -2526,8 +2658,9 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /object-inspect@1.12.3:
- resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
+ /object-inspect@1.13.2:
+ resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+ engines: {node: '>= 0.4'}
dev: true
/object-keys@1.1.1:
@@ -2535,41 +2668,42 @@ packages:
engines: {node: '>= 0.4'}
dev: true
- /object.assign@4.1.4:
- resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+ /object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
has-symbols: 1.0.3
object-keys: 1.1.1
dev: true
- /object.fromentries@2.0.7:
- resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==}
+ /object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
dev: true
- /object.groupby@1.0.1:
- resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==}
+ /object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
- get-intrinsic: 1.2.1
+ es-abstract: 1.23.3
dev: true
- /object.values@1.1.7:
- resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
+ /object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-object-atoms: 1.0.0
dev: true
/once@1.4.0:
@@ -2591,16 +2725,16 @@ packages:
mimic-fn: 4.0.0
dev: true
- /optionator@0.9.3:
- resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+ /optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
dependencies:
- '@aashutoshrathi/word-wrap': 1.2.6
deep-is: 0.1.4
fast-levenshtein: 2.0.6
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
+ word-wrap: 1.2.5
dev: true
/os-shim@0.1.3:
@@ -2639,7 +2773,7 @@ packages:
got: 12.6.1
registry-auth-token: 5.0.2
registry-url: 6.0.1
- semver: 7.5.4
+ semver: 7.6.2
dev: true
/pako@1.0.11:
@@ -2657,7 +2791,7 @@ packages:
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'}
dependencies:
- '@babel/code-frame': 7.22.13
+ '@babel/code-frame': 7.24.7
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
@@ -2667,10 +2801,10 @@ packages:
resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==}
engines: {node: '>=16'}
dependencies:
- '@babel/code-frame': 7.22.13
+ '@babel/code-frame': 7.24.7
error-ex: 1.3.2
- json-parse-even-better-errors: 3.0.1
- lines-and-columns: 2.0.3
+ json-parse-even-better-errors: 3.0.2
+ lines-and-columns: 2.0.4
type-fest: 3.13.1
dev: true
@@ -2701,9 +2835,8 @@ packages:
engines: {node: '>=8'}
dev: false
- /picocolors@1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
- dev: true
+ /picocolors@1.0.1:
+ resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -2715,12 +2848,17 @@ packages:
hasBin: true
dev: true
- /postcss@8.4.38:
- resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
+ /possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /postcss@8.4.39:
+ resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.0
+ picocolors: 1.0.1
source-map-js: 1.2.0
dev: true
@@ -2729,8 +2867,8 @@ packages:
engines: {node: '>= 0.8.0'}
dev: true
- /prettier@3.0.3:
- resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==}
+ /prettier@3.3.2:
+ resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==}
engines: {node: '>=14'}
hasBin: true
dev: true
@@ -2750,8 +2888,8 @@ packages:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
dev: true
- /punycode@2.3.0:
- resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
dev: true
@@ -2801,7 +2939,7 @@ packages:
/readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
dependencies:
- core-util-is: 1.0.2
+ core-util-is: 1.0.3
inherits: 2.0.4
isarray: 1.0.0
process-nextick-args: 2.0.1
@@ -2822,13 +2960,14 @@ packages:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
dev: true
- /regexp.prototype.flags@1.5.1:
- resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
+ /regexp.prototype.flags@1.5.2:
+ resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- set-function-name: 2.0.1
+ es-errors: 1.3.0
+ set-function-name: 2.0.2
dev: true
/registry-auth-token@5.0.2:
@@ -2859,11 +2998,11 @@ packages:
engines: {node: '>=4'}
dev: true
- /resolve@1.22.6:
- resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==}
+ /resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
hasBin: true
dependencies:
- is-core-module: 2.13.0
+ is-core-module: 2.14.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
dev: true
@@ -2887,12 +3026,13 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- /rfdc@1.3.0:
- resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
+ /rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
dev: true
/rimraf@2.4.5:
resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
requiresBuild: true
dependencies:
@@ -2902,12 +3042,13 @@ packages:
/rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
dependencies:
glob: 7.2.3
- /rollup@3.29.2:
- resolution: {integrity: sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==}
+ /rollup@3.29.4:
+ resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
hasBin: true
optionalDependencies:
@@ -2919,12 +3060,12 @@ packages:
dependencies:
queue-microtask: 1.2.3
- /safe-array-concat@1.0.1:
- resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
+ /safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
engines: {node: '>=0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
has-symbols: 1.0.3
isarray: 2.0.5
dev: true
@@ -2939,23 +3080,24 @@ packages:
dev: true
optional: true
- /safe-regex-test@1.0.0:
- resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ /safe-regex-test@1.0.3:
+ resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.7
+ es-errors: 1.3.0
is-regex: 1.1.4
dev: true
- /sax@1.2.4:
- resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+ /sax@1.4.1:
+ resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
dev: true
/semver-diff@4.0.0:
resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==}
engines: {node: '>=12'}
dependencies:
- semver: 7.5.4
+ semver: 7.6.2
dev: true
/semver@6.3.1:
@@ -2963,20 +3105,39 @@ packages:
hasBin: true
dev: true
- /semver@7.5.4:
- resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ /semver@7.6.2:
+ resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
engines: {node: '>=10'}
hasBin: true
+
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
dependencies:
- lru-cache: 6.0.0
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
+ dev: true
- /set-function-name@2.0.1:
- resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
+ /set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
engines: {node: '>= 0.4'}
dependencies:
- define-data-property: 1.1.0
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
functions-have-names: 1.2.3
- has-property-descriptors: 1.0.0
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /set-value@4.1.0:
+ resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==}
+ engines: {node: '>=11.0'}
+ dependencies:
+ is-plain-object: 2.0.4
+ is-primitive: 3.0.1
dev: true
/setimmediate@1.0.5:
@@ -3003,12 +3164,14 @@ packages:
resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==}
dev: true
- /side-channel@1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ /side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- object-inspect: 1.12.3
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.2
dev: true
/signal-exit@3.0.7:
@@ -3057,7 +3220,7 @@ packages:
resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
dependencies:
spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.17
+ spdx-license-ids: 3.0.18
dev: false
/spdx-exceptions@2.5.0:
@@ -3068,11 +3231,11 @@ packages:
resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
dependencies:
spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.17
+ spdx-license-ids: 3.0.18
dev: false
- /spdx-license-ids@3.0.17:
- resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==}
+ /spdx-license-ids@3.0.18:
+ resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
dev: false
/split@1.0.1:
@@ -3104,29 +3267,31 @@ packages:
strip-ansi: 7.1.0
dev: true
- /string.prototype.trim@1.2.8:
- resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
+ /string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
dev: true
- /string.prototype.trimend@1.0.7:
- resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
+ /string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-object-atoms: 1.0.0
dev: true
- /string.prototype.trimstart@1.0.7:
- resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
+ /string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-object-atoms: 1.0.0
dev: true
/string_decoder@1.1.1:
@@ -3225,11 +3390,9 @@ packages:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
dev: true
- /tmp@0.2.1:
- resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
- engines: {node: '>=8.17.0'}
- dependencies:
- rimraf: 3.0.2
+ /tmp@0.2.3:
+ resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+ engines: {node: '>=14.14'}
dev: true
/to-regex-range@5.0.1:
@@ -3243,8 +3406,8 @@ packages:
engines: {node: '>=12'}
dev: false
- /tsconfig-paths@3.14.2:
- resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
+ /tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
dependencies:
'@types/json5': 0.0.29
json5: 1.0.2
@@ -3278,42 +3441,48 @@ packages:
engines: {node: '>=14.16'}
dev: true
- /typed-array-buffer@1.0.0:
- resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
+ /typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-typed-array: 1.1.12
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
dev: true
- /typed-array-byte-length@1.0.0:
- resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
+ /typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
dev: true
- /typed-array-byte-offset@1.0.0:
- resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
+ /typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
engines: {node: '>= 0.4'}
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
dev: true
- /typed-array-length@1.0.4:
- resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+ /typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
for-each: 0.3.3
- is-typed-array: 1.1.12
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ possible-typed-array-names: 1.0.0
dev: true
/typedarray-to-buffer@3.1.5:
@@ -3333,12 +3502,16 @@ packages:
/unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
dev: true
+ /undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ dev: true
+
/unique-string@3.0.0:
resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
engines: {node: '>=12'}
@@ -3351,8 +3524,8 @@ packages:
engines: {node: '>= 10.0.0'}
dev: true
- /universalify@2.0.0:
- resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
+ /universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
dev: true
@@ -3371,7 +3544,7 @@ packages:
is-yarn-global: 0.4.1
latest-version: 7.0.0
pupa: 3.1.0
- semver: 7.5.4
+ semver: 7.6.2
semver-diff: 4.0.0
xdg-basedir: 5.1.0
dev: true
@@ -3379,7 +3552,7 @@ packages:
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
- punycode: 2.3.0
+ punycode: 2.3.1
dev: true
/util-deprecate@1.0.2:
@@ -3398,12 +3571,12 @@ packages:
spdx-expression-parse: 3.0.1
dev: false
- /vite-plugin-web-extension@4.1.3:
- resolution: {integrity: sha512-xX+RF9SWi1D3UgR512nf8htQH5iL3BsoNhREIE/MnjKV9WDa89xQAM1Hkhyssykd5DQZ50FYTAqnvr2PmyHffg==}
+ /vite-plugin-web-extension@4.1.6:
+ resolution: {integrity: sha512-6na2gY87AUsllZC1UE45kNpFucM+Ig/U6bVjkRK6NbqwwfDDBwFma3LM/xGekWmYoKk/+qp072jyzFYrOLF5aw==}
engines: {node: '>=16'}
dependencies:
- ajv: 8.12.0
- async-lock: 1.4.0
+ ajv: 8.17.1
+ async-lock: 1.4.1
fs-extra: 10.1.0
json5: 2.2.3
linkedom: 0.14.26
@@ -3411,9 +3584,9 @@ packages:
lodash.uniqby: 4.7.0
md5: 2.3.0
vite: 4.5.3
- web-ext-run: 0.1.2
+ web-ext-run: 0.2.1
webextension-polyfill: 0.10.0
- yaml: 2.4.1
+ yaml: 2.4.5
transitivePeerDependencies:
- '@types/node'
- bufferutil
@@ -3456,46 +3629,47 @@ packages:
optional: true
dependencies:
esbuild: 0.18.20
- postcss: 8.4.38
- rollup: 3.29.2
+ postcss: 8.4.39
+ rollup: 3.29.4
optionalDependencies:
fsevents: 2.3.3
dev: true
- /watchpack@2.4.0:
- resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
+ /watchpack@2.4.1:
+ resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==}
engines: {node: '>=10.13.0'}
dependencies:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
dev: true
- /web-ext-run@0.1.2:
- resolution: {integrity: sha512-VygO7lg10keonbku5Lbi21zEz1k91odkW+c6YB5DGb+mITcRMVM2zr/tJ+Suh6wxNUOOFNbinoqDlSUWdxt6YQ==}
+ /web-ext-run@0.2.1:
+ resolution: {integrity: sha512-5D11VcjdGkA1/xax5UWL0YeAbDySKHzWFe6EpsoPNUMw5Uk9tKk9p6GUOfcaI5N7sINKfBMZYNsTBiu5dzJB9A==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
dependencies:
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.7
'@devicefarmer/adbkit': 3.2.6
bunyan: 1.8.15
- chrome-launcher: 0.15.1
+ chrome-launcher: 1.1.0
debounce: 1.2.1
es6-error: 4.1.1
- firefox-profile: 4.5.0
+ firefox-profile: 4.6.0
fs-extra: 11.2.0
fx-runner: 1.4.0
- mkdirp: 1.0.4
+ mkdirp: 3.0.1
multimatch: 6.0.0
mz: 2.7.0
node-notifier: 10.0.1
parse-json: 7.1.1
promise-toolbox: 0.21.0
+ set-value: 4.1.0
source-map-support: 0.5.21
strip-bom: 5.0.0
strip-json-comments: 5.0.1
- tmp: 0.2.1
+ tmp: 0.2.3
update-notifier: 6.0.2
- watchpack: 2.4.0
- ws: 8.16.0
+ watchpack: 2.4.1
+ ws: 8.18.0
zip-dir: 2.0.0
transitivePeerDependencies:
- bufferutil
@@ -3521,15 +3695,15 @@ packages:
is-symbol: 1.0.4
dev: true
- /which-typed-array@1.1.11:
- resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
+ /which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
engines: {node: '>= 0.4'}
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
for-each: 0.3.3
gopd: 1.0.1
- has-tostringtag: 1.0.0
+ has-tostringtag: 1.0.2
dev: true
/which@1.2.4:
@@ -3559,6 +3733,11 @@ packages:
resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==}
dev: true
+ /word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/wrap-ansi@8.1.0:
resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
engines: {node: '>=12'}
@@ -3580,8 +3759,8 @@ packages:
typedarray-to-buffer: 3.1.5
dev: true
- /ws@8.16.0:
- resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
+ /ws@8.18.0:
+ resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -3602,7 +3781,7 @@ packages:
resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==}
engines: {node: '>=4.0.0'}
dependencies:
- sax: 1.2.4
+ sax: 1.4.1
xmlbuilder: 11.0.1
dev: true
@@ -3613,14 +3792,15 @@ packages:
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: false
/yaml@2.3.1:
resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
engines: {node: '>= 14'}
dev: true
- /yaml@2.4.1:
- resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==}
+ /yaml@2.4.5:
+ resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
engines: {node: '>= 14'}
hasBin: true
dev: true
@@ -3637,6 +3817,6 @@ packages:
/zip-dir@2.0.0:
resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==}
dependencies:
- async: 3.2.4
+ async: 3.2.5
jszip: 3.10.1
dev: true
diff --git a/src/main.js b/src/main.js
index f72bd86..03fe3de 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,6 +1,601 @@
-import { main } from "src/modules/index";
-import "./main.css";
+import { PlaylistSorter } from "./modules/sorting";
import { logger } from "./shared/modules/logger";
+import { elementSelectors } from "./shared/data/element-selectors";
+import {
+ convertSecondsToTimestamp,
+ getTimestampFromVideo
+} from "./shared/modules/timestamp";
+import "./main.css";
+
+const main = () => {
+ setupPage();
+ checkPlaylistReady();
+};
+
+const checkPlaylistReady = () => {
+ logger.debug("Checking if playlist is ready to be processed");
+
+ displayLoader();
+
+ const maxPollCount = 60;
+ let pollCount = 0;
+
+ let playlistPoll = setInterval(() => {
+ if (pollCount >= maxPollCount) clearInterval(playlistPoll);
+
+ const playlistElement = document.querySelector(elementSelectors.playlist);
+ const playlistExists = playlistElement !== null;
+
+ if (
+ pollCount > 15 &&
+ !(playlistExists && isElementVisible(playlistElement)) &&
+ window.location.pathname !== "/playlist"
+ ) {
+ clearInterval(playlistPoll);
+
+ logger.warn("Could not find a playlist.");
+
+ logger.debug(
+ "Could not find a playlist",
+ JSON.stringify({
+ pollCount: pollCount,
+ playlistExists: playlistExists,
+ playlistVisible: isElementVisible(playlistElement),
+ location: window.location
+ })
+ );
+
+ return;
+ }
+
+ const timestampElement = document.querySelector(elementSelectors.timestamp);
+ const timestampExists = timestampElement !== null;
+
+ if (
+ playlistExists &&
+ timestampExists &&
+ countUnavailableTimestamps() === countUnavailableVideos()
+ ) {
+ clearInterval(playlistPoll);
+
+ const playlistVisible = isElementVisible(playlistElement);
+
+ if (playlistVisible) {
+ processPlaylist();
+ } else {
+ logger.debug("Playlist exists but is not visible, skipping processing");
+ }
+ }
+
+ pollCount++;
+ }, 1000);
+};
+
+const displayLoader = () => {
+ const playlistSummaryElement = getPlaylistSummaryElement();
+ if (!playlistSummaryElement) return;
+
+ const loaderElement = document.createElement("div");
+ loaderElement.id = "ytpdc-loader";
+ loaderElement.textContent = chrome.i18n.getMessage("loaderMessage");
+
+ playlistSummaryElement.innerHTML = "";
+ playlistSummaryElement.appendChild(loaderElement);
+};
+
+const setupPage = () => {
+ if (window.ytpdc && window.ytpdc.pageSetupDone) return;
+
+ window.ytpdc = {
+ pageSetupDone: false,
+ playlistObserver: null,
+ sortDropdown: {
+ used: false,
+ element: null
+ },
+ lastVideoInteractedWith: null
+ };
+
+ const onYoutubeNavigationFinished = () => {
+ logger.debug(
+ "YT Navigation Finished",
+ `${JSON.stringify(window.location)}`
+ );
+
+ document.removeEventListener(
+ "yt-navigate-finish",
+ onYoutubeNavigationFinished,
+ false
+ );
+
+ window.ytpdc.playlistObserver?.disconnect();
+
+ window.ytpdc = {
+ pageSetupDone: false,
+ playlistObserver: null,
+ sortDropdown: {
+ used: false,
+ element: null
+ },
+ lastVideoInteractedWith: null
+ };
+
+ main();
+ };
+
+ document.addEventListener(
+ "yt-navigate-finish",
+ onYoutubeNavigationFinished,
+ false
+ );
+
+ const onPlaylistInteractedWith = (event) => {
+ window.ytpdc.lastVideoInteractedWith = event.target.closest(
+ elementSelectors.video
+ );
+ };
+
+ document
+ .querySelector(elementSelectors.playlist)
+ ?.addEventListener("click", onPlaylistInteractedWith);
+
+ window.ytpdc.pageSetupDone = true;
+};
+
+/**
+ * Checks whether a given element is visible to the browser
+ *
+ * Ref:
+ * - https://developer.mozilla.org/en-US/docs/Web/API/Element/checkVisibility
+ * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent
+ *
+ * @param {Element} element
+ */
+const isElementVisible = (element) => {
+ if (!element) return false;
+
+ return (
+ element?.offsetParent !== null ||
+ element?.checkVisibility({
+ contentVisibilityAuto: true,
+ opacityProperty: true,
+ visibilityProperty: true
+ })
+ );
+};
+
+const getPlaylistSummaryElement = () => {
+ const selector =
+ elementSelectors.playlistSummary[isNewDesign() ? "new" : "old"];
+ return document.querySelector(selector);
+};
+
+const isNewDesign = () => {
+ const designAnchors = {
+ new: document.querySelector(elementSelectors.designAnchor.new),
+ old: document.querySelector(elementSelectors.designAnchor.old)
+ };
+
+ return designAnchors.new && designAnchors.old.getAttribute("hidden") !== null;
+};
+
+/**
+ * Counts the number of invalid timestamps in a list of video elements
+ * @returns {number}
+ */
+const countUnavailableTimestamps = () => {
+ return getVideos()
+ .map(getTimestampFromVideo)
+ .filter((timestamp) => timestamp === null).length;
+};
+
+/**
+ * Returns a list of video elements found within the playlist element
+ * @returns {Element[]}
+ **/
+const getVideos = () => {
+ const playlistElement = document.querySelector(elementSelectors.playlist);
+ if (!playlistElement) return [];
+
+ const videos = playlistElement.getElementsByTagName(elementSelectors.video);
+ return [...videos];
+};
+
+const countUnavailableVideos = () => {
+ return getVideos().filter(isVideoUnavailable).length;
+};
+
+/**
+ * Checks whether a given video element meets the criteria for being considered
+ * "unavailable"
+ * @param {Element} video
+ */
+const isVideoUnavailable = (video) => {
+ const hasNoTimestamp =
+ video.querySelector(elementSelectors.timestamp)?.innerText.trim() === "";
+
+ if (hasNoTimestamp) return true;
+
+ const hasUnavailableTitle = [
+ chrome.i18n.getMessage("videoTitle_private"),
+ chrome.i18n.getMessage("videoTitle_deleted"),
+ chrome.i18n.getMessage("videoTitle_unavailable_v1"),
+ chrome.i18n.getMessage("videoTitle_unavailable_v2"),
+ chrome.i18n.getMessage("videoTitle_restricted"),
+ chrome.i18n.getMessage("videoTitle_ageRestricted")
+ ].includes(getVideoTitle(video));
+
+ if (hasUnavailableTitle) return true;
+
+ const hasNoChannelName =
+ video.querySelector(elementSelectors.channelName)?.innerText.trim() === "";
+
+ if (hasNoChannelName) return true;
+
+ return false;
+};
+
+/**
+ * @param {Element} video
+ * @returns {string | undefined}
+ */
+const getVideoTitle = (video) => {
+ return video.querySelector(elementSelectors.videoTitle)?.title;
+};
+
+const processPlaylist = () => {
+ logger.debug("Processing playlist");
+
+ const playlistObserver = setupPlaylistObserver();
+ const videos = getVideos();
+ const timestamps = videos.map(getTimestampFromVideo);
+
+ logger.debug("Calculating total duration");
+
+ const totalDurationInSeconds =
+ Array.isArray(timestamps) && timestamps.length > 0
+ ? timestamps.reduce((a, b) => a + b)
+ : 0;
+ const playlistDuration = convertSecondsToTimestamp(totalDurationInSeconds);
+
+ addPlaylistSummaryToPage({ timestamps, playlistDuration, playlistObserver });
+};
+
+/**
+ * Sets up a mutation observer on the playlist to detect when video(s) are
+ * added or removed.
+ * Upon detection it conditionally triggers a re-processing of the playlist
+ * @returns {{
+ disconnect: () => void,
+ reconnect: () => void
+ } | null}
+ */
+const setupPlaylistObserver = () => {
+ if (window.ytpdc.playlistObserver) return window.ytpdc.playlistObserver;
+
+ const playlistElement = document.querySelector(elementSelectors.playlist);
+ if (!playlistElement) return null;
+
+ const playlistObserver = new MutationObserver(onPlaylistMutated);
+ playlistObserver.observe(playlistElement, { childList: true });
+ window.ytpdc.playlistObserver = playlistObserver;
+
+ return {
+ disconnect: () => playlistObserver.disconnect(),
+ reconnect: () =>
+ playlistObserver.observe(playlistElement, { childList: true })
+ };
+};
+
+/**
+ * This function decides when the playlist duration should be recalculated & how
+ * @param {MutationRecord[]} mutationList
+ * @param {MutationObserver} observer
+ * @returns {void | undefined}
+ */
+const onPlaylistMutated = (mutationList, observer) => {
+ const playlistElement = document.querySelector(elementSelectors.playlist);
+
+ if (mutationList.length === 1 && mutationList[0].type === "childList") {
+ const mutation = mutationList[0];
+
+ if (shouldRequestPageReload(mutation)) {
+ // Problem encountered, request a page reload
+ displayMessages([
+ chrome.i18n.getMessage("problemEncountered_paragraphOne"),
+ chrome.i18n.getMessage("problemEncountered_paragraphTwo")
+ ]);
+ observer.disconnect();
+ return;
+ }
+
+ // No problem encountered, continue processing mutation
+
+ const removedVideo = mutation.removedNodes[0];
+
+ // If the playlist was sorted, YouTube removes the wrong video from the
+ // playlist UI (correct video is removed by the server though)
+ // So the following code re-adds that removed video to the playlist
+ if (
+ getVideoTitle(removedVideo) !==
+ getVideoTitle(window.ytpdc.lastVideoInteractedWith)
+ ) {
+ if (mutation.previousSibling) {
+ mutation.previousSibling.after(removedVideo);
+ } else if (mutation.nextSibling) {
+ mutation.nextSibling.before(removedVideo);
+ }
+ }
+
+ observer.disconnect();
+ window.ytpdc.lastVideoInteractedWith.remove();
+ observer.observe(playlistElement, { childList: true });
+ main();
+ } else {
+ main();
+ }
+};
+
+/**
+ * Checks whether enough conditions hold true when the playlist is mutated
+ * to request a page reload
+ * @param {MutationRecord} mutation
+ * @returns {boolean}
+ */
+const shouldRequestPageReload = (mutation) => {
+ return (
+ mutation.addedNodes.length === 0 &&
+ mutation.removedNodes.length === 1 &&
+ mutation.removedNodes[0]?.tagName.toLowerCase() ===
+ elementSelectors.video &&
+ window.ytpdc.sortDropdown.used &&
+ !window.ytpdc.lastVideoInteractedWith
+ );
+};
+
+/**
+ * Display a list of messages within the playlist summary element
+ * @param {string[]} messages
+ */
+const displayMessages = (messages) => {
+ const playlistSummaryElement = getPlaylistSummaryElement();
+ if (!playlistSummaryElement) return;
+
+ const containerElement = document.createElement("div");
+ containerElement.id = "messages-container";
+
+ messages.forEach((message) => {
+ const messageElement = document.createElement("p");
+ messageElement.textContent = message;
+ containerElement.appendChild(messageElement);
+ });
+
+ playlistSummaryElement.innerHTML = "";
+ playlistSummaryElement.appendChild(containerElement);
+};
+
+const addPlaylistSummaryToPage = ({
+ timestamps,
+ playlistDuration,
+ playlistObserver
+}) => {
+ logger.debug("Adding playlist summary to page");
+
+ const playlistSummaryElement = createPlaylistSummaryElement({
+ timestamps,
+ playlistDuration,
+ playlistObserver
+ });
+
+ const existingPlaylistSummaryElement = getPlaylistSummaryElement();
+
+ if (existingPlaylistSummaryElement) {
+ existingPlaylistSummaryElement.replaceWith(playlistSummaryElement);
+ } else {
+ const metadataElement = document.querySelector(
+ elementSelectors.playlistMetadata[isNewDesign() ? "new" : "old"]
+ );
+ if (!metadataElement) return null;
+
+ metadataElement.parentElement.insertBefore(
+ playlistSummaryElement,
+ metadataElement.nextElementSibling
+ );
+ }
+};
+
+const createPlaylistSummaryElement = ({
+ timestamps,
+ playlistDuration,
+ playlistObserver
+}) => {
+ const newDesign = isNewDesign();
+
+ const containerElement = document.createElement("div");
+ containerElement.id = elementSelectors.playlistSummary[
+ newDesign ? "new" : "old"
+ ].replace("#", "");
+ containerElement.classList.add("container");
+
+ // Fallback styles for old design
+ if (!newDesign) {
+ if (isDarkMode()) {
+ containerElement.style.color = "white";
+ } else {
+ containerElement.style.background = "rgba(0,0,0,0.8)";
+ containerElement.style.color = "white";
+ }
+ }
+
+ const totalDuration = createSummaryItem(
+ chrome.i18n.getMessage("playlistSummary_totalDuration"),
+ `${playlistDuration}`,
+ "#86efac"
+ );
+ containerElement.appendChild(totalDuration);
+
+ const videosCounted = createSummaryItem(
+ chrome.i18n.getMessage("playlistSummary_videosCounted"),
+ `${timestamps.length}`,
+ "#fdba74"
+ );
+ containerElement.appendChild(videosCounted);
+
+ const totalVideosInPlaylist = countTotalVideosInPlaylist();
+ const videosNotCounted = createSummaryItem(
+ chrome.i18n.getMessage("playlistSummary_videosNotCounted"),
+ `${
+ totalVideosInPlaylist ? totalVideosInPlaylist - timestamps.length : "N/A"
+ }`,
+ "#fca5a5"
+ );
+ containerElement.appendChild(videosNotCounted);
+
+ if (totalVideosInPlaylist <= 100) {
+ if (window.ytpdc.sortDropdown.element) {
+ containerElement.appendChild(window.ytpdc.sortDropdown.element);
+ } else {
+ const sortDropdown = createSortDropdown(playlistObserver);
+ window.ytpdc.sortDropdown.element = sortDropdown;
+ containerElement.appendChild(sortDropdown);
+ }
+ }
+
+ if (totalVideosInPlaylist >= 100) {
+ const tooltipElement = document.createElement("div");
+ tooltipElement.id = "ytpdc-playlist-summary-tooltip";
+
+ const iconElement = document.createElementNS(
+ "http://www.w3.org/2000/svg",
+ "svg"
+ );
+ iconElement.setAttribute("preserveAspectRatio", "xMidYMid meet");
+ iconElement.setAttribute("viewBox", "0 0 24 24");
+ iconElement.innerHTML = ``;
+ tooltipElement.appendChild(iconElement);
+
+ const textElement = document.createElement("p");
+ textElement.textContent = chrome.i18n.getMessage("playlistSummary_tooltip");
+ tooltipElement.appendChild(textElement);
+
+ containerElement.appendChild(tooltipElement);
+ }
+
+ return containerElement;
+};
+
+const isDarkMode = () => {
+ return document.documentElement.getAttribute("dark") !== null;
+};
+
+const createSummaryItem = (label, value, valueColor = "#facc15") => {
+ const container = document.createElement("div");
+ container.classList.add("ytpdc-playlist-summary-item");
+
+ const labelContainer = document.createElement("p");
+ labelContainer.textContent = label;
+
+ const valueContainer = document.createElement("p");
+ valueContainer.classList.add("ytpdc-playlist-summary-item-value");
+ valueContainer.style.color = valueColor;
+ valueContainer.textContent = value;
+
+ container.appendChild(labelContainer);
+ container.appendChild(valueContainer);
+
+ return container;
+};
+
+const countTotalVideosInPlaylist = () => {
+ const statsElement = document.querySelector(
+ elementSelectors.stats[isNewDesign() ? "new" : "old"]
+ );
+
+ if (!statsElement) return null;
+
+ return parseInt(statsElement.innerText.replace(/\D/g, ""));
+};
+
+const createSortDropdown = (playlistObserver) => {
+ const containerElement = document.createElement("div");
+ containerElement.id = "ytpdc-sort-control";
+
+ const labelElement = document.createElement("p");
+ labelElement.classList.add("label");
+ labelElement.textContent = chrome.i18n.getMessage("sortDropdown_label");
+
+ const dropdownElement = document.createElement("div");
+ dropdownElement.id = "ytpdc-sort-control-dropdown-container";
+
+ const dropdownButtonElement = document.createElement("button");
+ dropdownButtonElement.id = "ytpdc-sort-control-dropdown-button";
+
+ const dropdownButtonTextElement = document.createElement("span");
+
+ const dropdownOptionsElement = document.createElement("div");
+ dropdownOptionsElement.id = "ytpdc-sort-control-dropdown-options";
+ dropdownOptionsElement.classList.add("hidden");
+
+ dropdownButtonElement.addEventListener("click", () => {
+ dropdownOptionsElement.classList.toggle("hidden");
+ });
+
+ const sortOptions = PlaylistSorter.getSortOptions();
+
+ sortOptions.forEach((sortOption) => {
+ dropdownOptionsElement.appendChild(sortOption);
+ });
+
+ dropdownButtonTextElement.textContent = sortOptions[0].textContent;
+
+ dropdownOptionsElement.addEventListener("click", (event) => {
+ if (
+ !event.target.classList.contains("ytpdc-sort-control-dropdown-option")
+ ) {
+ return;
+ }
+
+ window.ytpdc.sortDropdown.used = true;
+
+ dropdownOptionsElement.classList.toggle("hidden");
+ dropdownButtonTextElement.textContent = event.target.textContent;
+
+ playlistObserver?.disconnect();
+
+ const playlistElement = document.querySelector(elementSelectors.playlist);
+ const videos = playlistElement.getElementsByTagName(elementSelectors.video);
+
+ const playlistSorter = new PlaylistSorter(
+ event.target.getAttribute("value")
+ );
+ const sortedVideos = playlistSorter.sort([...videos].slice(0, 100));
+
+ playlistElement.replaceChildren(...sortedVideos);
+
+ playlistObserver?.reconnect();
+ });
+
+ const caretDownIcon = document.createElementNS(
+ "http://www.w3.org/2000/svg",
+ "svg"
+ );
+ caretDownIcon.setAttribute("viewBox", "0 0 256 256");
+ caretDownIcon.innerHTML = ``;
+
+ dropdownButtonElement.appendChild(dropdownButtonTextElement);
+ dropdownButtonElement.appendChild(caretDownIcon);
+ dropdownElement.appendChild(dropdownButtonElement);
+ dropdownElement.appendChild(dropdownOptionsElement);
+ containerElement.appendChild(labelElement);
+ containerElement.appendChild(dropdownElement);
+
+ return containerElement;
+};
// Entry-point
if (document.readyState !== "loading") {
diff --git a/src/modules/index.js b/src/modules/index.js
deleted file mode 100644
index 18ff697..0000000
--- a/src/modules/index.js
+++ /dev/null
@@ -1,537 +0,0 @@
-import { elementSelectors } from "src/shared/data/element-selectors";
-import { PlaylistSorter } from "src/modules/sorting";
-import {
- convertSecondsToTimestamp,
- getTimestampFromVideo
-} from "src/shared/modules/timestamp";
-import { logger } from "src/shared/modules/logger";
-
-const main = () => {
- checkPlaylistReady();
-};
-
-const checkPlaylistReady = () => {
- displayLoader();
-
- const maxPollCount = 60;
- let pollCount = 0;
-
- let playlistPoll = setInterval(() => {
- if (pollCount >= maxPollCount) clearInterval(playlistPoll);
-
- if (pollCount > 15 && window.location.pathname !== "/playlist") {
- logger.warn("Could not find a playlist.");
- clearInterval(playlistPoll);
- return;
- }
-
- if (
- document.querySelector(elementSelectors.playlist) &&
- document.querySelector(elementSelectors.timestamp) &&
- countUnavailableTimestamps() === countUnavailableVideos()
- ) {
- clearInterval(playlistPoll);
- processPlaylist();
- }
-
- pollCount++;
- }, 1000);
-};
-
-const displayLoader = () => {
- const playlistSummaryElement = getPlaylistSummaryElement();
- if (!playlistSummaryElement) return;
-
- const loaderElement = document.createElement("div");
- loaderElement.id = "ytpdc-loader";
- loaderElement.textContent = chrome.i18n.getMessage("loaderMessage");
-
- playlistSummaryElement.innerHTML = "";
- playlistSummaryElement.appendChild(loaderElement);
-};
-
-const getPlaylistSummaryElement = () => {
- const selector =
- elementSelectors.playlistSummary[isNewDesign() ? "new" : "old"];
- return document.querySelector(selector);
-};
-
-const isNewDesign = () => {
- const designAnchors = {
- new: document.querySelector(elementSelectors.designAnchor.new),
- old: document.querySelector(elementSelectors.designAnchor.old)
- };
-
- return designAnchors.new && designAnchors.old.getAttribute("hidden") !== null;
-};
-
-/**
- * Counts the number of invalid timestamps in a list of video elements
- * @returns {number}
- */
-const countUnavailableTimestamps = () => {
- return getVideos()
- .map(getTimestampFromVideo)
- .filter((timestamp) => timestamp === null).length;
-};
-
-/**
- * Returns a list of video elements found within the playlist element
- * @returns {Element[]}
- **/
-const getVideos = () => {
- const playlistElement = document.querySelector(elementSelectors.playlist);
- if (!playlistElement) return [];
-
- const videos = playlistElement.getElementsByTagName(elementSelectors.video);
- return [...videos];
-};
-
-const countUnavailableVideos = () => {
- return getVideos().filter(isVideoUnavailable).length;
-};
-
-/**
- * Checks whether a given video element meets the criteria for being considered
- * "unavailable"
- * @param {Element} video
- */
-const isVideoUnavailable = (video) => {
- const hasNoTimestamp =
- video.querySelector(elementSelectors.timestamp)?.innerText.trim() === "";
-
- if (hasNoTimestamp) return true;
-
- const hasUnavailableTitle = [
- chrome.i18n.getMessage("videoTitle_private"),
- chrome.i18n.getMessage("videoTitle_deleted"),
- chrome.i18n.getMessage("videoTitle_unavailable_v1"),
- chrome.i18n.getMessage("videoTitle_unavailable_v2"),
- chrome.i18n.getMessage("videoTitle_restricted"),
- chrome.i18n.getMessage("videoTitle_ageRestricted")
- ].includes(getVideoTitle(video));
-
- if (hasUnavailableTitle) return true;
-
- const hasNoChannelName =
- video.querySelector(elementSelectors.channelName)?.innerText.trim() === "";
-
- if (hasNoChannelName) return true;
-
- return false;
-};
-
-/**
- * @param {Element} video
- * @returns {string | undefined}
- */
-const getVideoTitle = (video) => {
- return video.querySelector(elementSelectors.videoTitle)?.title;
-};
-
-const processPlaylist = () => {
- setupPage();
- const playlistObserver = setupPlaylistObserver();
- const videos = getVideos();
- const timestamps = videos.map(getTimestampFromVideo);
- const totalDurationInSeconds =
- Array.isArray(timestamps) && timestamps.length > 0
- ? timestamps.reduce((a, b) => a + b)
- : 0;
- const playlistDuration = convertSecondsToTimestamp(totalDurationInSeconds);
- addPlaylistSummaryToPage({
- timestamps,
- playlistDuration,
- playlistObserver
- });
-};
-
-const setupPage = () => {
- if (window.ytpdc && window.ytpdc.pageSetupDone) return;
-
- window.ytpdc = {
- pageSetupDone: false,
- playlistObserver: null,
- sortDropdown: {
- used: false,
- element: null
- },
- lastVideoInteractedWith: null
- };
-
- const onYoutubeNavigationFinished = () => {
- document.removeEventListener(
- "yt-navigate-finish",
- onYoutubeNavigationFinished,
- false
- );
-
- window.ytpdc.playlistObserver?.disconnect();
-
- window.ytpdc = {
- pageSetupDone: false,
- playlistObserver: null,
- sortDropdown: {
- used: false,
- element: null
- },
- lastVideoInteractedWith: null
- };
-
- main();
- };
-
- document.addEventListener(
- "yt-navigate-finish",
- onYoutubeNavigationFinished,
- false
- );
-
- const onPlaylistInteractedWith = (event) => {
- window.ytpdc.lastVideoInteractedWith = event.target.closest(
- elementSelectors.video
- );
- };
-
- document
- .querySelector(elementSelectors.playlist)
- ?.addEventListener("click", onPlaylistInteractedWith);
-
- window.ytpdc.pageSetupDone = true;
-};
-
-/**
- * Sets up a mutation observer on the playlist to detect when video(s) are
- * added or removed.
- * Upon detection it conditionally triggers a re-processing of the playlist
- * @returns {{
- disconnect: () => void,
- reconnect: () => void
- } | null}
- */
-const setupPlaylistObserver = () => {
- if (window.ytpdc.playlistObserver) return window.ytpdc.playlistObserver;
-
- const playlistElement = document.querySelector(elementSelectors.playlist);
- if (!playlistElement) return null;
-
- const playlistObserver = new MutationObserver(onPlaylistMutated);
- playlistObserver.observe(playlistElement, { childList: true });
- window.ytpdc.playlistObserver = playlistObserver;
-
- return {
- disconnect: () => playlistObserver.disconnect(),
- reconnect: () =>
- playlistObserver.observe(playlistElement, { childList: true })
- };
-};
-
-/**
- * This function decides when the playlist duration should be recalculated & how
- * @param {MutationRecord[]} mutationList
- * @param {MutationObserver} observer
- * @returns {void | undefined}
- */
-const onPlaylistMutated = (mutationList, observer) => {
- const playlistElement = document.querySelector(elementSelectors.playlist);
-
- if (mutationList.length === 1 && mutationList[0].type === "childList") {
- const mutation = mutationList[0];
-
- if (shouldRequestPageReload(mutation)) {
- // Problem encountered, request a page reload
- displayMessages([
- chrome.i18n.getMessage("problemEncountered_paragraphOne"),
- chrome.i18n.getMessage("problemEncountered_paragraphTwo")
- ]);
- observer.disconnect();
- return;
- }
-
- // No problem encountered, continue processing mutation
-
- const removedVideo = mutation.removedNodes[0];
-
- // If the playlist was sorted, YouTube removes the wrong video from the
- // playlist UI (correct video is removed by the server though)
- // So the following code re-adds that removed video to the playlist
- if (
- getVideoTitle(removedVideo) !==
- getVideoTitle(window.ytpdc.lastVideoInteractedWith)
- ) {
- if (mutation.previousSibling) {
- mutation.previousSibling.after(removedVideo);
- } else if (mutation.nextSibling) {
- mutation.nextSibling.before(removedVideo);
- }
- }
-
- observer.disconnect();
- window.ytpdc.lastVideoInteractedWith.remove();
- observer.observe(playlistElement, { childList: true });
- main();
- } else {
- main();
- }
-};
-
-/**
- * Checks whether enough conditions hold true when the playlist is mutated
- * to request a page reload
- * @param {MutationRecord} mutation
- * @returns {boolean}
- */
-const shouldRequestPageReload = (mutation) => {
- return (
- mutation.addedNodes.length === 0 &&
- mutation.removedNodes.length === 1 &&
- mutation.removedNodes[0]?.tagName.toLowerCase() ===
- elementSelectors.video &&
- window.ytpdc.sortDropdown.used &&
- !window.ytpdc.lastVideoInteractedWith
- );
-};
-
-/**
- * Display a list of messages within the playlist summary element
- * @param {string[]} messages
- */
-const displayMessages = (messages) => {
- const playlistSummaryElement = getPlaylistSummaryElement();
- if (!playlistSummaryElement) return;
-
- const containerElement = document.createElement("div");
- containerElement.id = "messages-container";
-
- messages.forEach((message) => {
- const messageElement = document.createElement("p");
- messageElement.textContent = message;
- containerElement.appendChild(messageElement);
- });
-
- playlistSummaryElement.innerHTML = "";
- playlistSummaryElement.appendChild(containerElement);
-};
-
-const addPlaylistSummaryToPage = ({
- timestamps,
- playlistDuration,
- playlistObserver
-}) => {
- const playlistSummaryElement = createPlaylistSummaryElement({
- timestamps,
- playlistDuration,
- playlistObserver
- });
-
- const existingPlaylistSummaryElement = getPlaylistSummaryElement();
-
- if (existingPlaylistSummaryElement) {
- existingPlaylistSummaryElement.replaceWith(playlistSummaryElement);
- } else {
- const metadataElement = document.querySelector(
- elementSelectors.playlistMetadata[isNewDesign() ? "new" : "old"]
- );
- if (!metadataElement) return null;
-
- metadataElement.parentElement.insertBefore(
- playlistSummaryElement,
- metadataElement.nextElementSibling
- );
- }
-};
-
-const createPlaylistSummaryElement = ({
- timestamps,
- playlistDuration,
- playlistObserver
-}) => {
- const newDesign = isNewDesign();
-
- const containerElement = document.createElement("div");
- containerElement.id = elementSelectors.playlistSummary[
- newDesign ? "new" : "old"
- ].replace("#", "");
- containerElement.classList.add("container");
-
- // Fallback styles for old design
- if (!newDesign) {
- if (isDarkMode()) {
- containerElement.style.color = "white";
- } else {
- containerElement.style.background = "rgba(0,0,0,0.8)";
- containerElement.style.color = "white";
- }
- }
-
- const totalDuration = createSummaryItem(
- chrome.i18n.getMessage("playlistSummary_totalDuration"),
- `${playlistDuration}`,
- "#86efac"
- );
- containerElement.appendChild(totalDuration);
-
- const videosCounted = createSummaryItem(
- chrome.i18n.getMessage("playlistSummary_videosCounted"),
- `${timestamps.length}`,
- "#fdba74"
- );
- containerElement.appendChild(videosCounted);
-
- const totalVideosInPlaylist = countTotalVideosInPlaylist();
- const videosNotCounted = createSummaryItem(
- chrome.i18n.getMessage("playlistSummary_videosNotCounted"),
- `${
- totalVideosInPlaylist ? totalVideosInPlaylist - timestamps.length : "N/A"
- }`,
- "#fca5a5"
- );
- containerElement.appendChild(videosNotCounted);
-
- if (totalVideosInPlaylist <= 100) {
- if (window.ytpdc.sortDropdown.element) {
- containerElement.appendChild(window.ytpdc.sortDropdown.element);
- } else {
- const sortDropdown = createSortDropdown(playlistObserver);
- window.ytpdc.sortDropdown.element = sortDropdown;
- containerElement.appendChild(sortDropdown);
- }
- }
-
- if (totalVideosInPlaylist >= 100) {
- const tooltipElement = document.createElement("div");
- tooltipElement.id = "ytpdc-playlist-summary-tooltip";
-
- const iconElement = document.createElementNS(
- "http://www.w3.org/2000/svg",
- "svg"
- );
- iconElement.setAttribute("preserveAspectRatio", "xMidYMid meet");
- iconElement.setAttribute("viewBox", "0 0 24 24");
- iconElement.innerHTML = ``;
- tooltipElement.appendChild(iconElement);
-
- const textElement = document.createElement("p");
- textElement.textContent = chrome.i18n.getMessage("playlistSummary_tooltip");
- tooltipElement.appendChild(textElement);
-
- containerElement.appendChild(tooltipElement);
- }
-
- return containerElement;
-};
-
-const isDarkMode = () => {
- return document.documentElement.getAttribute("dark") !== null;
-};
-
-const createSummaryItem = (label, value, valueColor = "#facc15") => {
- const container = document.createElement("div");
- container.classList.add("ytpdc-playlist-summary-item");
-
- const labelContainer = document.createElement("p");
- labelContainer.textContent = label;
-
- const valueContainer = document.createElement("p");
- valueContainer.classList.add("ytpdc-playlist-summary-item-value");
- valueContainer.style.color = valueColor;
- valueContainer.textContent = value;
-
- container.appendChild(labelContainer);
- container.appendChild(valueContainer);
-
- return container;
-};
-
-const countTotalVideosInPlaylist = () => {
- const statsElement = document.querySelector(
- elementSelectors.stats[isNewDesign() ? "new" : "old"]
- );
-
- if (!statsElement) return null;
-
- return parseInt(statsElement.innerText.replace(/\D/g, ""));
-};
-
-const createSortDropdown = (playlistObserver) => {
- const containerElement = document.createElement("div");
- containerElement.id = "ytpdc-sort-control";
-
- const labelElement = document.createElement("p");
- labelElement.classList.add("label");
- labelElement.textContent = chrome.i18n.getMessage("sortDropdown_label");
-
- const dropdownElement = document.createElement("div");
- dropdownElement.id = "ytpdc-sort-control-dropdown-container";
-
- const dropdownButtonElement = document.createElement("button");
- dropdownButtonElement.id = "ytpdc-sort-control-dropdown-button";
-
- const dropdownButtonTextElement = document.createElement("span");
-
- const dropdownOptionsElement = document.createElement("div");
- dropdownOptionsElement.id = "ytpdc-sort-control-dropdown-options";
- dropdownOptionsElement.classList.add("hidden");
-
- dropdownButtonElement.addEventListener("click", () => {
- dropdownOptionsElement.classList.toggle("hidden");
- });
-
- const sortOptions = PlaylistSorter.getSortOptions();
-
- sortOptions.forEach((sortOption) => {
- dropdownOptionsElement.appendChild(sortOption);
- });
-
- dropdownButtonTextElement.textContent = sortOptions[0].textContent;
-
- dropdownOptionsElement.addEventListener("click", (event) => {
- if (
- !event.target.classList.contains("ytpdc-sort-control-dropdown-option")
- ) {
- return;
- }
-
- window.ytpdc.sortDropdown.used = true;
-
- dropdownOptionsElement.classList.toggle("hidden");
- dropdownButtonTextElement.textContent = event.target.textContent;
-
- playlistObserver?.disconnect();
-
- const playlistElement = document.querySelector(elementSelectors.playlist);
- const videos = playlistElement.getElementsByTagName(elementSelectors.video);
-
- const playlistSorter = new PlaylistSorter(
- event.target.getAttribute("value")
- );
- const sortedVideos = playlistSorter.sort([...videos].slice(0, 100));
-
- playlistElement.replaceChildren(...sortedVideos);
-
- playlistObserver?.reconnect();
- });
-
- const caretDownIcon = document.createElementNS(
- "http://www.w3.org/2000/svg",
- "svg"
- );
- caretDownIcon.setAttribute("viewBox", "0 0 256 256");
- caretDownIcon.innerHTML = ``;
-
- dropdownButtonElement.appendChild(dropdownButtonTextElement);
- dropdownButtonElement.appendChild(caretDownIcon);
- dropdownElement.appendChild(dropdownButtonElement);
- dropdownElement.appendChild(dropdownOptionsElement);
- containerElement.appendChild(labelElement);
- containerElement.appendChild(dropdownElement);
-
- return containerElement;
-};
-
-export { main };
diff --git a/src/shared/modules/logger.js b/src/shared/modules/logger.js
index ab943e4..47ee2fe 100644
--- a/src/shared/modules/logger.js
+++ b/src/shared/modules/logger.js
@@ -15,7 +15,20 @@ class Logger {
}
info = this.logWithPrefix(console.info);
- debug = this.logWithPrefix(console.debug);
+ debug = (() => {
+ try {
+ const url = new URL(window.location.href);
+
+ if (url.searchParams.has("ytpdc-debug", "true")) {
+ return this.logWithPrefix(console.debug);
+ } else {
+ return () => {};
+ }
+ } catch (error) {
+ this.error(error.message);
+ return () => {};
+ }
+ })();
warn = this.logWithPrefix(console.warn);
error = this.logWithPrefix(console.error);
}