improve typescript and linting usage across codebase

add ts-lit-plugin and eslint-typescript

disable no-invalid-css rule

fix a bunch of errors raised by eslint and typescript

run prettier & eslint on the remaining files

remove unused imports

split coll-index into index and info components...
and rename "coll" -> "item" for these.
also includes some fixes for previously-undocumented properties used on
non-ts elements.

extract labeled fields into separate component...
and make a few type improvements too

swap custom copy button for shoelace one

rename a few more missed things
This commit is contained in:
emma
2023-11-29 15:53:46 -05:00
parent e7b86626df
commit e9438eb724
35 changed files with 1352 additions and 966 deletions
-1
View File
@@ -82,4 +82,3 @@ before_cache:
branches: branches:
except: except:
- "/^v\\d+\\.\\d+\\.\\d+$/" - "/^v\\d+\\.\\d+\\.\\d+$/"
+23 -26
View File
@@ -1,28 +1,25 @@
/* eslint-env node */
module.exports = { module.exports = {
"env": { env: {
"browser": true, browser: true,
"es6": true es6: true,
}, },
"extends": [ extends: [
"eslint:recommended", "eslint:recommended",
"plugin:lit/recommended", "plugin:lit/recommended",
"prettier" "prettier",
], "plugin:@typescript-eslint/recommended",
"plugins": [ ],
"lit" plugins: ["@typescript-eslint", "lit"],
], parser: "@typescript-eslint/parser",
"parserOptions": { parserOptions: {
"ecmaVersion": 2018, ecmaVersion: 2018,
"sourceType": "module" sourceType: "module",
}, },
"rules": { rules: {
"no-restricted-globals": [ "no-restricted-globals": [2, "event", "error"],
2, "linebreak-style": ["error", "unix"],
"event", "error" "@typescript-eslint/no-explicit-any": "warn",
], },
"linebreak-style": [ ignorePatterns: ["ruffle/**/*", "build/**/*"],
"error",
"unix"
]
}
}; };
+8 -3
View File
@@ -1,4 +1,9 @@
# Ignore everything except src # Ignore everything except src
* _includes
!/src/ .github
!src/* .husky
assets
build
docs
examples
ruffle
+11 -8
View File
@@ -1,11 +1,14 @@
<!doctype html> <!doctype html>
<html class="no-overflow"> <html class="no-overflow">
<head> <head> </head>
</head> <body>
<body> Loading SW, Please wait...
Loading SW, Please wait... <script>
<script> navigator.serviceWorker
navigator.serviceWorker.register("/swonly.js?replayPrefix=wabac&stats=true", {scope: window.location.origin + "/"}).then(() => window.location.reload()); .register("/swonly.js?replayPrefix=wabac&stats=true", {
</script> scope: window.location.origin + "/",
</body> })
.then(() => window.location.reload());
</script>
</body>
</html> </html>
+73 -3
View File
@@ -1,14 +1,17 @@
## CHANGES ## CHANGES
v1.8.11 v1.8.11
- Loading: Use default html index, avoid custom html injection (via wabac.js 2.16.12) - Loading: Use default html index, avoid custom html injection (via wabac.js 2.16.12)
- Dependencies: Switch to wabac.js 2.16.12 - Dependencies: Switch to wabac.js 2.16.12
v1.8.10 v1.8.10
- Regression fix: Fix embed loading from different domain being broken in 1.8.9 - Regression fix: Fix embed loading from different domain being broken in 1.8.9
- Dependencies: Switch to wabac.js 2.16.11 - Dependencies: Switch to wabac.js 2.16.11
v1.8.9: v1.8.9:
- Fidelity: Ignore self-redirects when loading (via wabac.js) - Fidelity: Ignore self-redirects when loading (via wabac.js)
- Fidelity: Don't rewrite 'location = 0' as window.location (via wabac.js) - Fidelity: Don't rewrite 'location = 0' as window.location (via wabac.js)
- API: Add /api/c/[coll]/ts/?url=... API for returning array for timestamps for given URL (via wabac.js) - API: Add /api/c/[coll]/ts/?url=... API for returning array for timestamps for given URL (via wabac.js)
@@ -16,12 +19,14 @@ v1.8.9:
- Dependencies: Switch to wabac.js 2.16.10 - Dependencies: Switch to wabac.js 2.16.10
v1.8.8 v1.8.8
- Source/Build: Format src files with Prettier, add pre-commit check, fix errors in HTML - Source/Build: Format src files with Prettier, add pre-commit check, fix errors in HTML
- Fidelity: Fix regression from 2.16.8 for rewriting JSON in 'script' tags (via wabac.js 2.16.9) - Fidelity: Fix regression from 2.16.8 for rewriting JSON in 'script' tags (via wabac.js 2.16.9)
- UI: Better handling of Multi WACZ collections, list collection name, description and files on info tab - UI: Better handling of Multi WACZ collections, list collection name, description and files on info tab
- Dependencies: Switch to wabac.js 2.16.9 - Dependencies: Switch to wabac.js 2.16.9
v1.8.7 v1.8.7
- UI: Fix info tab overflow being hidden - UI: Fix info tab overflow being hidden
- Loading: Improved support for live proxy via wabac.js 2.16.7 - Loading: Improved support for live proxy via wabac.js 2.16.7
- Fidelity: Improved support for document.write() overrides with wabac.js 2.16.7 - Fidelity: Improved support for document.write() overrides with wabac.js 2.16.7
@@ -29,6 +34,7 @@ v1.8.7
- Dependencies: Switch to wabac.js 2.16.8 - Dependencies: Switch to wabac.js 2.16.8
v1.8.6 v1.8.6
- Loading: Fix improved handling of multi-wacz collections (via wabac.js 2.16.6) - Loading: Fix improved handling of multi-wacz collections (via wabac.js 2.16.6)
- Loading: Allow embedded video/audio to play inline instead of being downloaded (via wabac.js 2.16.6) - Loading: Allow embedded video/audio to play inline instead of being downloaded (via wabac.js 2.16.6)
- Fidelity: Add missing ruffle.js files to fix ruffle - Fidelity: Add missing ruffle.js files to fix ruffle
@@ -37,37 +43,45 @@ v1.8.6
- Dependencies: Switch to wabac.js 2.16.6 - Dependencies: Switch to wabac.js 2.16.6
v1.8.5 v1.8.5
- Loading: Improved handling of multi-wacz collections, support loading URLs cross-WACZ to support patching - Loading: Improved handling of multi-wacz collections, support loading URLs cross-WACZ to support patching
- Dependencies: Switch to wabac.js 2.16.5 - Dependencies: Switch to wabac.js 2.16.5
v1.8.4 v1.8.4
- Fidelity: improved replay of pages with top-level 'let' and 'const' globals via script parsing (via wabac.js) - Fidelity: improved replay of pages with top-level 'let' and 'const' globals via script parsing (via wabac.js)
- Dependencies: Switch to wabac.js 2.16.4 - Dependencies: Switch to wabac.js 2.16.4
v1.8.3 v1.8.3
- Loading: fix 'Show Non-Seed Pages' for Multi WACZ collections and after reload - Loading: fix 'Show Non-Seed Pages' for Multi WACZ collections and after reload
- Dependencies: Switch to wabac.js 2.16.3 - Dependencies: Switch to wabac.js 2.16.3
v1.8.2 v1.8.2
- Loading: fix redirect loop on 404s (via wabac.js 2.16.2) - Loading: fix redirect loop on 404s (via wabac.js 2.16.2)
- Misc: additional check before autoupdate, update build deps to support Node 20 - Misc: additional check before autoupdate, update build deps to support Node 20
v1.8.1 v1.8.1
- Loading: Resolve sourceUrl to absolute url when computing default id - Loading: Resolve sourceUrl to absolute url when computing default id
- Loading: Disable ruffle on embeds by default, can enable with 'useruffle', enable on standalone by default, can disable with 'skipruffle' attr - Loading: Disable ruffle on embeds by default, can enable with 'useruffle', enable on standalone by default, can disable with 'skipruffle' attr
- Dependencies: Switch to ruffle 2023-05-13 due to issues in later versions - Dependencies: Switch to ruffle 2023-05-13 due to issues in later versions
v1.8.0 v1.8.0
- UI: Add 'Show All Pages' option to show non-seed pages that are previously only available via search - UI: Add 'Show All Pages' option to show non-seed pages that are previously only available via search
- Embeds: add 'swName' option to allow customizing 'sw.js' to a different filename - Embeds: add 'swName' option to allow customizing 'sw.js' to a different filename
- Dependencies: Update to wabac.js 2.16.1 -- varioues loading improvements related to surt - Dependencies: Update to wabac.js 2.16.1 -- varioues loading improvements related to surt
- Dependencies: Update to electron 25.5.1, ruffle 2023-06-14 - Dependencies: Update to electron 25.5.1, ruffle 2023-06-14
v1.7.15 v1.7.15
- UI: Loading: support URLs that have query/hashes after extension - UI: Loading: support URLs that have query/hashes after extension
- Dependencies: Update to wabac.js 2.16.0 -- improved support for Multi WACZ files - Dependencies: Update to wabac.js 2.16.0 -- improved support for Multi WACZ files
v1.7.14 v1.7.14
- Fidelity: Support dynamic 'import()' in non-module JS (via wabac.js 2.15.4) - Fidelity: Support dynamic 'import()' in non-module JS (via wabac.js 2.15.4)
- Fidelity: Fix dynamic iframes (via document.write / srcdoc) that fallthrough (via wombat 3.5.1, wabac.js 2.15.5) - Fidelity: Fix dynamic iframes (via document.write / srcdoc) that fallthrough (via wombat 3.5.1, wabac.js 2.15.5)
- Fidelity: Fix loading WARCs with duplicate revisit records overriding non-revisit records (via wabac.js 2.15.5) - Fidelity: Fix loading WARCs with duplicate revisit records overriding non-revisit records (via wabac.js 2.15.5)
@@ -77,68 +91,82 @@ v1.7.14
- Dependencies: Update to wabac.js 2.15.5, wombat 3.5.1 - Dependencies: Update to wabac.js 2.15.5, wombat 3.5.1
v1.7.13 v1.7.13
- Fidelity: Improved replay via unrewriting fixes of style urls, request/response urls (via wabac.js 2.15.3) - Fidelity: Improved replay via unrewriting fixes of style urls, request/response urls (via wabac.js 2.15.3)
- Embeds: Support updating auth headers if custom headers provided in embed 'config' - Embeds: Support updating auth headers if custom headers provided in embed 'config'
- Dependencies: Update to wabac.js 2.15.3, wombat 3.4.6, Electron 23.1.1 - Dependencies: Update to wabac.js 2.15.3, wombat 3.4.6, Electron 23.1.1
v1.7.12 v1.7.12
- Fidelity: Improved replay of facebook/instagram pages (via wabac.js 2.15.1) - Fidelity: Improved replay of facebook/instagram pages (via wabac.js 2.15.1)
- Loading: Fix issue with loading certain WACZ files (incorrect SURT detection fixed, via wabac.js 2.15.2) - Loading: Fix issue with loading certain WACZ files (incorrect SURT detection fixed, via wabac.js 2.15.2)
- Dependencies: Update to wabac.js 2.15.2 - Dependencies: Update to wabac.js 2.15.2
v1.7.11 v1.7.11
- Loading: Support loading URLs without extension (including blob: urls), automated type detection of WACZ, WARC, compressed and uncompressed (via wabac.js) - Loading: Support loading URLs without extension (including blob: urls), automated type detection of WACZ, WARC, compressed and uncompressed (via wabac.js)
- Fidelity: Improved handling of ESM modules, cookies, Vimeo videos (via wabac.js) - Fidelity: Improved handling of ESM modules, cookies, Vimeo videos (via wabac.js)
- Dependencies: Update to wabac.js 2.15.0, wombat 3.4.3 - Dependencies: Update to wabac.js 2.15.0, wombat 3.4.3
v1.7.10 v1.7.10
- Verification: Change site used for cert verification to https://crt.sh/ - Verification: Change site used for cert verification to https://crt.sh/
v1.7.9 v1.7.9
- Fidelity: Various fidelity improvements via new wabac.js / wombat - Fidelity: Various fidelity improvements via new wabac.js / wombat
- Dependencies: Update to wabac.js 2.14.0, wombat 3.4.2, warcio 2.0.1 - Dependencies: Update to wabac.js 2.14.0, wombat 3.4.2, warcio 2.0.1
v1.7.8 v1.7.8
- Electron App: simplified IPFS loading in app, can connect to default IPFS Desktop or IPFS in Brave automatically - Electron App: simplified IPFS loading in app, can connect to default IPFS Desktop or IPFS in Brave automatically
- Electron App: clean up unused code, old ipfs loading paths from app, streamlined file loading - Electron App: clean up unused code, old ipfs loading paths from app, streamlined file loading
- Dependencies: Update to wabac.js 2.13.15, wombat 3.3.13, auto-js-ipfs 2.1.0, electron 22.0 - Dependencies: Update to wabac.js 2.13.15, wombat 3.3.13, auto-js-ipfs 2.1.0, electron 22.0
v1.7.7 v1.7.7
- Bug Fix: Fix loading issue on first use due to injected script check (via wabac 2.13.14) - Bug Fix: Fix loading issue on first use due to injected script check (via wabac 2.13.14)
- Indexing: Fix video loading, don't index partial 206 in all loading paths (via wabac 2.13.13) - Indexing: Fix video loading, don't index partial 206 in all loading paths (via wabac 2.13.13)
- Dependencies: Update to wabac.js 2.13.14 - Dependencies: Update to wabac.js 2.13.14
v1.7.6 v1.7.6
- Bug Fix: Ensure Flash (via ruffle.js) loading is working (via wabac.js 2.13.11) - Bug Fix: Ensure Flash (via ruffle.js) loading is working (via wabac.js 2.13.11)
- Bug Fix: Fix occasional issue in window.open (viw wombat) - Bug Fix: Fix occasional issue in window.open (viw wombat)
- Dependencies: Update wabac.js to 2.13.12, wombat 3.3.12, update Ruffle to 2022-11-25 release - Dependencies: Update wabac.js to 2.13.12, wombat 3.3.12, update Ruffle to 2022-11-25 release
v1.7.5 v1.7.5
- Library: Readd assets dir to package (needed for archiveweb.page) - Library: Readd assets dir to package (needed for archiveweb.page)
v1.7.4 v1.7.4
- Embed: Support loading entire WACZ in embed via `load='eager'` flag - Embed: Support loading entire WACZ in embed via `load='eager'` flag
- Dependencies: update to wabac.js 2.13.10 for eager loading support - Dependencies: update to wabac.js 2.13.10 for eager loading support
- Dependencies: update to electron 21.3.1 - Dependencies: update to electron 21.3.1
- Library: Remove assets dir from npm package - Library: Remove assets dir from npm package
v1.7.3 v1.7.3
- Fidelity: Misc fidelity improvements via latest wombat + wabac.js - Fidelity: Misc fidelity improvements via latest wombat + wabac.js
- Dependecies: wabac.js 2.13.8, wombat 3.3.11, auto-js-ipfs 1.5.1 - Dependecies: wabac.js 2.13.8, wombat 3.3.11, auto-js-ipfs 1.5.1
- Loading: Fix occasional loading issues with multiple embeds loading on the same page - Loading: Fix occasional loading issues with multiple embeds loading on the same page
v1.7.2 v1.7.2
- Fidelity: Fix replay of TikTok - Fidelity: Fix replay of TikTok
- Dependencies: Update to wabac.js 2.13.4 - Dependencies: Update to wabac.js 2.13.4
- Docs: Update to embedding guide to mention new embed modes - Docs: Update to embedding guide to mention new embed modes
v1.7.1 v1.7.1
- Electron App: Fix electron app not loading preload.js, regression in 1.7.0 - Electron App: Fix electron app not loading preload.js, regression in 1.7.0
- Fidelity: Fixed embedded tweet video issue (via wabac.js) - Fidelity: Fixed embedded tweet video issue (via wabac.js)
- Fidelity: rewrite target="new" to not open new window - Fidelity: rewrite target="new" to not open new window
- Dependencies: Update to wabac.js 2.13.3 - Dependencies: Update to wabac.js 2.13.3
v1.7.0 v1.7.0
- UI: Support showing WACZ verification stats on info tab, showing hashes verified, observer domain, (or public key and creation software), and certificate fingerprint, and WACZ package digest - UI: Support showing WACZ verification stats on info tab, showing hashes verified, observer domain, (or public key and creation software), and certificate fingerprint, and WACZ package digest
- Embed UI: Add `replay-with-info` embed mode which provides an information dropdown above replay, including verification info and link to download. - Embed UI: Add `replay-with-info` embed mode which provides an information dropdown above replay, including verification info and link to download.
- Embed UI: Add `hideOffscreen` attribute to enable hiding embed when offscreen (previously always enabled). - Embed UI: Add `hideOffscreen` attribute to enable hiding embed when offscreen (previously always enabled).
@@ -154,6 +182,7 @@ v1.7.0
- Dependencies: update to wabac.js 2.13.2 to support verification, latest wombat (3.3.9) - Dependencies: update to wabac.js 2.13.2 to support verification, latest wombat (3.3.9)
v1.6.5 v1.6.5
- Loading: Don't ignore hashtag, eg. #.wacz to specify file type when loading (via wabac.js) - Loading: Don't ignore hashtag, eg. #.wacz to specify file type when loading (via wabac.js)
- Documentation: Update embedding guide to mention self-hosting of embed scripts - Documentation: Update embedding guide to mention self-hosting of embed scripts
- Embed: Use `display: block` for embed to avoid extra scrollbars - Embed: Use `display: block` for embed to avoid extra scrollbars
@@ -161,26 +190,31 @@ v1.6.5
- Dependencies: update to wabac.js 2.12.5 - Dependencies: update to wabac.js 2.12.5
v1.6.4 v1.6.4
- Embeds: Support `noCache` attribute in `<replay-web-page>` to disable cacheing any HTTP response payloads - Embeds: Support `noCache` attribute in `<replay-web-page>` to disable cacheing any HTTP response payloads
- Dependencies: update to wabac.js 2.12.3 - Dependencies: update to wabac.js 2.12.3
v1.6.3 v1.6.3
- Loading: replay fixes for WARCs with revisit records (via wabac.js) - Loading: replay fixes for WARCs with revisit records (via wabac.js)
- Fidelity: fix for rewriting of some JS incorrectly treated as a module (via wabac.js) - Fidelity: fix for rewriting of some JS incorrectly treated as a module (via wabac.js)
- Loading: fix loading ipfs:// urls (via wabac.js) - Loading: fix loading ipfs:// urls (via wabac.js)
- Dependencies: update to wabac.js 2.12.2 - Dependencies: update to wabac.js 2.12.2
v1.6.2 v1.6.2
- Library: additional fixes, make 'purge cache' configurable - Library: additional fixes, make 'purge cache' configurable
- Library: Add index.html to npm bundle - Library: Add index.html to npm bundle
- UI: Fix date padding - UI: Fix date padding
v1.6.1 v1.6.1
- Embed/Library: Make embedding more extensable for use as a library (for archiveweb.page extensions) - Embed/Library: Make embedding more extensable for use as a library (for archiveweb.page extensions)
- UI: Unified service worker error messaging for regular and embed mode, show correct error when loaded over http. - UI: Unified service worker error messaging for regular and embed mode, show correct error when loaded over http.
- Dependencies: update ruffle to 2022-07-02 - Dependencies: update ruffle to 2022-07-02
v1.6.0 v1.6.0
- Embeds: Support embedding without using webworker with 'noWebWorker' attrib added to `<replay-web-page>` - Embeds: Support embedding without using webworker with 'noWebWorker' attrib added to `<replay-web-page>`
- Fidelity: improved replay of pages that use eval() in global scope (via wabac.js) - Fidelity: improved replay of pages that use eval() in global scope (via wabac.js)
- Fidelity: improved replay of twitter videos archived via browsertrix-crawler/pywb (via wabac.js) - Fidelity: improved replay of twitter videos archived via browsertrix-crawler/pywb (via wabac.js)
@@ -190,6 +224,7 @@ v1.6.0
- Dependencies: update to wabac.js 2.12.0, update to electron 19.0.4 - Dependencies: update to wabac.js 2.12.0, update to electron 19.0.4
v1.5.11 v1.5.11
- Loading: fix url lookup when no '=' in query arg, optimize loading compressed index (only load 3 blocks), via (wabac.js) - Loading: fix url lookup when no '=' in query arg, optimize loading compressed index (only load 3 blocks), via (wabac.js)
- Loading: fix url lookup api calls - Loading: fix url lookup api calls
- Loading: new live proxy support, per-hostname config, combined with wacz loading or main 'proxy:' config - Loading: new live proxy support, per-hostname config, combined with wacz loading or main 'proxy:' config
@@ -197,31 +232,37 @@ v1.5.11
- Dependencies: update to wabac.js 2.11.1 - Dependencies: update to wabac.js 2.11.1
v1.5.10 v1.5.10
- Fidelity: Encoding fix for non-ascii links, optimizations for utf-8 parsing (via wabac.js 2.10.3) - Fidelity: Encoding fix for non-ascii links, optimizations for utf-8 parsing (via wabac.js 2.10.3)
- Dependencies: update to wabac.js 2.10.3 - Dependencies: update to wabac.js 2.10.3
v1.5.9 v1.5.9
- Dependencies: update to wabac.js 2.10.2 - Dependencies: update to wabac.js 2.10.2
- Loading: for experimental multi-wacz input, disable periodic reload for now - Loading: for experimental multi-wacz input, disable periodic reload for now
v1.5.8 v1.5.8
- Loading: fix hosted replay via subpath when opening in new tab (#82) - Loading: fix hosted replay via subpath when opening in new tab (#82)
- Loading: fix multi-wacz support in wabac.js - Loading: fix multi-wacz support in wabac.js
- Dependencies: update to wabac.js 2.10.1 - Dependencies: update to wabac.js 2.10.1
v1.5.7 v1.5.7
- Dependencies: update to wabac.js 2.10.0 and wombat 3.3.6 - Dependencies: update to wabac.js 2.10.0 and wombat 3.3.6
- Dependencies: update to electron 16.0.6 (chromium 96) - Dependencies: update to electron 16.0.6 (chromium 96)
- Dependencies: update ruffle to latest nightly (2022-01-08) - Dependencies: update ruffle to latest nightly (2022-01-08)
- Dependencies: update lit to 2.1.1 - Dependencies: update lit to 2.1.1
v1.5.6 v1.5.6
- Fidelity: Fix assignment to local location causing invalid redirect (via wombat 3.3.5) - Fidelity: Fix assignment to local location causing invalid redirect (via wombat 3.3.5)
- Loading: Optimized loading for larger WARCs (via warcio 1.5.0) - Loading: Optimized loading for larger WARCs (via warcio 1.5.0)
- Loading: Show number of WARC records loaded (via wabac.js 2.10.0-beta.0) - Loading: Show number of WARC records loaded (via wabac.js 2.10.0-beta.0)
- Loading: Use separate web worker for loading, then remove for possible faster loading - Loading: Use separate web worker for loading, then remove for possible faster loading
v1.5.5 v1.5.5
- Fidelity: Only wrap JS globals if necessary (via wabac.js 2.9.5) - Fidelity: Only wrap JS globals if necessary (via wabac.js 2.9.5)
- UI: Add download option from collection info and dropdown menu to download web archives from http. - UI: Add download option from collection info and dropdown menu to download web archives from http.
- Dependencies: update to wabac.js 2.9.5 - Dependencies: update to wabac.js 2.9.5
@@ -229,6 +270,7 @@ v1.5.5
- Dependencies: update ruffle to latest nightly (2021-10-25) - Dependencies: update ruffle to latest nightly (2021-10-25)
v1.5.4 v1.5.4
- Fidelity: Faster rewriting of large JS files - Fidelity: Faster rewriting of large JS files
- Fidelity: Fixes for twitter video replay - Fidelity: Fixes for twitter video replay
- Loading: Fix IPFS loading of WARCs - Loading: Fix IPFS loading of WARCs
@@ -237,22 +279,26 @@ v1.5.4
- Dependencies: update to wabac.js 2.9.4 - Dependencies: update to wabac.js 2.9.4
v1.5.3 v1.5.3
- Fidelity: fix for some eval replay (via wombat), include http->https check for wacz sources - Fidelity: fix for some eval replay (via wombat), include http->https check for wacz sources
- Dependencies: update to webpack 5 build, wabac.js 2.9.2, wombat 3.3.4 - Dependencies: update to webpack 5 build, wabac.js 2.9.2, wombat 3.3.4
- Search: update to latest flexsearch, faster/improved searching - Search: update to latest flexsearch, faster/improved searching
v1.5.2 v1.5.2
- App: IPFS: Configure js-ipfs repo directory to be in existing profile directory - App: IPFS: Configure js-ipfs repo directory to be in existing profile directory
- Loading: IPFS: Fix IPFS support for OSX M1 builds by including leveldown prebuilds - Loading: IPFS: Fix IPFS support for OSX M1 builds by including leveldown prebuilds
- Dependencies: update to wabac.js 2.9.1, wombat 3.3.3 - Dependencies: update to wabac.js 2.9.1, wombat 3.3.3
v1.5.1 v1.5.1
- Library usage: Simplfy download options in editable mode, add warc/1.0 download opt (for archiveweb.page) - Library usage: Simplfy download options in editable mode, add warc/1.0 download opt (for archiveweb.page)
- Library usage: Allow custom service worker init path on app init (or none) - Library usage: Allow custom service worker init path on app init (or none)
- Library usage: Ensure page title reflects current app - Library usage: Ensure page title reflects current app
- UI: Refresh UI after half second while waiting for service worker to load, instead of every 5. - UI: Refresh UI after half second while waiting for service worker to load, instead of every 5.
v1.5.0 v1.5.0
- Update to wabac.js 2.9.0-beta.1, fidelity and loading improvements, smaller size (includes indexeddb data migration) - Update to wabac.js 2.9.0-beta.1, fidelity and loading improvements, smaller size (includes indexeddb data migration)
- Update to electron 14 (latest beta), Chromium 93 - Update to electron 14 (latest beta), Chromium 93
- Update to Universal builds for OS X. - Update to Universal builds for OS X.
@@ -260,6 +306,7 @@ v1.5.0
- Embeds: Better error message for when service worker could not be loaded. - Embeds: Better error message for when service worker could not be loaded.
v1.4.7 v1.4.7
- Loading: HAR file loading: Add messages when HAR file content is missing, don't filter out empty urls (via wabac.js) - Loading: HAR file loading: Add messages when HAR file content is missing, don't filter out empty urls (via wabac.js)
- Loading: Fix "null" added on Not Found error page when there is no hashtag. - Loading: Fix "null" added on Not Found error page when there is no hashtag.
- Fidelity: Disable post-to-GET conversion (no longer need in latest Chrome!) - Fidelity: Disable post-to-GET conversion (no longer need in latest Chrome!)
@@ -268,6 +315,7 @@ v1.4.7
- Dependencies: bump to wabac.js 2.8.0, wombat to 3.3.1 - Dependencies: bump to wabac.js 2.8.0, wombat to 3.3.1
v1.4.6 v1.4.6
- Fidelity: Better WS override that avoids network connection attempts, fixes to pixel ratio override (via wombat.js) - Fidelity: Better WS override that avoids network connection attempts, fixes to pixel ratio override (via wombat.js)
- Fidelity: Better SW override, add missing members that caused errors (via wombat.js) - Fidelity: Better SW override, add missing members that caused errors (via wombat.js)
- Fidelity: Better Storage overrides, more compatible with native Storage APIs (via wombat.js) - Fidelity: Better Storage overrides, more compatible with native Storage APIs (via wombat.js)
@@ -276,17 +324,20 @@ v1.4.6
- Dependencies: bump to wabac.js 2.7.10, wombat 3.2.2 - Dependencies: bump to wabac.js 2.7.10, wombat 3.2.2
v1.4.5 v1.4.5
- Loading: Fix IPFS loading (fixed in wabac.js 2.7.8) - Loading: Fix IPFS loading (fixed in wabac.js 2.7.8)
- Fidelity: Support replaying localStorage/sessionStorage (if available) - Fidelity: Support replaying localStorage/sessionStorage (if available)
- Dependencies: bump to wabac.js 2.7.7, wombat 3.2.0 - Dependencies: bump to wabac.js 2.7.7, wombat 3.2.0
v1.4.4 v1.4.4
- Loading: Fix loading from sources that don't support range requests for HEAD, don't send If-Range header (fixes in wabac.js 2.7.7) - Loading: Fix loading from sources that don't support range requests for HEAD, don't send If-Range header (fixes in wabac.js 2.7.7)
- Loading: Cleanup of any partial data loaded when collection load fails (from wabac.js) - Loading: Cleanup of any partial data loaded when collection load fails (from wabac.js)
- Fidelity: Improved fidelity of certain sites that use eval() (from wabac.js) - Fidelity: Improved fidelity of certain sites that use eval() (from wabac.js)
- Dependencies: bump to wabac.js 2.7.8, wombat 3.1.8, Electron 11.4.8 - Dependencies: bump to wabac.js 2.7.8, wombat 3.1.8, Electron 11.4.8
v1.4.3 v1.4.3
- Loading: Various fixes to index loading for compessed WACZ index - Loading: Various fixes to index loading for compessed WACZ index
- Fidelity: Fix edge-case POST-to-get conversion - binary, empty and text/plain POST payloads now handled same way here (via wabac.js/warcio.js) as in other tools (pywb, cdxj-indexer) - Fidelity: Fix edge-case POST-to-get conversion - binary, empty and text/plain POST payloads now handled same way here (via wabac.js/warcio.js) as in other tools (pywb, cdxj-indexer)
- Customization: Support for automated redirect to live page on not found (via embed options) - Customization: Support for automated redirect to live page on not found (via embed options)
@@ -295,15 +346,18 @@ v1.4.3
- Dependencies: bump to wabac.js 2.7.4 - Dependencies: bump to wabac.js 2.7.4
v1.4.2 v1.4.2
- Loading: Optimized loading WACZ in wabac.js (cache compressed index loading to avoid duplicate loading) - Loading: Optimized loading WACZ in wabac.js (cache compressed index loading to avoid duplicate loading)
- Loading: General fixes for WACZ loading (better format detection for newer and older versions, surt/non-surt indexes) - Loading: General fixes for WACZ loading (better format detection for newer and older versions, surt/non-surt indexes)
- Update to latest wabac.js 2.7.3 - Update to latest wabac.js 2.7.3
v1.4.1 v1.4.1
- Replay: Remove 'download' attribute from anchor tags, which doesn't work in Chrome - Replay: Remove 'download' attribute from anchor tags, which doesn't work in Chrome
- Loading: Fix loading of full-text search index from older wacz - Loading: Fix loading of full-text search index from older wacz
v1.4.0 v1.4.0
- Embed: add 'noSandbox' option to not add sandbox to embed iframe - Embed: add 'noSandbox' option to not add sandbox to embed iframe
- UI: Double-clicking on page entry causes reload. - UI: Double-clicking on page entry causes reload.
- UI: Fix location bar enter not always reloading specified URL - UI: Fix location bar enter not always reloading specified URL
@@ -321,18 +375,22 @@ v1.4.0
- Dependencies: wabac 2.7.0, bulma 0.9.2, electron 11.4.3 - Dependencies: wabac 2.7.0, bulma 0.9.2, electron 11.4.3
v1.3.15 v1.3.15
- Fidelity: fix encoding issues with UTF-8 encoded JS/CSS introduced in 1.3.13 (fixed via wabac 2.6.9) - Fidelity: fix encoding issues with UTF-8 encoded JS/CSS introduced in 1.3.13 (fixed via wabac 2.6.9)
- Dependencies: wabac 2.6.9 - Dependencies: wabac 2.6.9
v1.3.14 v1.3.14
- Build: Fix incorrectly packaged npm package for 1.3.13, no other changes - Build: Fix incorrectly packaged npm package for 1.3.13, no other changes
v1.3.13 v1.3.13
- Fidelity: fix encoding issues with non-UTF-8 encoded pages (wabac 2.6.8) - Fidelity: fix encoding issues with non-UTF-8 encoded pages (wabac 2.6.8)
- Fidelity: Better detection of JSONP, better rewriting of pages that use JSONP (wabac 2.6.7) - Fidelity: Better detection of JSONP, better rewriting of pages that use JSONP (wabac 2.6.7)
- Dependencies: wabac 2.6.8 - Dependencies: wabac 2.6.8
v1.3.12 v1.3.12
- Loading: Fix bug with pages from WACZ files showing loading time, instead of actual timestamp. - Loading: Fix bug with pages from WACZ files showing loading time, instead of actual timestamp.
- Loading: WACZ loading works efficiently even when HEAD method is not supported. - Loading: WACZ loading works efficiently even when HEAD method is not supported.
- Embeds: Resolve embed source to current page instead of to replayBase - Embeds: Resolve embed source to current page instead of to replayBase
@@ -340,12 +398,14 @@ v1.3.12
- Dependencies: wabac 2.6.6 - Dependencies: wabac 2.6.6
v1.3.11 v1.3.11
- Loading: Fix regression in indexing of WARCs, including ignoring metadata records that were accidentally being indexed. - Loading: Fix regression in indexing of WARCs, including ignoring metadata records that were accidentally being indexed.
- Loading: Add periodic ping when loading to avoid serviceworker shutdown in Firefox. - Loading: Add periodic ping when loading to avoid serviceworker shutdown in Firefox.
- UI: On load failure, only add 'try again' option when reasonable. - UI: On load failure, only add 'try again' option when reasonable.
- Dependencies: wabac 2.6.5 - Dependencies: wabac 2.6.5
v1.3.10 v1.3.10
- Loading: Improved loading of video, especially on Safari, cache range requests via loading - Loading: Improved loading of video, especially on Safari, cache range requests via loading
- Loading: Improved loading stability from service worker waiting for loading event to finish! - Loading: Improved loading stability from service worker waiting for loading event to finish!
- UI: Allow retry on loading errors even in non-embed mode. - UI: Allow retry on loading errors even in non-embed mode.
@@ -355,10 +415,12 @@ v1.3.10
- Dependencies: wabac.js 2.6.4, wombat 3.1.2, warcio 1.4.2, Electron 11.3.0 - Dependencies: wabac.js 2.6.4, wombat 3.1.2, warcio 1.4.2, Electron 11.3.0
v1.3.9 v1.3.9
- Fidelity: Upgrade to wabac.js 2.6.1, wombat 3.1.1: improved POST request rewriting for multipart/form-data, Tableau dashboard fidelity - Fidelity: Upgrade to wabac.js 2.6.1, wombat 3.1.1: improved POST request rewriting for multipart/form-data, Tableau dashboard fidelity
- UI: editable mode: style fix on page delete spinner, don't show editing options on sidebar - UI: editable mode: style fix on page delete spinner, don't show editing options on sidebar
v1.3.8 v1.3.8
- UI: Native files: Support asking permission when doing a full reload of a local file. - UI: Native files: Support asking permission when doing a full reload of a local file.
- Library: Add WrModal UI element to simplify modal creation. - Library: Add WrModal UI element to simplify modal creation.
- Library: UI: Add confirmation for page-deletion and multi page deletion when in editing mode (currently only used in ArchiveWeb.page) - Library: UI: Add confirmation for page-deletion and multi page deletion when in editing mode (currently only used in ArchiveWeb.page)
@@ -366,33 +428,41 @@ v1.3.8
- Dependencies: Update to wabac.js 2.5.6, wombat 3.0.4 - Dependencies: Update to wabac.js 2.5.6, wombat 3.0.4
v1.3.7 v1.3.7
- Library: Add missing index.js to support loading 'replaywebpage' package - Library: Add missing index.js to support loading 'replaywebpage' package
v1.3.6 v1.3.6
- Switch back to Electron 11.2.0 / Chrome 87 to keep support for Flash plugin - Switch back to Electron 11.2.0 / Chrome 87 to keep support for Flash plugin
v1.3.5 v1.3.5
- Dependency update: Latest wabac.js / warcio / wombat - Dependency update: Latest wabac.js / warcio / wombat
- Electron App: Update to Chrome 88, fix for PDF rendering - Electron App: Update to Chrome 88, fix for PDF rendering
v1.3.4 v1.3.4
- Loading: Fix loading local files in App - Loading: Fix loading local files in App
- Fidelity: Latest wabac.js - Fidelity: Latest wabac.js
- Autoupdate: Add initial support for auto-updating - Autoupdate: Add initial support for auto-updating
v1.3.3 v1.3.3
- UI: Component customization improvements, update to latest wabac.js - UI: Component customization improvements, update to latest wabac.js
- Loading: Improvements for IPFS loading, fix loading with hashtag #filename= in Electron app - Loading: Improvements for IPFS loading, fix loading with hashtag #filename= in Electron app
v1.3.2 v1.3.2
- UI: Show navbar on all pages, include breadcrumbs with collection title current page - UI: Show navbar on all pages, include breadcrumbs with collection title current page
- UI: Condense frontpage UI slightly - UI: Condense frontpage UI slightly
v1.3.1 v1.3.1
- Loading: Support updated WACZ Format (1.0.0) with latest wabac.js update - Loading: Support updated WACZ Format (1.0.0) with latest wabac.js update
- Loading: Archives loaded with via native file system can be reloaded after purge cache (chrome only) - Loading: Archives loaded with via native file system can be reloaded after purge cache (chrome only)
v1.3.0 v1.3.0
- UI: Condense navbar and location bar: add logo to location bar, condense button spacing, add about link to context menu - UI: Condense navbar and location bar: add logo to location bar, condense button spacing, add about link to context menu
- UI: Add collection info dropdown to be a separate tab instead - UI: Add collection info dropdown to be a separate tab instead
- UI: Convert Terms into general About dialog - UI: Convert Terms into general About dialog
@@ -405,22 +475,23 @@ v1.3.0
- UI: Purge Cache / Full Reload reloads current frame, not parent - UI: Purge Cache / Full Reload reloads current frame, not parent
v1.2.1 v1.2.1
- Loading/UI: Fix Google Drive Loading/Reauthorization: Only trigger when reauth is needed. For rate-limit errors, attempt reloading more slowly (exponential backoff) - Loading/UI: Fix Google Drive Loading/Reauthorization: Only trigger when reauth is needed. For rate-limit errors, attempt reloading more slowly (exponential backoff)
- Loading: ReplayWeb.page App supports opening WACZ, WARC and HAR files via double-clicking from OS and via command-line. - Loading: ReplayWeb.page App supports opening WACZ, WARC and HAR files via double-clicking from OS and via command-line.
v1.2.0 v1.2.0
- UI: Location bar fixes: Enter reloads same URL, Escape restores current URL, properly updated on navigation, Favicon displayed in location bar if available - UI: Location bar fixes: Enter reloads same URL, Escape restores current URL, properly updated on navigation, Favicon displayed in location bar if available
- UI: URL search defaults to all URL query, not HTML only query - UI: URL search defaults to all URL query, not HTML only query
- Fidelity: Rewriting system overhaul, improved youtube rules, fuzzy matching improvements (using Levenshtein distance for query args) - Fidelity: Rewriting system overhaul, improved youtube rules, fuzzy matching improvements (using Levenshtein distance for query args)
- Backend: Support for WARC record proxy, including kiwix/zim style separate headers and payload requests: headers loaded from `<prefix>/H/<url>`, payload from `<prefix>/A/<url>` - Backend: Support for WARC record proxy, including kiwix/zim style separate headers and payload requests: headers loaded from `<prefix>/H/<url>`, payload from `<prefix>/A/<url>`
v1.1.2 v1.1.2
- UI: Fix auto-loading of additional results on url search page when searching by mime type. - UI: Fix auto-loading of additional results on url search page when searching by mime type.
- Fidelity: More fixes to replay of embedded "about:blank", fix replay of embedded tweets in particular. - Fidelity: More fixes to replay of embedded "about:blank", fix replay of embedded tweets in particular.
- Fidelity: Various improvements to fuzzy matching (longer params weighed higher, numeric params weighed by difference, support for required params) - Fidelity: Various improvements to fuzzy matching (longer params weighed higher, numeric params weighed by difference, support for required params)
v1.1.1 v1.1.1
- UI: Sort column is now remembered (for page lists, url resources and main collection lists) - UI: Sort column is now remembered (for page lists, url resources and main collection lists)
@@ -429,7 +500,6 @@ v1.1.1
- Fidelity: Fixed rewriting of web workers - Fidelity: Fixed rewriting of web workers
- Fidelity: Fixed rewriting of embedded "about:blank" iframes, which may not have replayed correctly. - Fidelity: Fixed rewriting of embedded "about:blank" iframes, which may not have replayed correctly.
v1.1.0 v1.1.0
- Improved UI for embedding, allow viewing all search (story/pages/url) tabs - Improved UI for embedding, allow viewing all search (story/pages/url) tabs
+2 -11
View File
@@ -3,6 +3,7 @@
# ReplayWeb.page # ReplayWeb.page
## Serverless Web Archive Replay ## Serverless Web Archive Replay
[Embedded Viewer](https://replayweb.page/docs/embedding) Usage: [![](https://data.jsdelivr.com/v1/package/npm/replaywebpage/badge)](https://www.jsdelivr.com/package/npm/replaywebpage) [Embedded Viewer](https://replayweb.page/docs/embedding) Usage: [![](https://data.jsdelivr.com/v1/package/npm/replaywebpage/badge)](https://www.jsdelivr.com/package/npm/replaywebpage)
ReplayWeb.page provides a full web archive replay system running directly in the browser, ReplayWeb.page provides a full web archive replay system running directly in the browser,
@@ -18,7 +19,6 @@ The ReplayWeb.page App can be downloaded from the [Releases](https://replayweb.p
See the [Embedding Guide](https://replayweb.page/docs/embedding) for more info on embedding web archives in other sites. See the [Embedding Guide](https://replayweb.page/docs/embedding) for more info on embedding web archives in other sites.
## What's in this repo ## What's in this repo
ReplayWeb.page is a static web site / offline web app + Electron app. ReplayWeb.page is a static web site / offline web app + Electron app.
@@ -29,6 +29,7 @@ implementation found at: https://github.com/webrecorder/wabac.js
The frontend is loaded from `ui.js`, while the backend service/web worker is loaded from `sw.js`. The frontend is loaded from `ui.js`, while the backend service/web worker is loaded from `sw.js`.
This repository contains: This repository contains:
- The built assets for the site hosted at https://replayweb.page/ via GitHub Pages - The built assets for the site hosted at https://replayweb.page/ via GitHub Pages
- The package for npm module: https://www.npmjs.com/package/replaywebpage - The package for npm module: https://www.npmjs.com/package/replaywebpage
- A build system for https://replayweb.page and ReplayWeb.page App. - A build system for https://replayweb.page and ReplayWeb.page App.
@@ -41,7 +42,6 @@ To run ReplayWeb.page and view web archives, a regular HTTP server is all that i
ReplayWeb.page can run with any HTTP server locally. For example, you can run `http-server -p 9990` or `python -m http.server 9990` to run a static web server in the directory of this repository. Then, simply load `http://localhost:9990/` and you'll have replayweb.page running locally. ReplayWeb.page can run with any HTTP server locally. For example, you can run `http-server -p 9990` or `python -m http.server 9990` to run a static web server in the directory of this repository. Then, simply load `http://localhost:9990/` and you'll have replayweb.page running locally.
## Developing ReplayWeb.page ## Developing ReplayWeb.page
ReplayWeb.page is built as a Node package can be installed using yarn: ReplayWeb.page is built as a Node package can be installed using yarn:
@@ -66,29 +66,20 @@ The package provides various commands that can be used with yarn:
- `yarn run start-jekyll` - to build Jekyll docs and start Jekyll static server on port 4000. - `yarn run start-jekyll` - to build Jekyll docs and start Jekyll static server on port 4000.
The static assets are placed in the root `index.html`, `sw.js` and `ui.js`, and can be used with any HTTP server. The static assets are placed in the root `index.html`, `sw.js` and `ui.js`, and can be used with any HTTP server.
For service workers to work, they must be served from either localhost or an HTTPS endpoint. For service workers to work, they must be served from either localhost or an HTTPS endpoint.
See the [user docs](https://replayweb.page/docs/) for additional info about using ReplayWeb.page See the [user docs](https://replayweb.page/docs/) for additional info about using ReplayWeb.page
## LICENSE ## LICENSE
ReplayWeb.page is made available under the AGPLv3 License. ReplayWeb.page is made available under the AGPLv3 License.
If you would like to use it under a different license or have a question, please reach out as that may be a possibility. If you would like to use it under a different license or have a question, please reach out as that may be a possibility.
## Contributing and Bug Reports ## Contributing and Bug Reports
Contributions are definitely welcome! Contributions are definitely welcome!
As this is still a new project and rapidly evolving, please open an issue first before submitting a pull request. As this is still a new project and rapidly evolving, please open an issue first before submitting a pull request.
-1
View File
@@ -42,4 +42,3 @@ exclude:
- plugins-win/ - plugins-win/
- plugins-mac/ - plugins-mac/
- plugins-linux/ - plugins-linux/
-1
View File
@@ -44,4 +44,3 @@ $nav-width-md: $nav-width;
padding: 0 0 0 10px; padding: 0 0 0 10px;
margin: 0; margin: 0;
} }
+1 -4
View File
@@ -119,9 +119,7 @@ a:focus {
font-size: $body-size; font-size: $body-size;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
min-width: $body-min-width; min-width: $body-min-width; // @todo(emma, 2023-11-06) investigate why this is here
overflow-x: $body-overflow-x;
overflow-y: $body-overflow-y;
text-rendering: $body-rendering; text-rendering: $body-rendering;
text-size-adjust: 100%; text-size-adjust: 100%;
@@ -132,7 +130,6 @@ a:focus {
line-height: $body-line-height; line-height: $body-line-height;
box-sizing: border-box; box-sizing: border-box;
overflow: hidden;
} }
// Make available to screen readers while hiding element visually: // Make available to screen readers while hiding element visually:
+16 -13
View File
@@ -1,15 +1,18 @@
<html> <html>
<head> <head>
<script src="ui.js"></script> <script src="ui.js"></script>
<style> <style>
body { body {
background-color: lightgrey; background-color: lightgrey;
} }
</style> </style>
</head> </head>
<body> <body>
<replay-web-page
<replay-web-page replaybase="./" embed="replay-with-info" src="./docs/assets/tweet-example.wacz" url="page:0"></replay-web-page> replaybase="./"
embed="replay-with-info"
</body> src="./docs/assets/tweet-example.wacz"
url="page:0"
></replay-web-page>
</body>
</html> </html>
+10 -10
View File
@@ -1,13 +1,13 @@
<!doctype html> <!doctype html>
<html class="no-overflow"> <html class="no-overflow">
<head> <head>
<link rel="manifest" href="/webmanifest.json"> <link rel="manifest" href="/webmanifest.json" />
<link rel="icon" href="build/icon.png" type="image/png" /> <link rel="icon" href="build/icon.png" type="image/png" />
<title>ReplayWeb.page</title> <title>ReplayWeb.page</title>
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="./ui.js"></script> <script src="./ui.js"></script>
</head> </head>
<body> <body>
<replay-app-main></replay-app-main> <replay-app-main></replay-app-main>
</body> </body>
</html> </html>
+1 -2
View File
@@ -1,2 +1 @@
export * from './ui.js'; export * from "./ui.js";
+7 -4
View File
@@ -30,12 +30,14 @@
}, },
"devDependencies": { "devDependencies": {
"@types/flexsearch": "^0.7.3", "@types/flexsearch": "^0.7.3",
"@typescript-eslint/eslint-plugin": "^6.9.1",
"@typescript-eslint/parser": "^6.9.1",
"copy-webpack-plugin": "^9.0.1", "copy-webpack-plugin": "^9.0.1",
"css-loader": "^6.2.0", "css-loader": "^6.2.0",
"electron": "^25.1.1", "electron": "^25.1.1",
"electron-builder": "^23.0.3", "electron-builder": "^23.0.3",
"electron-notarize": "^1.1.1", "electron-notarize": "^1.1.1",
"eslint": "^8.23.1", "eslint": "^8.52.0",
"eslint-config-prettier": "^9.0.0", "eslint-config-prettier": "^9.0.0",
"eslint-plugin-lit": "^1.9.1", "eslint-plugin-lit": "^1.9.1",
"http-server": "^13.0.2", "http-server": "^13.0.2",
@@ -48,8 +50,9 @@
"sass-loader": "^13.3.2", "sass-loader": "^13.3.2",
"style-loader": "^3.2.1", "style-loader": "^3.2.1",
"svg-inline-loader": "^0.8.2", "svg-inline-loader": "^0.8.2",
"ts-lit-plugin": "^2.0.0-pre.1",
"ts-loader": "^9.4.4", "ts-loader": "^9.4.4",
"typescript": "^5.1.6", "typescript": "^5.2.2",
"webpack": "^5.75.0", "webpack": "^5.75.0",
"webpack-cli": "^5.0.1", "webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1" "webpack-dev-server": "^4.11.1"
@@ -76,8 +79,8 @@
"dist": "yarn run build && yarn run pack", "dist": "yarn run build && yarn run pack",
"dist-dev": "yarn run build-dev && yarn run pack", "dist-dev": "yarn run build-dev && yarn run pack",
"release": "yarn run build && electron-builder", "release": "yarn run build && electron-builder",
"lint": "eslint ./src/ webpack.config.js", "lint": "eslint ./",
"format": "prettier --write ./src", "format": "prettier --write ./",
"prepare": "husky install" "prepare": "husky install"
}, },
"build": { "build": {
+10 -7
View File
@@ -1,5 +1,5 @@
import { LitElement, html, css } from "lit"; import { LitElement, html, css } from "lit";
import { property, state } from "lit/decorators.js"; import { property } from "lit/decorators.js";
import { ifDefined } from "lit/directives/if-defined.js"; import { ifDefined } from "lit/directives/if-defined.js";
import { import {
wrapCss, wrapCss,
@@ -13,6 +13,9 @@ import fasHelp from "@fortawesome/fontawesome-free/svgs/solid/question-circle.sv
import fasArrowLeft from "@fortawesome/fontawesome-free/svgs/solid/arrow-left.svg"; import fasArrowLeft from "@fortawesome/fontawesome-free/svgs/solid/arrow-left.svg";
import fasArrowRight from "@fortawesome/fontawesome-free/svgs/solid/arrow-right.svg"; import fasArrowRight from "@fortawesome/fontawesome-free/svgs/solid/arrow-right.svg";
import { SWManager } from "./swmanager"; import { SWManager } from "./swmanager";
import "./item";
import "./item-index";
import "./chooser";
// =========================================================================== // ===========================================================================
class ReplayWebApp extends LitElement { class ReplayWebApp extends LitElement {
@@ -157,7 +160,7 @@ class ReplayWebApp extends LitElement {
min-width: 0px; min-width: 0px;
flex-direction: column; flex-direction: column;
} }
wr-coll { wr-item {
height: 100%; height: 100%;
} }
.navbar { .navbar {
@@ -379,7 +382,7 @@ class ReplayWebApp extends LitElement {
} }
renderColl() { renderColl() {
return html` <wr-coll return html` <wr-item
.loadInfo="${this.loadInfo}" .loadInfo="${this.loadInfo}"
sourceUrl="${this.sourceUrl || ""}" sourceUrl="${this.sourceUrl || ""}"
embed="${this.embed}" embed="${this.embed}"
@@ -390,11 +393,11 @@ class ReplayWebApp extends LitElement {
@update-title=${this.onTitle} @update-title=${this.onTitle}
@coll-loaded=${this.onCollLoaded} @coll-loaded=${this.onCollLoaded}
@about-show=${() => (this.showAbout = true)} @about-show=${() => (this.showAbout = true)}
></wr-coll>`; ></wr-item>`;
} }
renderHomeIndex() { renderHomeIndex() {
return html` <wr-coll-index> return html` <wr-item-index>
${!IS_APP ${!IS_APP
? html` ? html`
<p slot="header" class="tagline is-size-5 has-text-centered"> <p slot="header" class="tagline is-size-5 has-text-centered">
@@ -412,7 +415,7 @@ class ReplayWebApp extends LitElement {
@did-drop-file="${() => (this.droppedFile = null)}" @did-drop-file="${() => (this.droppedFile = null)}"
@load-start=${this.onStartLoad} @load-start=${this.onStartLoad}
></wr-chooser> ></wr-chooser>
</wr-coll-index>`; </wr-item-index>`;
} }
render() { render() {
@@ -763,7 +766,7 @@ class ReplayWebApp extends LitElement {
<summary>Legalese:</summary> <summary>Legalese:</summary>
<p style="font-size: 0.8rem">DISCLAIMER OF SOFTWARE WARRANTY. WEBRECORDER SOFTWARE PROVIDES THIS SOFTWARE TO YOU "AS AVAILABLE" <p style="font-size: 0.8rem">DISCLAIMER OF SOFTWARE WARRANTY. WEBRECORDER SOFTWARE PROVIDES THIS SOFTWARE TO YOU "AS AVAILABLE"
AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
INCLUDING WITHOUT LIMITATION ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. INCLUDING WITHOUT LIMITATION ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.</p>
</details> </details>
<div class="has-text-centered"> <div class="has-text-centered">
<a class="button is-warning" href="#" @click="${ <a class="button is-warning" href="#" @click="${
+2 -1
View File
@@ -37,7 +37,8 @@ class Chooser extends LitElement {
static get properties() { static get properties() {
return { return {
fileDisplayName: { type: String }, fileDisplayName: { type: String },
droppedFile: { type: File }, /** @type File */
droppedFile: { attribute: false },
newFullImport: { type: Boolean }, newFullImport: { type: Boolean },
noHead: { type: Boolean }, noHead: { type: Boolean },
}; };
-625
View File
@@ -1,625 +0,0 @@
import { LitElement, html, css } from "lit";
import { property, state } from "lit/decorators.js";
import { wrapCss, apiPrefix } from "./misc";
import { map } from "lit/directives/map.js";
import prettyBytes from "pretty-bytes";
import fasCopy from "@fortawesome/fontawesome-free/svgs/regular/copy.svg";
import fasArrowUp from "@fortawesome/fontawesome-free/svgs/solid/angle-double-up.svg";
import fasArrowDown from "@fortawesome/fontawesome-free/svgs/solid/angle-double-down.svg";
import fasSearch from "@fortawesome/fontawesome-free/svgs/solid/search.svg";
import type { Coll } from "./types";
// ===========================================================================
class CollIndex extends LitElement {
@property({ type: Array })
colls: Coll[] = [];
@property({ type: String })
query = "";
@property({ type: Array })
filteredColls: any[] = [];
@property({ type: Array })
sortedColls: any[] | null = null;
@property({ type: Boolean })
hideHeader: any = null;
@property({ type: String })
dateName = "Date Loaded";
@property({ type: String })
headerName = "Loaded Archives";
@state()
private _deleting: any = {};
private typeFilter = "";
private indexParams = "";
constructor() {
super();
this.hideHeader = localStorage.getItem("index:hideHeader") === "1";
}
get sortKeys() {
return [
{ key: "title", name: "Title" },
{ key: "sourceUrl", name: "Source" },
{ key: "ctime", name: this.dateName },
{ key: "size", name: "Total Size" },
];
}
firstUpdated() {
this.loadColls();
}
updated(changedProperties) {
if (changedProperties.has("hideHeader")) {
localStorage.setItem("index:hideHeader", this.hideHeader ? "1" : "0");
}
if (changedProperties.has("colls") || changedProperties.has("query")) {
this.filter();
}
}
filter() {
if (!this.query) {
this.filteredColls = this.colls;
return;
}
this.filteredColls = [];
for (const coll of this.colls) {
if (
coll.sourceUrl.indexOf(this.query) >= 0 ||
coll.filename.indexOf(this.query) >= 0 ||
(coll.loadUrl && coll.loadUrl.indexOf(this.query) >= 0) ||
(coll.title && coll.title.indexOf(this.query) >= 0)
) {
this.filteredColls.push(coll);
}
}
}
async loadColls() {
const resp = await fetch(`${apiPrefix}/coll-index?${this.indexParams}`);
try {
if (resp.status !== 200) {
throw new Error("Invalid API Response, Retry");
}
const json = await resp.json();
this.colls = json.colls.map((coll) => {
coll.title = coll.title || coll.filename;
return coll;
});
this._deleting = {};
this.sortedColls = [];
} catch (e) {
// likely no sw registered yet, or waiting for new sw to register, retry again
setTimeout(() => this.loadColls(), 500);
}
}
async onDeleteColl(event) {
event.preventDefault();
event.stopPropagation();
if (!this.sortedColls) {
return;
}
const index = Number(event.currentTarget.getAttribute("data-coll-index"));
const coll = this.sortedColls[index];
if (!coll || this._deleting[coll.sourceUrl]) {
return;
}
this._deleting[coll.sourceUrl] = true;
this.requestUpdate();
const resp = await fetch(`${apiPrefix}/c/${coll.id}`, { method: "DELETE" });
if (resp.status === 200) {
const json = await resp.json();
this.colls = json.colls;
}
return false;
}
static get styles() {
return wrapCss(CollIndex.compStyles);
}
static get compStyles() {
return css`
:host {
overflow-y: auto;
min-width: 0;
}
.size {
margin-right: 20px;
}
.extra-padding {
padding: 2em;
}
.no-top-padding {
padding-top: 1em;
}
.panel-heading {
font-size: 0.85rem;
}
.is-loading {
line-height: 1.5em;
height: 1.5em;
border: 0px;
background-color: transparent !important;
width: auto;
}
div.panel.is-light {
margin-bottom: 2em;
}
fa-icon {
vertical-align: middle;
}
.panel-color {
background-color: rgb(210, 249, 214);
}
.copy {
color: black;
margin: 0px;
margin: 0;
line-height: 0.4em;
padding: 6px;
border-radius: 10px;
position: absolute;
}
.copy:active {
background-color: lightgray;
}
.sort-header {
padding: 0.3rem 0.3rem 0.3rem 0;
display: flex;
flex-direction: row;
flex-flow: row wrap;
}
.sort-header .control {
flex: auto;
padding-left: 0.3rem;
width: initial;
}
wr-sorter {
padding: 0.3rem;
}
a.button.is-small.collapse {
border-radius: 6px;
}
.icon.is-left {
margin-left: 0.5rem;
}
.coll-block {
position: relative;
}
.delete-button {
width: 32px;
position: absolute;
top: 10px;
right: 10px;
}
#sort-select::after {
display: none;
}
header {
transform: translate(0px, 0px);
transition: all 0.5s ease 0s;
visibility: visible;
display: flex;
flex-direction: column;
}
header.closed {
transform: translate(0, -100%);
transition: all 0.5s ease 0s;
visibility: visible;
height: 269px;
margin-top: -269px;
}
`;
}
renderHeader() {
return html`<h2 class="panel-heading panel-color">
<span>${this.headerName}</span>
</h2>`;
}
renderSearchHeader() {
return "";
}
render() {
const hasHeader = this.childElementCount > 0;
return html`
<header class="${this.hideHeader ? "closed" : ""}">
<slot name="header"></slot>
</header>
<section class="section no-top-padding">
<div class="sort-header is-small">
${hasHeader
? html`
<button @click=${() =>
(this.hideHeader =
!this.hideHeader)} class="collapse button is-small">
<span class="icon"><fa-icon .svg=${
this.hideHeader ? fasArrowDown : fasArrowUp
}></span>
<span>${
this.hideHeader ? "Show " : "Hide"
} <span class="is-sr-only">Header</span></span>
</button>`
: ""}
</div>
<div class="panel">
${this.renderHeader()}
${this.colls.length
? html`
<div class="panel-block sort-header is-small">
${this.renderSearchHeader()}
<div class="control has-icons-left has-addons">
<input
type="text"
class="input is-small"
@input="${(e) => (this.query = e.currentTarget.value)}"
.value="${this.query}"
placeholder="Search by Archive Title or Source"
/>
<span class="icon is-left is-small">
<fa-icon .svg="${fasSearch}"></fa-icon>
</span>
</div>
<wr-sorter
id="index"
sortKey="ctime"
?sortDesc="${true}"
.sortKeys="${this.sortKeys}"
.data="${this.filteredColls}"
@sort-changed="${(e) =>
(this.sortedColls = e.detail.sortedData)}"
>
</wr-sorter>
</div>
<div class="coll-list">
${this.sortedColls &&
this.sortedColls.map(
(coll, i) => html`
<div class="coll-block panel-block">
${this.renderCollInfo(coll)}
${!this._deleting[coll.sourceUrl]
? html`
<button
class="delete delete-button"
aria-label="Unload Collection"
title="Unload Collection"
data-coll-index="${i}"
@click="${this.onDeleteColl}"
></button>
`
: html` <span
class="button delete-button is-loading is-static"
>
Deleting
</span>`}
</div>
`,
)}
</div>
`
: html`
<div class="panel-block extra-padding">
${this.sortedColls === null
? html`<i>Loading Archives...</i>`
: this.renderEmpty()}
</div>
`}
</div>
</section>
`;
}
renderCollInfo(coll: Coll) {
return html`<wr-coll-info .coll=${coll}></wr-coll-info>`;
}
renderEmpty() {
return html`<i
>No Archives so far! Archives loaded in the section above will appear
here.</i
>`;
}
}
// ===========================================================================
class CollInfo extends LitElement {
@property({ type: Object })
coll!: Coll | Record<string, never>;
@property({ type: Boolean })
detailed = false;
@property({ type: Boolean })
canDelete = false;
static get styles() {
return wrapCss(CollInfo.compStyles);
}
static get compStyles() {
return css`
.columns {
width: 100%;
}
.column {
word-break: break-word;
position: relative;
}
:host {
width: 100%;
height: 100%;
min-width: 0px;
}
:host(.is-list) .columns {
display: flex !important;
flex-direction: column;
}
:host(.is-list) .column {
width: 100% !important;
}
.col-title:hover {
}
.col-title a {
display: block;
height: 100%;
}
.column:hover > .copy,
.col-content:hover .copy,
.copy:hover {
color: inherit;
}
.copy {
color: black;
margin: 0px;
margin: -4px 0 0;
line-height: 0.4em;
padding: 6px;
border-radius: 10px;
position: absolute;
}
.copy:active {
background-color: lightgray;
}
.col-content {
font-family: monospace;
font-size: 14px;
color: #1f2937;
}
.minihead {
font-size: 12px;
line-height: 16px;
margin-bottom: 4px;
}
`;
}
renderSource() {
const coll = this.coll;
return html`
<div class="column is-4">
<p class="minihead">Source</p>
<div class="col-content">
${coll.sourceUrl &&
(coll.sourceUrl.startsWith("http://") ||
coll.sourceUrl.startsWith("https://"))
? html` <a href="${coll.sourceUrl}">${coll.sourceUrl}</a> `
: html` ${coll.sourceUrl}`}
${coll.sourceUrl && coll.sourceUrl.startsWith("googledrive://")
? html` <i>(${coll.filename})</i>`
: ""}
<a @click="${(e) => this.onCopy(e, coll.sourceUrl)}" class="copy">
<fa-icon .svg="${fasCopy}"></fa-icon>
</a>
</div>
</div>
<div class="column">
<p class="minihead">Collection id</p>
<div class="col-content">
${coll.coll}
<a @click="${(e) => this.onCopy(e, coll.coll)}" class="copy">
<fa-icon .svg="${fasCopy}"></fa-icon>
</a>
</div>
</div>
<div class="column is-2">
<p class="minihead">Date Loaded</p>
<div class="col-content">
${coll.ctime ? new Date(coll.ctime).toLocaleString() : ""}
</div>
</div>
<div class="column is-2">
<p class="minihead">Total Size</p>
<div class="col-content">
${prettyBytes(Number(coll.totalSize || coll.size || 0))}
</div>
</div>
`;
}
renderSummaryView() {
const coll = this.coll;
return html` <div class="columns">
<div class="column col-title is-4">
<span class="subtitle has-text-weight-bold">
<a href="?source=${encodeURIComponent(coll.sourceUrl)}"
>${coll.name || coll.title || coll.filename}</a
>
</span>
</div>
${this.renderSource()}
</div>`;
}
renderDetailed() {
const coll = this.coll;
let {
numValid,
numInvalid,
domain,
certFingerprint,
datapackageHash,
publicKey,
software,
} = this.coll.verify || {};
numValid = numValid || 0;
numInvalid = numInvalid || 0;
const certFingerprintUrl = certFingerprint
? `https://crt.sh/?q=${certFingerprint}`
: "";
return html` <div class="columns">
${coll.name || coll.title
? html`<div class="column">
<p class="minihead">Title</p>
<div class="col-content">${coll.name || coll.title}</div>
</div>`
: ""}
<div class="column">
<p class="minihead">Filename</p>
<div class="col-content">${coll.filename}</div>
</div>
${coll.resources
? html`<div class="column">
<p class="minihead">Files</p>
<ol style="padding: revert">
${map(
coll.resources,
(resource: any) =>
html`<li>
<a href="${resource.path}">${resource.name + "\n"}</a>
</li>`,
)}
</ol>
</div>`
: ""}
${this.renderSource()}
${domain
? html`
<div class="column">
<p class="minihead">Observed By</p>
<span class="col-content">
<p>${domain}</p>
${certFingerprintUrl
? html`<span
><a target="_blank" href="${certFingerprintUrl}"
>View Certificate</a
></span
>`
: ""}
</span>
</div>
`
: software
? html`
<div class="column">
<p class="minihead">Created With</p>
<div class="col-content">${software || "Unknown"}</div>
</div>
`
: ""}
<div class="column">
<p class="minihead">Validation</p>
<div class="col-content">
${numValid > 0 || numInvalid > 0
? html` <p>
${numValid} hashes
verified${numInvalid ? html`, ${numInvalid} invalid` : ""}
</p>`
: html` Not Available`}
</div>
</div>
<div class="column">
<p class="minihead">Package Hash</p>
<div class="col-content">
${datapackageHash || "Not Available"}
<a @click="${(e) => this.onCopy(e, datapackageHash)}" class="copy">
<fa-icon .svg="${fasCopy}"></fa-icon>
</a>
</div>
</div>
<div class="column">
<p class="minihead">Observer Public Key</p>
<div class="col-content">
${publicKey || "Not Available"}
<a @click="${(e) => this.onCopy(e, publicKey)}" class="copy">
<fa-icon .svg="${fasCopy}"></fa-icon>
</a>
</div>
</div>
<div class="column">
<p class="minihead">Loading Mode</p>
<div class="col-content">
${coll.onDemand ? "Download On-Demand" : "Fully Local"}
</div>
</div>
</div>`;
}
render() {
return this.detailed ? this.renderDetailed() : this.renderSummaryView();
}
onCopy(event: Event, text: string | undefined) {
event.preventDefault();
event.stopPropagation();
if (text) navigator.clipboard.writeText(text);
return false;
}
onPurge(reload) {
const detail = { reload };
this.dispatchEvent(new CustomEvent("coll-purge", { detail }));
}
}
customElements.define("wr-coll-info", CollInfo);
customElements.define("wr-coll-index", CollIndex);
export { CollIndex, CollInfo };
+57
View File
@@ -0,0 +1,57 @@
import { LitElement, css, html, nothing } from "lit";
import { customElement, property } from "lit/decorators.js";
import { wrapCss } from "./../misc";
import "@shoelace-style/shoelace/dist/components/copy-button/copy-button.js";
@customElement("wr-labeled-field")
class LabeledField extends LitElement {
@property({ type: String })
copy?: string;
@property({ type: String })
label?: string;
@property({ type: String })
class?: string;
static get styles() {
return wrapCss(LabeledField.compStyles);
}
static get compStyles() {
return css`
:host {
min-width: unset; /* @todo(emma, 2023-11-06) see about removing this, if the min-width set on all web components is unnecessary */
}
/* @todo(emma, 2023-11-06) add option for monospace treatment, rather than making everything mono. this could also be a class on the host element? */
.col-content {
font-family: monospace;
font-size: 14px;
color: #1f2937;
display: flex;
align-items: center;
}
.minihead {
font-size: 12px;
line-height: 16px;
margin-bottom: 4px;
}
`;
}
render() {
return html`${this.label
? html`<p class="minihead">${this.label}</p>`
: nothing}
<div class="col-content">
<slot></slot>
${this.copy
? html` <sl-copy-button .value=${this.copy || ""}></sl-copy-button>`
: nothing}
</div>`;
}
}
export { LabeledField };
+1
View File
@@ -2,6 +2,7 @@
import { CollectionLoader } from "@webrecorder/wabac/src/loaders"; import { CollectionLoader } from "@webrecorder/wabac/src/loaders";
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { ipcRenderer, contextBridge } = require("electron"); const { ipcRenderer, contextBridge } = require("electron");
contextBridge.exposeInMainWorld("electron", { IS_APP: true }); contextBridge.exposeInMainWorld("electron", { IS_APP: true });
+1
View File
@@ -466,6 +466,7 @@ class ElectronReplayApp {
} }
getOpenUrl(argv) { getOpenUrl(argv) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
argv = require("minimist")(argv.slice(process.defaultApp ? 2 : 1)); argv = require("minimist")(argv.slice(process.defaultApp ? 2 : 1));
const filename = const filename =
+1 -1
View File
@@ -1,2 +1,2 @@
declare module "*.svg"; declare module "*.svg";
declare var __SW_NAME__: string; declare let __SW_NAME__: string;
+359
View File
@@ -0,0 +1,359 @@
import { LitElement, html, css } from "lit";
import { property, state } from "lit/decorators.js";
import { wrapCss, apiPrefix } from "./misc";
import fasArrowUp from "@fortawesome/fontawesome-free/svgs/solid/angle-double-up.svg";
import fasArrowDown from "@fortawesome/fontawesome-free/svgs/solid/angle-double-down.svg";
import fasSearch from "@fortawesome/fontawesome-free/svgs/solid/search.svg";
import type { Item } from "./types";
import "./item-info";
// ===========================================================================
class ItemIndex extends LitElement {
@property({ type: Array })
items: Item[] = [];
@property({ type: String })
query = "";
@property({ type: Array })
filteredItems: any[] = [];
@property({ type: Array })
sortedItems: any[] | null = null;
@property({ type: Boolean })
hideHeader: any = null;
@property({ type: String })
dateName = "Date Loaded";
@property({ type: String })
headerName = "Loaded Archives";
@state()
private _deleting: any = {};
private typeFilter = "";
private indexParams = "";
constructor() {
super();
this.hideHeader = localStorage.getItem("index:hideHeader") === "1";
}
get sortKeys() {
return [
{ key: "title", name: "Title" },
{ key: "sourceUrl", name: "Source" },
{ key: "ctime", name: this.dateName },
{ key: "size", name: "Total Size" },
];
}
firstUpdated() {
this.loadItems();
}
updated(changedProperties) {
if (changedProperties.has("hideHeader")) {
localStorage.setItem("index:hideHeader", this.hideHeader ? "1" : "0");
}
if (changedProperties.has("colls") || changedProperties.has("query")) {
this.filter();
}
}
filter() {
if (!this.query) {
this.filteredItems = this.items;
return;
}
this.filteredItems = [];
for (const item of this.items) {
if (
item.sourceUrl.indexOf(this.query) >= 0 ||
item.filename.indexOf(this.query) >= 0 ||
(item.loadUrl && item.loadUrl.indexOf(this.query) >= 0) ||
(item.title && item.title.indexOf(this.query) >= 0)
) {
this.filteredItems.push(item);
}
}
}
async loadItems() {
const resp = await fetch(`${apiPrefix}/coll-index?${this.indexParams}`);
try {
if (resp.status !== 200) {
throw new Error("Invalid API Response, Retry");
}
const json = await resp.json();
this.items = json.colls.map((item: Item) => {
item.title = item.title || item.filename;
return item;
});
this._deleting = {};
this.sortedItems = [];
} catch (e) {
// likely no sw registered yet, or waiting for new sw to register, retry again
setTimeout(() => this.loadItems(), 500);
}
}
async onDeleteItem(event) {
event.preventDefault();
event.stopPropagation();
if (!this.sortedItems) {
return;
}
const index = Number(event.currentTarget.getAttribute("data-coll-index"));
const item = this.sortedItems[index];
if (!item || this._deleting[item.sourceUrl]) {
return;
}
this._deleting[item.sourceUrl] = true;
this.requestUpdate();
const resp = await fetch(`${apiPrefix}/c/${item.id}`, { method: "DELETE" });
if (resp.status === 200) {
const json = await resp.json();
this.items = json.colls;
}
return false;
}
static get styles() {
return wrapCss(ItemIndex.compStyles);
}
static get compStyles() {
return css`
:host {
overflow-y: auto;
min-width: 0;
}
.size {
margin-right: 20px;
}
.extra-padding {
padding: 2em;
}
.no-top-padding {
padding-top: 1em;
}
.panel-heading {
font-size: 0.85rem;
}
.is-loading {
line-height: 1.5em;
height: 1.5em;
border: 0px;
background-color: transparent !important;
width: auto;
}
div.panel.is-light {
margin-bottom: 2em;
}
fa-icon {
vertical-align: middle;
}
.panel-color {
background-color: rgb(210, 249, 214);
}
.copy {
color: black;
margin: 0px;
margin: 0;
line-height: 0.4em;
padding: 6px;
border-radius: 10px;
position: absolute;
}
.copy:active {
background-color: lightgray;
}
.sort-header {
padding: 0.3rem 0.3rem 0.3rem 0;
display: flex;
flex-direction: row;
flex-flow: row wrap;
}
.sort-header .control {
flex: auto;
padding-left: 0.3rem;
width: initial;
}
wr-sorter {
padding: 0.3rem;
}
a.button.is-small.collapse {
border-radius: 6px;
}
.icon.is-left {
margin-left: 0.5rem;
}
.coll-block {
position: relative;
}
.delete-button {
width: 32px;
position: absolute;
top: 10px;
right: 10px;
}
#sort-select::after {
display: none;
}
header {
transform: translate(0px, 0px);
transition: all 0.5s ease 0s;
visibility: visible;
display: flex;
flex-direction: column;
}
header.closed {
transform: translate(0, -100%);
transition: all 0.5s ease 0s;
visibility: visible;
height: 269px;
margin-top: -269px;
}
`;
}
renderHeader() {
return html`<h2 class="panel-heading panel-color">
<span>${this.headerName}</span>
</h2>`;
}
renderSearchHeader() {
return "";
}
render() {
const hasHeader = this.childElementCount > 0;
return html`
<header class="${this.hideHeader ? "closed" : ""}">
<slot name="header"></slot>
</header>
<section class="section no-top-padding">
<div class="sort-header is-small">
${hasHeader
? html`
<button @click=${() =>
(this.hideHeader =
!this.hideHeader)} class="collapse button is-small">
<span class="icon"><fa-icon .svg=${
this.hideHeader ? fasArrowDown : fasArrowUp
}></span>
<span>${
this.hideHeader ? "Show " : "Hide"
} <span class="is-sr-only">Header</span></span>
</button>`
: ""}
</div>
<div class="panel">
${this.renderHeader()}
${this.items.length
? html`
<div class="panel-block sort-header is-small">
${this.renderSearchHeader()}
<div class="control has-icons-left has-addons">
<input
type="text"
class="input is-small"
@input="${(e) => (this.query = e.currentTarget.value)}"
.value="${this.query}"
placeholder="Search by Archive Title or Source"
/>
<span class="icon is-left is-small">
<fa-icon .svg="${fasSearch}"></fa-icon>
</span>
</div>
<wr-sorter
id="index"
sortKey="ctime"
?sortDesc="${true}"
.sortKeys="${this.sortKeys}"
.data="${this.filteredItems}"
@sort-changed="${(e) =>
(this.sortedItems = e.detail.sortedData)}"
>
</wr-sorter>
</div>
<div class="coll-list">
${this.sortedItems &&
this.sortedItems.map(
(item, i) => html`
<div class="coll-block panel-block">
${this.renderItemInfo(item)}
${!this._deleting[item.sourceUrl]
? html`
<button
class="delete delete-button"
aria-label="Unload Item"
title="Unload Item"
data-coll-index="${i}"
@click="${this.onDeleteItem}"
></button>
`
: html` <span
class="button delete-button is-loading is-static"
>
Deleting
</span>`}
</div>
`,
)}
</div>
`
: html`
<div class="panel-block extra-padding">
${this.sortedItems === null
? html`<i>Loading Archives...</i>`
: this.renderEmpty()}
</div>
`}
</div>
</section>
`;
}
renderItemInfo(item: Item) {
return html`<wr-item-info .item=${item}></wr-item-info>`;
}
renderEmpty() {
return html`<i
>No Archives so far! Archives loaded in the section above will appear
here.</i
>`;
}
}
customElements.define("wr-item-index", ItemIndex);
export { ItemIndex };
+249
View File
@@ -0,0 +1,249 @@
import { LitElement, html, css, nothing } from "lit";
import { property } from "lit/decorators.js";
import { wrapCss } from "./misc";
import { map } from "lit/directives/map.js";
import prettyBytes from "pretty-bytes";
import type { Item } from "./types";
import "./components/labeled-field";
// ===========================================================================
class ItemInfo extends LitElement {
@property({ type: Object })
item!: Item | Record<string, never>;
@property({ type: Boolean })
detailed = false;
@property({ type: Boolean })
canDelete = false;
static get styles() {
return wrapCss(ItemInfo.compStyles);
}
static get compStyles() {
return css`
.columns {
width: 100%;
}
.column {
word-break: break-word;
position: relative;
}
:host {
width: 100%;
height: 100%;
min-width: 0px;
}
:host(.is-list) .columns {
display: flex !important;
flex-direction: column;
}
:host(.is-list) .column {
width: 100% !important;
flex: 1 1 auto;
}
.col-title:hover {
}
.col-title a {
display: block;
height: 100%;
}
.column:hover > .copy,
.col-content:hover .copy,
.copy:hover {
color: inherit;
}
.copy {
color: black;
margin: 0px;
margin: -4px 0 0;
line-height: 0.4em;
padding: 6px;
border-radius: 10px;
position: absolute;
}
.copy:active {
background-color: lightgray;
}
.col-content {
font-family: monospace;
font-size: 14px;
color: #1f2937;
}
.minihead {
font-size: 12px;
line-height: 16px;
margin-bottom: 4px;
}
`;
}
renderSource(showItemID = true) {
const item = this.item;
return html`
<wr-labeled-field
label="Source"
copy="${item.sourceUrl}"
class="column is-4"
>${item.sourceUrl &&
(item.sourceUrl.startsWith("http://") ||
item.sourceUrl.startsWith("https://"))
? html` <a href="${item.sourceUrl}">${item.sourceUrl}</a> `
: html` ${item.sourceUrl}`}
${item.sourceUrl && item.sourceUrl.startsWith("googledrive://")
? html` <i>(${item.filename})</i>`
: nothing}
</wr-labeled-field>
${showItemID
? html`<wr-labeled-field
label="Archived Item ID"
.copy=${item.coll}
class="column"
>
${item.coll || "No ID"}
</wr-labeled-field>`
: nothing}
<wr-labeled-field label="Date Loaded" class="column is-2">
${item.ctime ? new Date(item.ctime).toLocaleString() : nothing}
</wr-labeled-field>
<wr-labeled-field label="Total Size" class="column is-2">
${prettyBytes(Number(item.totalSize || item.size || 0))}
</wr-labeled-field>
`;
}
renderSummaryView() {
const item = this.item;
return html` <div class="columns">
<div class="column col-title is-4">
<span class="subtitle has-text-weight-bold">
<a href="?source=${encodeURIComponent(item.sourceUrl)}"
>${item.name || item.title || item.filename}</a
>
</span>
</div>
${this.renderSource(false)}
</div>`;
}
renderDetailed() {
const item = this.item;
const {
numValid = 0,
numInvalid = 0,
domain,
certFingerprint,
datapackageHash,
publicKey,
software,
} = this.item.verify || {};
const certFingerprintUrl = certFingerprint
? `https://crt.sh/?q=${certFingerprint}`
: "";
return html` <div class="columns">
${item.name || item.title
? html`<wr-labeled-field label="Title" class="column">
${item.name || item.title}
</wr-labeled-field>`
: nothing}
<wr-labeled-field label="Filename" class="column">
${item.filename}
</wr-labeled-field>
${item.resources
? html`<wr-labeled-field label="Files" class="column">
<ol style="padding: revert">
${map(
item.resources,
(resource) =>
html`<li>
<a href="${resource.path}">${resource.name + "\n"}</a>
</li>`,
)}
</ol>
</wr-labeled-field>`
: nothing}
${this.renderSource()}
${domain
? html`
<wr-labeled-field label="Observed By" class="column">
<p>${domain}</p>
${certFingerprintUrl
? html`<span
><a target="_blank" href="${certFingerprintUrl}"
>View Certificate</a
></span
>`
: nothing}
</wr-labeled-field>
`
: nothing}
${software
? html`
<wr-labeled-field label="Created With" class="column">
${software || "Unknown"}
</wr-labeled-field>
`
: nothing}
<wr-labeled-field label="Validation" class="column">
${numValid > 0 || numInvalid > 0
? html` <p>
${numValid} hashes
verified${numInvalid ? html`, ${numInvalid} invalid` : nothing}
</p>`
: html` Not Available`}
</wr-labeled-field>
<wr-labeled-field
label="Package Hash"
class="column"
.copy=${datapackageHash}
>
${datapackageHash || "Not Available"}
</wr-labeled-field>
<wr-labeled-field
label="Observer Public Key"
class="column"
.copy=${publicKey}
>
${publicKey || "Not Available"}
</wr-labeled-field>
<wr-labeled-field label="Loading Mode" class="column">
${item.onDemand ? "Download On-Demand" : "Fully Local"}
</wr-labeled-field>
</div>`;
}
render() {
return this.detailed ? this.renderDetailed() : this.renderSummaryView();
}
onCopy(event: Event, text: string | undefined) {
event.preventDefault();
event.stopPropagation();
if (text) navigator.clipboard.writeText(text);
return false;
}
onPurge(reload) {
const detail = { reload };
this.dispatchEvent(new CustomEvent("item-purge", { detail }));
}
}
customElements.define("wr-item-info", ItemInfo);
export { ItemInfo };
+71 -69
View File
@@ -1,10 +1,9 @@
import { LitElement, html, css } from "lit"; import { LitElement, html, css } from "lit";
import { property, state } from "lit/decorators.js"; import { property } from "lit/decorators.js";
import { ref, createRef, type Ref } from "lit/directives/ref.js"; import { ref, createRef, type Ref } from "lit/directives/ref.js";
import type { import type {
SlDialog, SlDialog,
SlDropdown, SlDropdown,
SlMenu,
SlSelectEvent, SlSelectEvent,
} from "@shoelace-style/shoelace"; } from "@shoelace-style/shoelace";
import "@shoelace-style/shoelace/dist/components/alert/alert.js"; import "@shoelace-style/shoelace/dist/components/alert/alert.js";
@@ -52,13 +51,15 @@ import fasCaretDown from "@fortawesome/fontawesome-free/svgs/solid/caret-down.sv
import { RWPEmbedReceipt } from "./embed-receipt.js"; import { RWPEmbedReceipt } from "./embed-receipt.js";
import Split from "split.js"; import Split from "split.js";
import type { Coll as CollInfo } from "./types"; import type { Item as ItemInfo } from "./types";
import type { Replay } from "./replay"; import type { Replay } from "./replay";
import "./item-info";
const RWP_SCHEME = "search://"; const RWP_SCHEME = "search://";
// =========================================================================== // ===========================================================================
class Coll extends LitElement { class Item extends LitElement {
@property({ type: Boolean }) @property({ type: Boolean })
inited = false; inited = false;
@@ -72,10 +73,10 @@ class Coll extends LitElement {
showSidebar: boolean | null = null; showSidebar: boolean | null = null;
@property({ type: Object, attribute: false }) @property({ type: Object, attribute: false })
collInfo: CollInfo | Record<string, never> | null = null; itemInfo: ItemInfo | Record<string, never> | null = null;
@property({ type: String }) @property({ type: String })
coll = ""; item = "";
@property({ type: Boolean }) @property({ type: Boolean })
hasStory = false; hasStory = false;
@@ -172,7 +173,7 @@ class Coll extends LitElement {
firstUpdated() { firstUpdated() {
this.inited = true; this.inited = true;
window.addEventListener("hashchange", (event) => this.onHashChange()); window.addEventListener("hashchange", () => this.onHashChange());
this.addEventListener("fullscreenchange", () => { this.addEventListener("fullscreenchange", () => {
this.isFullscreen = !!document.fullscreenElement; this.isFullscreen = !!document.fullscreenElement;
@@ -193,9 +194,9 @@ class Coll extends LitElement {
while ( while (
this.editable && this.editable &&
this.autoUpdateInterval && this.autoUpdateInterval &&
(!this.collInfo || (!this.itemInfo ||
!this.collInfo.pages || !this.itemInfo.pages ||
this.collInfo.pages.length < 100) this.itemInfo.pages.length < 100)
) { ) {
await new Promise((resolve) => await new Promise((resolve) =>
setTimeout(resolve, this.autoUpdateInterval * 1000), setTimeout(resolve, this.autoUpdateInterval * 1000),
@@ -212,7 +213,7 @@ class Coll extends LitElement {
const resp = await fetch( const resp = await fetch(
apiPrefix + apiPrefix +
"/c/" + "/c/" +
this.coll + this.item +
"/ts/?url=" + "/ts/?url=" +
window.encodeURIComponent(this.tabData.url), window.encodeURIComponent(this.tabData.url),
); );
@@ -262,7 +263,7 @@ class Coll extends LitElement {
} }
} }
if (changedProperties.has("tabData")) { if (changedProperties.has("tabData")) {
if (!this.collInfo || !this.collInfo.coll) { if (!this.itemInfo || !this.itemInfo.coll) {
return; return;
} }
const newHash = "#" + new URLSearchParams(this.tabData as any).toString(); const newHash = "#" + new URLSearchParams(this.tabData as any).toString();
@@ -355,31 +356,31 @@ class Coll extends LitElement {
return; return;
} }
let coll = this.loadInfo && this.loadInfo.customColl; let item = this.loadInfo && this.loadInfo.customColl; // @todo(2023-11-06) update customColl -> customItem
if (!coll) { if (!item) {
const res = await sourceToId(this.sourceUrl); const res = await sourceToId(this.sourceUrl);
coll = res.coll; item = res.coll;
} }
this.coll = coll; this.item = item;
const collApiPrefix = apiPrefix + "/c/" + coll; const itemApiPrefix = apiPrefix + "/c/" + item;
const collReplayPrefix = replayPrefix + "/" + coll; const itemReplayPrefix = replayPrefix + "/" + item;
const resp = await fetch(collApiPrefix + "?all=1"); const resp = await fetch(itemApiPrefix + "?all=1");
if (resp.status != 200) { if (resp.status != 200) {
this.collInfo = {}; this.itemInfo = {};
return; return;
} }
const json = await resp.json(); const json = await resp.json();
this.collInfo = { this.itemInfo = {
apiPrefix: collApiPrefix, apiPrefix: itemApiPrefix,
replayPrefix: collReplayPrefix, replayPrefix: itemReplayPrefix,
coll, coll: item,
...json, ...json,
}; };
@@ -389,14 +390,14 @@ class Coll extends LitElement {
this.loadInfo.extraConfig.headers this.loadInfo.extraConfig.headers
) { ) {
const headers = this.loadInfo.extraConfig.headers; const headers = this.loadInfo.extraConfig.headers;
await fetch(`${collApiPrefix}/updateAuth`, { await fetch(`${itemApiPrefix}/updateAuth`, {
method: "POST", method: "POST",
body: JSON.stringify({ headers }), body: JSON.stringify({ headers }),
}); });
} }
if (!this.collInfo!.title) { if (!this.itemInfo!.title) {
this.collInfo!.title = this.collInfo!.filename; this.itemInfo!.title = this.itemInfo!.filename;
} }
if (this.embed === "replayonly" || this.embed === "replay-with-info") { if (this.embed === "replayonly" || this.embed === "replay-with-info") {
@@ -404,13 +405,13 @@ class Coll extends LitElement {
} }
this.hasStory = Boolean( this.hasStory = Boolean(
this.collInfo!.desc || this.collInfo!.lists?.length, this.itemInfo!.desc || this.itemInfo!.lists?.length,
); );
this.dispatchEvent( this.dispatchEvent(
new CustomEvent("coll-loaded", { new CustomEvent("coll-loaded", {
detail: { detail: {
collInfo: this.collInfo, collInfo: this.itemInfo,
alreadyLoaded: true, alreadyLoaded: true,
}, },
}), }),
@@ -419,7 +420,7 @@ class Coll extends LitElement {
this.onHashChange(); this.onHashChange();
} }
onCollLoaded(event) { onItemLoaded(event) {
this.doUpdateInfo(); this.doUpdateInfo();
this.loadInfo = null; this.loadInfo = null;
if (event.detail.sourceUrl) { if (event.detail.sourceUrl) {
@@ -429,18 +430,18 @@ class Coll extends LitElement {
new CustomEvent("coll-loaded", { new CustomEvent("coll-loaded", {
detail: { detail: {
sourceUrl: this.sourceUrl, sourceUrl: this.sourceUrl,
collInfo: this.collInfo, collInfo: this.itemInfo,
}, },
}), }),
); );
} }
onCollUpdate(event) { onItemUpdate(event) {
if (!this.editable) { if (!this.editable) {
return; return;
} }
this.collInfo = { ...this.collInfo, ...event.detail }; this.itemInfo = { ...this.itemInfo, ...event.detail };
} }
onHashChange() { onHashChange() {
@@ -453,12 +454,12 @@ class Coll extends LitElement {
} }
if ( if (
this.collInfo?.coll && this.itemInfo?.coll &&
(!this.tabData.view || !this.tabNames.includes(this.tabData.view)) (!this.tabData.view || !this.tabNames.includes(this.tabData.view))
) { ) {
const view = this.hasStory const view = this.hasStory
? "story" ? "story"
: this.editable || this.collInfo.pages?.length : this.editable || this.itemInfo.pages?.length
? "pages" ? "pages"
: "resources"; : "resources";
@@ -471,11 +472,11 @@ class Coll extends LitElement {
if (this.tabData.url && this.tabData.url.startsWith("page:")) { if (this.tabData.url && this.tabData.url.startsWith("page:")) {
const pageIndex = Number(this.tabData.url.slice("page:".length)); const pageIndex = Number(this.tabData.url.slice("page:".length));
if ( if (
this.collInfo?.pages && this.itemInfo?.pages &&
!isNaN(pageIndex) && !isNaN(pageIndex) &&
pageIndex < this.collInfo.pages.length pageIndex < this.itemInfo.pages.length
) { ) {
const page = this.collInfo.pages[pageIndex]; const page = this.itemInfo.pages[pageIndex];
this.tabData.url = page.url; this.tabData.url = page.url;
this.tabData.ts = getPageDateTS(page).timestamp; this.tabData.ts = getPageDateTS(page).timestamp;
} }
@@ -498,7 +499,7 @@ class Coll extends LitElement {
return false; return false;
} }
onCollTabNav(event) { onItemTabNav(event) {
if (event.detail.reload) { if (event.detail.reload) {
this.onRefresh(null, true); this.onRefresh(null, true);
return; return;
@@ -533,7 +534,7 @@ class Coll extends LitElement {
} }
static get styles() { static get styles() {
return wrapCss(Coll.compStyles); return wrapCss(Item.compStyles);
} }
static get compStyles() { static get compStyles() {
@@ -626,7 +627,7 @@ class Coll extends LitElement {
${RWPEmbedReceipt.embedStyles} ${RWPEmbedReceipt.embedStyles}
${Coll.replayBarStyles} ${Item.replayBarStyles}
`; `;
} }
@@ -861,20 +862,20 @@ class Coll extends LitElement {
); );
} }
if (this.collInfo && !this.collInfo.coll) { if (this.itemInfo && !this.itemInfo.coll) {
return html` <wr-loader return html` <wr-loader
.loadInfo="${this.loadInfo}" .loadInfo="${this.loadInfo}"
embed="${this.embed || ""}" embed="${this.embed || ""}"
swName="${this.swName}" swName="${this.swName}"
.coll="${this.coll}" .coll="${this.item}"
sourceUrl="${this.sourceUrl || ""}" sourceUrl="${this.sourceUrl || ""}"
@coll-loaded=${this.onCollLoaded} @coll-loaded=${this.onItemLoaded}
></wr-loader>`; ></wr-loader>`;
} else if (this.collInfo) { } else if (this.itemInfo) {
return html` return html`
${this.renderLocationBar()} ${this.renderVerifyInfo()} ${this.renderLocationBar()} ${this.renderVerifyInfo()}
<sl-dialog label="Archive Info" ${ref(this.archiveInfoDialog)}> <sl-dialog label="Archive Info" ${ref(this.archiveInfoDialog)}>
${this.renderCollInfo()} ${this.renderItemInfo()}
<sl-button <sl-button
slot="footer" slot="footer"
variant="primary" variant="primary"
@@ -894,7 +895,7 @@ class Coll extends LitElement {
aria-label="${isSidebar ? "Browse Contents" : ""}" aria-label="${isSidebar ? "Browse Contents" : ""}"
> >
${this.renderTabHeader(isSidebar)} ${this.renderTabHeader(isSidebar)}
${isSidebar || !isReplay ? this.renderCollTabs(isSidebar) : html``} ${isSidebar || !isReplay ? this.renderItemTabs(isSidebar) : html``}
</div> </div>
${isReplay && this.isVisible ${isReplay && this.isVisible
@@ -902,11 +903,11 @@ class Coll extends LitElement {
<wr-coll-replay <wr-coll-replay
role="main" role="main"
tabindex="-1" tabindex="-1"
.collInfo="${this.collInfo}" .collInfo="${this.itemInfo}"
sourceUrl="${this.sourceUrl || ""}" sourceUrl="${this.sourceUrl || ""}"
url="${this.tabData.url || ""}" url="${this.tabData.url || ""}"
ts="${this.tabData.ts || ""}" ts="${this.tabData.ts || ""}"
@coll-tab-nav="${this.onCollTabNav}" @coll-tab-nav="${this.onItemTabNav}"
id="replay" id="replay"
@replay-loading="${(e) => @replay-loading="${(e) =>
(this.isLoading = e.detail.loading)}" (this.isLoading = e.detail.loading)}"
@@ -1410,7 +1411,9 @@ class Coll extends LitElement {
date, date,
label: dateStr, label: dateStr,
}); });
} catch {} } catch {
/* empty */
}
}); });
const currDateStr = tsToDate(this.ts).toLocaleString(); const currDateStr = tsToDate(this.ts).toLocaleString();
return html`<div id="datetime" class="control is-hidden-mobile"> return html`<div id="datetime" class="control is-hidden-mobile">
@@ -1453,7 +1456,7 @@ class Coll extends LitElement {
} }
return html`<rwp-embed-receipt return html`<rwp-embed-receipt
.collInfo=${this.collInfo || {}} .collInfo=${this.itemInfo || {}}
url=${this.url} url=${this.url}
ts=${this.ts} ts=${this.ts}
.appLogo=${this.appLogo} .appLogo=${this.appLogo}
@@ -1475,27 +1478,27 @@ class Coll extends LitElement {
} }
} }
renderCollInfo() { renderItemInfo() {
if (!this.collInfo) if (!this.itemInfo)
return html`<sl-alert open variant="warning"> return html`<sl-alert open variant="warning">
<sl-icon slot="icon" name="exclamation-triangle"></sl-icon> <sl-icon slot="icon" name="exclamation-triangle"></sl-icon>
<strong>Archive info is not available</strong><br /> <strong>Archive info is not available</strong><br />
Please reload and try again. Please reload and try again.
</sl-alert>`; </sl-alert>`;
return html`<wr-coll-info return html`<wr-item-info
class="is-list" class="is-list"
.coll="${this.collInfo}" .item="${this.itemInfo}"
?detailed="${true}" ?detailed="${true}"
?canDelete="${!this.embed}" ?canDelete="${!this.embed}"
@coll-purge="${this.onPurgeCache}" @item-purge="${this.onPurgeCache}"
></wr-coll-info>`; ></wr-item-info>`;
} }
renderExtraToolbar(/*isDropdown = false*/) { renderExtraToolbar(/*isDropdown = false*/) {
return ""; return "";
} }
renderCollTabs(isSidebar) { renderItemTabs(isSidebar) {
const isStory = this.hasStory && this.tabData.view === "story"; const isStory = this.hasStory && this.tabData.view === "story";
const isPages = this.tabData.view === "pages"; const isPages = this.tabData.view === "pages";
const isResources = this.tabData.view === "resources"; const isResources = this.tabData.view === "resources";
@@ -1503,10 +1506,10 @@ class Coll extends LitElement {
return html` return html`
${isStory ${isStory
? html` <wr-coll-story ? html` <wr-coll-story
.collInfo="${this.collInfo || {}}" .collInfo="${this.itemInfo || {}}"
.active="${isStory}" .active="${isStory}"
currList="${this.tabData.currList || 0}" currList="${this.tabData.currList || 0}"
@coll-tab-nav="${this.onCollTabNav}" @coll-tab-nav="${this.onItemTabNav}"
id="story" id="story"
.isSidebar="${isSidebar}" .isSidebar="${isSidebar}"
class="${isStory ? "" : "is-hidden"} ${isSidebar ? "sidebar" : ""}" class="${isStory ? "" : "is-hidden"} ${isSidebar ? "sidebar" : ""}"
@@ -1516,12 +1519,12 @@ class Coll extends LitElement {
: ""} : ""}
${isResources ${isResources
? html` <wr-coll-resources ? html` <wr-coll-resources
.collInfo="${this.collInfo || {}}" .collInfo="${this.itemInfo || {}}"
.active="${isResources}" .active="${isResources}"
query="${this.tabData.query || ""}" query="${this.tabData.query || ""}"
urlSearchType="${this.tabData.urlSearchType || ""}" urlSearchType="${this.tabData.urlSearchType || ""}"
.currMime="${this.tabData.currMime || ""}" .currMime="${this.tabData.currMime || ""}"
@coll-tab-nav="${this.onCollTabNav}" @coll-tab-nav="${this.onItemTabNav}"
id="resources" id="resources"
.isSidebar="${isSidebar}" .isSidebar="${isSidebar}"
class="is-paddingless ${isResources ? "" : "is-hidden"} ${isSidebar class="is-paddingless ${isResources ? "" : "is-hidden"} ${isSidebar
@@ -1533,7 +1536,7 @@ class Coll extends LitElement {
: ""} : ""}
${isPages ${isPages
? html` <wr-page-view ? html` <wr-page-view
.collInfo="${this.collInfo}" .collInfo="${this.itemInfo}"
.active="${isPages}" .active="${isPages}"
.editable="${this.editable}" .editable="${this.editable}"
.isSidebar="${isSidebar}" .isSidebar="${isSidebar}"
@@ -1541,9 +1544,9 @@ class Coll extends LitElement {
query="${this.tabData.query || ""}" query="${this.tabData.query || ""}"
.url="${this.tabData.url || ""}" .url="${this.tabData.url || ""}"
.ts="${this.tabData.ts || ""}" .ts="${this.tabData.ts || ""}"
@coll-tab-nav="${this.onCollTabNav}" @coll-tab-nav="${this.onItemTabNav}"
id="pages" id="pages"
@coll-update="${this.onCollUpdate}" @coll-update="${this.onItemUpdate}"
class="${isPages ? "" : "is-hidden"} ${isSidebar ? "sidebar" : ""}" class="${isPages ? "" : "is-hidden"} ${isSidebar ? "sidebar" : ""}"
role="${(isSidebar ? "" : "main") as any}" role="${(isSidebar ? "" : "main") as any}"
> >
@@ -1655,7 +1658,7 @@ class Coll extends LitElement {
} }
async deleteFully(reload = false) { async deleteFully(reload = false) {
const deleteURL = this.collInfo!.apiPrefix + (reload ? "?reload=1" : ""); const deleteURL = this.itemInfo!.apiPrefix + (reload ? "?reload=1" : "");
const resp = await fetch(deleteURL, { const resp = await fetch(deleteURL, {
method: "DELETE", method: "DELETE",
@@ -1704,7 +1707,6 @@ class Coll extends LitElement {
} }
onSelectTimestamp(event: SlSelectEvent) { onSelectTimestamp(event: SlSelectEvent) {
const menu = event.currentTarget as SlMenu;
const { item } = event.detail; const { item } = event.detail;
this.updateTabData({ ts: item.value }); this.updateTabData({ ts: item.value });
} }
@@ -1801,6 +1803,6 @@ class Coll extends LitElement {
} }
} }
customElements.define("wr-coll", Coll); customElements.define("wr-item", Item);
export { Coll }; export { Item };
+1 -1
View File
@@ -231,5 +231,5 @@ export {
unsafeCSS, unsafeCSS,
unsafeSVG, unsafeSVG,
apiPrefix, apiPrefix,
replayPrefix replayPrefix,
}; };
+2 -2
View File
@@ -320,8 +320,8 @@ class PageEntry extends LitElement {
let inx = textContent.indexOf(this.query); let inx = textContent.indexOf(this.query);
if (inx < 0) { if (inx < 0) {
let textLower = textContent.toLowerCase(); const textLower = textContent.toLowerCase();
let queryLower = query.toLowerCase(); const queryLower = query.toLowerCase();
inx = textLower.indexOf(queryLower); inx = textLower.indexOf(queryLower);
+2 -2
View File
@@ -1,7 +1,7 @@
"use strict"; "use strict";
import { LitElement, html, css, unsafeCSS } from "lit"; import { LitElement, html, css, unsafeCSS } from "lit";
import { property, state } from "lit/decorators.js"; import { property } from "lit/decorators.js";
import { wrapCss, clickOnSpacebarPress } from "./misc"; import { wrapCss, clickOnSpacebarPress } from "./misc";
import ndjson from "fetch-ndjson"; import ndjson from "fetch-ndjson";
@@ -61,7 +61,7 @@ class Pages extends LitElement {
@property({ type: Boolean }) @property({ type: Boolean })
changeNeeded = false; changeNeeded = false;
@property({ type: Set }) @property({ attribute: false })
selectedPages = new Set(); selectedPages = new Set();
@property({ type: Boolean }) @property({ type: Boolean })
+3 -3
View File
@@ -1,13 +1,13 @@
import { LitElement, html, css } from "lit"; import { LitElement, html, css } from "lit";
import { property, state } from "lit/decorators.js"; import { property } from "lit/decorators.js";
import { wrapCss, rwpLogo } from "./misc"; import { wrapCss, rwpLogo } from "./misc";
import type { Coll } from "./types"; import type { Item } from "./types";
// =========================================================================== // ===========================================================================
class Replay extends LitElement { class Replay extends LitElement {
@property({ type: Object }) @property({ type: Object })
collInfo: Coll | Record<string, never> | null = null; collInfo: Item | Record<string, never> | null = null;
@property({ type: String }) @property({ type: String })
sourceUrl: any = null; sourceUrl: any = null;
+4 -1
View File
@@ -3,8 +3,11 @@ import { wrapCss } from "./misc";
import fasSortDown from "@fortawesome/fontawesome-free/svgs/solid/sort-down.svg"; import fasSortDown from "@fortawesome/fontawesome-free/svgs/solid/sort-down.svg";
import fasSortUp from "@fortawesome/fontawesome-free/svgs/solid/sort-up.svg"; import fasSortUp from "@fortawesome/fontawesome-free/svgs/solid/sort-up.svg";
// =========================================================================== // ===========================================================================
/**
* @typedef {{key: string;name: string;}[]} SortKeys
* @prop {SortKeys} sortKeys
*/
class Sorter extends LitElement { class Sorter extends LitElement {
constructor() { constructor() {
super(); super();
+15 -3
View File
@@ -1,8 +1,12 @@
export interface Coll { export interface Item {
filename: string; filename: string;
sourceUrl: string; sourceUrl: string;
replayPrefix: string; replayPrefix: string;
apiPrefix: string; apiPrefix: string;
/**
* Archived Item ID
*/
coll?: string; coll?: string;
name?: string; name?: string;
title?: string; title?: string;
@@ -10,8 +14,16 @@ export interface Coll {
desc?: string; desc?: string;
description?: string; description?: string;
resources?: { path: string; name: string }[]; resources?: { path: string; name: string }[];
verify?: any; verify?: {
onDemand?: any; numValid?: number;
numInvalid?: number;
domain?: string;
certFingerprint?: string;
datapackageHash?: string;
publicKey?: string;
software?: string;
};
onDemand?: boolean;
pages?: any[]; pages?: any[];
lists?: any[]; lists?: any[];
ctime?: string; ctime?: string;
+6 -5
View File
@@ -1,7 +1,8 @@
import { ReplayWebApp } from "./appmain"; import { ReplayWebApp } from "./appmain";
import { Chooser } from "./chooser"; import { Chooser } from "./chooser";
import { CollIndex, CollInfo } from "./coll-index"; import { ItemIndex } from "./item-index";
import { Coll } from "./coll"; import { ItemInfo } from "./item-info";
import { Item } from "./item";
import { Story } from "./story"; import { Story } from "./story";
import { GDrive } from "./gdrive"; import { GDrive } from "./gdrive";
import { Loader } from "./loader"; import { Loader } from "./loader";
@@ -16,9 +17,9 @@ import "./shoelace";
export { export {
ReplayWebApp, ReplayWebApp,
Chooser, Chooser,
CollIndex, ItemIndex as CollIndex, // @todo(2023-11-06) complete rename
CollInfo, ItemInfo as CollInfo, // @todo(2023-11-06) complete rename
Coll, Item as Coll, // @todo(2023-11-06) complete rename
Story, Story,
GDrive, GDrive,
Loader, Loader,
+3
View File
@@ -8,6 +8,9 @@ import fasSearch from "@fortawesome/fontawesome-free/svgs/solid/search.svg";
import "keyword-mark-element/lib/keyword-mark.js"; import "keyword-mark-element/lib/keyword-mark.js";
// =========================================================================== // ===========================================================================
/**
* @prop {boolean | undefined} active
*/
class URLResources extends LitElement { class URLResources extends LitElement {
static get filters() { static get filters() {
return [ return [
+19 -4
View File
@@ -14,9 +14,24 @@
"inlineSources": true, "inlineSources": true,
"paths": { "paths": {
"flexsearch": ["./node_modules/@types/flexsearch"] "flexsearch": ["./node_modules/@types/flexsearch"]
} },
"plugins": [
{
"name": "ts-lit-plugin",
"strict": true,
"rules": {
// This seems to produce a bunch of false positives, so we've turned it off for now.
// Relevant issues:
// https://github.com/runem/lit-analyzer/issues/293
// https://github.com/runem/lit-analyzer/issues/302
// https://github.com/runem/lit-analyzer/issues/266
"no-missing-import": "off",
// ts-lit-plugin also doesn't seem to understand string interpolations in CSS, so this is also turned off.
"no-invalid-css": "off"
}
}
]
}, },
"include": [ "include": ["src/**/*.ts"]
"src/**/*.ts"
]
} }
-1
View File
@@ -18,4 +18,3 @@
"display": "standalone", "display": "standalone",
"theme_color": "#27a0ff" "theme_color": "#27a0ff"
} }
+30 -42
View File
@@ -1,4 +1,5 @@
/*eslint-env node */ /* eslint-env node */
/* eslint @typescript-eslint/no-var-requires: "off" */
const path = require("path"); const path = require("path");
const webpack = require("webpack"); const webpack = require("webpack");
@@ -7,12 +8,12 @@ const CopyPlugin = require("copy-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin"); const TerserPlugin = require("terser-webpack-plugin");
const package_json = require("./package.json"); const package_json = require("./package.json");
// helper proxy URL, run locally for app // helper proxy URL, run locally for app
const HELPER_PROXY = "https://helper-proxy.webrecorder.workers.dev"; const HELPER_PROXY = "https://helper-proxy.webrecorder.workers.dev";
// GDrive client-id // GDrive client-id
const GDRIVE_CLIENT_ID = "160798412227-tko4c82uopud11q105b2lvbogsj77hlg.apps.googleusercontent.com"; const GDRIVE_CLIENT_ID =
"160798412227-tko4c82uopud11q105b2lvbogsj77hlg.apps.googleusercontent.com";
// Copyright banner text // Copyright banner text
const BANNER_TEXT = `'[name].js is part of ReplayWeb.page (https://replayweb.page) Copyright (C) 2020-${new Date().getFullYear()}, Webrecorder Software. Licensed under the Affero General Public License v3.'`; const BANNER_TEXT = `'[name].js is part of ReplayWeb.page (https://replayweb.page) Copyright (C) 2020-${new Date().getFullYear()}, Webrecorder Software. Licensed under the Affero General Public License v3.'`;
@@ -26,13 +27,12 @@ const optimization = {
], ],
}; };
const electronMainConfig = (/*env, argv*/) => { const electronMainConfig = (/*env, argv*/) => {
return { return {
target: "electron-main", target: "electron-main",
mode: "production", mode: "production",
entry: { entry: {
"electron": "./src/electron-main.js", electron: "./src/electron-main.js",
}, },
optimization, optimization,
output: { output: {
@@ -45,57 +45,50 @@ const electronMainConfig = (/*env, argv*/) => {
}, },
plugins: [ plugins: [
new webpack.DefinePlugin({ new webpack.DefinePlugin({
__HELPER_PROXY__ : JSON.stringify(HELPER_PROXY), __HELPER_PROXY__: JSON.stringify(HELPER_PROXY),
}), }),
new webpack.BannerPlugin(BANNER_TEXT), new webpack.BannerPlugin(BANNER_TEXT),
new CopyPlugin({ new CopyPlugin({
patterns: [ patterns: [
// { from: "node_modules/classic-level/prebuilds/", to: "prebuilds" }, // { from: "node_modules/classic-level/prebuilds/", to: "prebuilds" },
{ from: "build/extra_prebuilds/", to: "prebuilds" } { from: "build/extra_prebuilds/", to: "prebuilds" },
], ],
}), }),
], ],
}; };
}; };
const electronPreloadConfig = (/*env, argv*/) => { const electronPreloadConfig = (/*env, argv*/) => {
return { return {
target: "electron-preload", target: "electron-preload",
mode: "production", mode: "production",
entry: { entry: {
"preload": "./src/electron-preload.js", preload: "./src/electron-preload.js",
}, },
optimization, optimization,
plugins: [ plugins: [new webpack.BannerPlugin(BANNER_TEXT)],
new webpack.BannerPlugin(BANNER_TEXT),
]
}; };
}; };
const browserConfig = (/*env, argv*/) => { const browserConfig = (/*env, argv*/) => {
const isDevServer = process.env.WEBPACK_SERVE; const isDevServer = process.env.WEBPACK_SERVE;
const entry = { const entry = {
"ui": "./src/ui.ts" ui: "./src/ui.ts",
}; };
const patterns = [ const patterns = [{ from: "package.json", to: "_data/package.json" }];
{ from: "package.json", to: "_data/package.json" }
];
if (isDevServer) { if (isDevServer) {
entry["sw"] = "@webrecorder/wabac/src/sw.js"; entry["sw"] = "@webrecorder/wabac/src/sw.js";
} else { } else {
patterns.push( patterns.push({
{ from: "node_modules/@webrecorder/wabac/dist/sw.js", to: "sw.js"} from: "node_modules/@webrecorder/wabac/dist/sw.js",
); to: "sw.js",
});
} }
return { return {
target: "web", target: "web",
mode: "production", mode: "production",
@@ -103,7 +96,7 @@ const browserConfig = (/*env, argv*/) => {
type: isDevServer ? "memory" : "filesystem", type: isDevServer ? "memory" : "filesystem",
}, },
resolve: { resolve: {
fallback: { "crypto": false }, fallback: { crypto: false },
extensions: [".ts", ".js"], extensions: [".ts", ".js"],
}, },
entry, entry,
@@ -114,28 +107,25 @@ const browserConfig = (/*env, argv*/) => {
filename: "[name].js", filename: "[name].js",
libraryTarget: "self", libraryTarget: "self",
globalObject: "self", globalObject: "self",
publicPath: "/" publicPath: "/",
}, },
devServer: { devServer: {
compress: true, compress: true,
port: 9990, port: 9990,
open: false, open: false,
static: path.join(__dirname), static: path.join(__dirname),
//publicPath: "/" //publicPath: "/"
}, },
plugins: [ plugins: [
new webpack.NormalModuleReplacementPlugin( new webpack.NormalModuleReplacementPlugin(/^node:*/, (resource) => {
/^node:*/, switch (resource.request) {
(resource) => {
switch (resource.request) {
case "node:stream": case "node:stream":
resource.request = "stream-browserify"; resource.request = "stream-browserify";
break; break;
} }
}, }),
),
new webpack.optimize.LimitChunkCountPlugin({ new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1, maxChunks: 1,
@@ -146,12 +136,12 @@ const browserConfig = (/*env, argv*/) => {
new MiniCssExtractPlugin(), new MiniCssExtractPlugin(),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
__SW_NAME__: JSON.stringify("sw.js"), __SW_NAME__: JSON.stringify("sw.js"),
__HELPER_PROXY__ : JSON.stringify(HELPER_PROXY), __HELPER_PROXY__: JSON.stringify(HELPER_PROXY),
__GDRIVE_CLIENT_ID__ : JSON.stringify(GDRIVE_CLIENT_ID), __GDRIVE_CLIENT_ID__: JSON.stringify(GDRIVE_CLIENT_ID),
__VERSION__: JSON.stringify(package_json.version), __VERSION__: JSON.stringify(package_json.version),
}), }),
new webpack.BannerPlugin(BANNER_TEXT), new webpack.BannerPlugin(BANNER_TEXT),
new CopyPlugin({ patterns }) new CopyPlugin({ patterns }),
], ],
module: { module: {
@@ -165,22 +155,20 @@ const browserConfig = (/*env, argv*/) => {
}, },
}, },
{ {
test: /\.svg$/, test: /\.svg$/,
use: ["svg-inline-loader"], use: ["svg-inline-loader"],
}, },
{ {
test: /main.scss$/, test: /main.scss$/,
use: ["css-loader", "sass-loader"] use: ["css-loader", "sass-loader"],
}, },
{ {
test: /wombat.js|wombatWorkers.js|index.html$/i, test: /wombat.js|wombatWorkers.js|index.html$/i,
use: ["raw-loader"], use: ["raw-loader"],
} },
] ],
}, },
}; };
}; };
module.exports = [ browserConfig, electronMainConfig, electronPreloadConfig ]; module.exports = [browserConfig, electronMainConfig, electronPreloadConfig];
+361 -109
View File
@@ -7,6 +7,11 @@
resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876"
integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==
"@aashutoshrathi/word-wrap@^1.2.3":
version "1.2.6"
resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
"@babel/code-frame@^7.0.0": "@babel/code-frame@^7.0.0":
version "7.14.5" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
@@ -28,6 +33,13 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/runtime@^7.10.2":
version "7.23.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==
dependencies:
regenerator-runtime "^0.14.0"
"@ctrl/tinycolor@^3.5.0": "@ctrl/tinycolor@^3.5.0":
version "3.6.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8" resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8"
@@ -74,21 +86,38 @@
minimatch "^3.0.4" minimatch "^3.0.4"
plist "^3.0.4" plist "^3.0.4"
"@eslint/eslintrc@^1.3.2": "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
version "1.3.2" version "4.4.0"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
dependencies:
eslint-visitor-keys "^3.3.0"
"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
version "4.10.0"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
"@eslint/eslintrc@^2.1.2":
version "2.1.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d"
integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==
dependencies: dependencies:
ajv "^6.12.4" ajv "^6.12.4"
debug "^4.3.2" debug "^4.3.2"
espree "^9.4.0" espree "^9.6.0"
globals "^13.15.0" globals "^13.19.0"
ignore "^5.2.0" ignore "^5.2.0"
import-fresh "^3.2.1" import-fresh "^3.2.1"
js-yaml "^4.1.0" js-yaml "^4.1.0"
minimatch "^3.1.2" minimatch "^3.1.2"
strip-json-comments "^3.1.1" strip-json-comments "^3.1.1"
"@eslint/js@8.52.0":
version "8.52.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c"
integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==
"@floating-ui/core@^1.4.1": "@floating-ui/core@^1.4.1":
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17"
@@ -124,29 +153,24 @@
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
"@humanwhocodes/config-array@^0.10.4": "@humanwhocodes/config-array@^0.11.13":
version "0.10.5" version "0.11.13"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.5.tgz#bb679745224745fff1e9a41961c1d45a49f81c04" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297"
integrity sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug== integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==
dependencies: dependencies:
"@humanwhocodes/object-schema" "^1.2.1" "@humanwhocodes/object-schema" "^2.0.1"
debug "^4.1.1" debug "^4.1.1"
minimatch "^3.0.4" minimatch "^3.0.5"
"@humanwhocodes/gitignore-to-minimatch@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
"@humanwhocodes/module-importer@^1.0.1": "@humanwhocodes/module-importer@^1.0.1":
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
"@humanwhocodes/object-schema@^1.2.1": "@humanwhocodes/object-schema@^2.0.1":
version "1.2.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
"@leichtgewicht/ip-codec@^2.0.1": "@leichtgewicht/ip-codec@^2.0.1":
version "2.0.4" version "2.0.4"
@@ -200,7 +224,7 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.3": "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
version "1.2.8" version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -546,6 +570,11 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
"@types/json-schema@^7.0.12":
version "7.0.14"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1"
integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==
"@types/json-schema@^7.0.9": "@types/json-schema@^7.0.9":
version "7.0.11" version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
@@ -628,6 +657,11 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
"@types/semver@^7.5.0":
version "7.5.4"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff"
integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==
"@types/serve-index@^1.9.1": "@types/serve-index@^1.9.1":
version "1.9.1" version "1.9.1"
resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278"
@@ -686,6 +720,101 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@typescript-eslint/eslint-plugin@^6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz#d8ce497dc0ed42066e195c8ecc40d45c7b1254f4"
integrity sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==
dependencies:
"@eslint-community/regexpp" "^4.5.1"
"@typescript-eslint/scope-manager" "6.9.1"
"@typescript-eslint/type-utils" "6.9.1"
"@typescript-eslint/utils" "6.9.1"
"@typescript-eslint/visitor-keys" "6.9.1"
debug "^4.3.4"
graphemer "^1.4.0"
ignore "^5.2.4"
natural-compare "^1.4.0"
semver "^7.5.4"
ts-api-utils "^1.0.1"
"@typescript-eslint/parser@^6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.9.1.tgz#4f685f672f8b9580beb38d5fb99d52fc3e34f7a3"
integrity sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==
dependencies:
"@typescript-eslint/scope-manager" "6.9.1"
"@typescript-eslint/types" "6.9.1"
"@typescript-eslint/typescript-estree" "6.9.1"
"@typescript-eslint/visitor-keys" "6.9.1"
debug "^4.3.4"
"@typescript-eslint/scope-manager@6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz#e96afeb9a68ad1cd816dba233351f61e13956b75"
integrity sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==
dependencies:
"@typescript-eslint/types" "6.9.1"
"@typescript-eslint/visitor-keys" "6.9.1"
"@typescript-eslint/type-utils@6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz#efd5db20ed35a74d3c7d8fba51b830ecba09ce32"
integrity sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==
dependencies:
"@typescript-eslint/typescript-estree" "6.9.1"
"@typescript-eslint/utils" "6.9.1"
debug "^4.3.4"
ts-api-utils "^1.0.1"
"@typescript-eslint/types@6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.9.1.tgz#a6cfc20db0fcedcb2f397ea728ef583e0ee72459"
integrity sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==
"@typescript-eslint/typescript-estree@6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz#8c77910a49a04f0607ba94d78772da07dab275ad"
integrity sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==
dependencies:
"@typescript-eslint/types" "6.9.1"
"@typescript-eslint/visitor-keys" "6.9.1"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.5.4"
ts-api-utils "^1.0.1"
"@typescript-eslint/utils@6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.9.1.tgz#763da41281ef0d16974517b5f0d02d85897a1c1e"
integrity sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@types/json-schema" "^7.0.12"
"@types/semver" "^7.5.0"
"@typescript-eslint/scope-manager" "6.9.1"
"@typescript-eslint/types" "6.9.1"
"@typescript-eslint/typescript-estree" "6.9.1"
semver "^7.5.4"
"@typescript-eslint/visitor-keys@6.9.1":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz#6753a9225a0ba00459b15d6456b9c2780b66707d"
integrity sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==
dependencies:
"@typescript-eslint/types" "6.9.1"
eslint-visitor-keys "^3.4.1"
"@ungap/structured-clone@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
"@vscode/web-custom-data@^0.4.2":
version "0.4.8"
resolved "https://registry.yarnpkg.com/@vscode/web-custom-data/-/web-custom-data-0.4.8.tgz#d1b7c18752361cf5b6b09a2e1cc14f34daba1a74"
integrity sha512-rRiEeEX49wipCeGZo65mQJUEuCY3IXd6bet90eY6cMMQ9jBe2g3Njw/2ctbaxuACPnEKXTdW0dB7umxDln3Rzg==
"@webassemblyjs/ast@1.11.1": "@webassemblyjs/ast@1.11.1":
version "1.11.1" version "1.11.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
@@ -904,11 +1033,16 @@ acorn@^8.10.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
acorn@^8.7.1, acorn@^8.8.0: acorn@^8.7.1:
version "8.8.0" version "8.8.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
acorn@^8.9.0:
version "8.11.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b"
integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
agent-base@6, agent-base@^6.0.2: agent-base@6, agent-base@^6.0.2:
version "6.0.2" version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@@ -1545,7 +1679,7 @@ chalk@5.3.0:
resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385"
integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
chalk@^2.0.0: chalk@^2.0.0, chalk@^2.4.2:
version "2.4.2" version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -2040,6 +2174,15 @@ detect-node@^2.0.4:
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
didyoumean2@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/didyoumean2/-/didyoumean2-4.1.0.tgz#f813cb7c82c249443e599be077f76e88f24b85e4"
integrity sha512-qTBmfQoXvhKO75D/05C8m+fteQmn4U46FWYiLhXtZQInzitXLWY0EQ/2oKnpAz9g2lQWW8jYcLcT+hPJGT+kig==
dependencies:
"@babel/runtime" "^7.10.2"
leven "^3.1.0"
lodash.deburr "^4.1.0"
dir-compare@^2.4.0: dir-compare@^2.4.0:
version "2.4.0" version "2.4.0"
resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631"
@@ -2367,89 +2510,81 @@ eslint-scope@5.1.1:
esrecurse "^4.3.0" esrecurse "^4.3.0"
estraverse "^4.1.1" estraverse "^4.1.1"
eslint-scope@^7.1.1: eslint-scope@^7.2.2:
version "7.1.1" version "7.2.2"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
dependencies: dependencies:
esrecurse "^4.3.0" esrecurse "^4.3.0"
estraverse "^5.2.0" estraverse "^5.2.0"
eslint-utils@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
dependencies:
eslint-visitor-keys "^2.0.0"
eslint-visitor-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
eslint-visitor-keys@^3.3.0: eslint-visitor-keys@^3.3.0:
version "3.3.0" version "3.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@^8.23.1: eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
version "8.23.1" version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg== integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@^8.52.0:
version "8.52.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc"
integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==
dependencies: dependencies:
"@eslint/eslintrc" "^1.3.2" "@eslint-community/eslint-utils" "^4.2.0"
"@humanwhocodes/config-array" "^0.10.4" "@eslint-community/regexpp" "^4.6.1"
"@humanwhocodes/gitignore-to-minimatch" "^1.0.2" "@eslint/eslintrc" "^2.1.2"
"@eslint/js" "8.52.0"
"@humanwhocodes/config-array" "^0.11.13"
"@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/module-importer" "^1.0.1"
ajv "^6.10.0" "@nodelib/fs.walk" "^1.2.8"
"@ungap/structured-clone" "^1.2.0"
ajv "^6.12.4"
chalk "^4.0.0" chalk "^4.0.0"
cross-spawn "^7.0.2" cross-spawn "^7.0.2"
debug "^4.3.2" debug "^4.3.2"
doctrine "^3.0.0" doctrine "^3.0.0"
escape-string-regexp "^4.0.0" escape-string-regexp "^4.0.0"
eslint-scope "^7.1.1" eslint-scope "^7.2.2"
eslint-utils "^3.0.0" eslint-visitor-keys "^3.4.3"
eslint-visitor-keys "^3.3.0" espree "^9.6.1"
espree "^9.4.0" esquery "^1.4.2"
esquery "^1.4.0"
esutils "^2.0.2" esutils "^2.0.2"
fast-deep-equal "^3.1.3" fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1" file-entry-cache "^6.0.1"
find-up "^5.0.0" find-up "^5.0.0"
glob-parent "^6.0.1" glob-parent "^6.0.2"
globals "^13.15.0" globals "^13.19.0"
globby "^11.1.0" graphemer "^1.4.0"
grapheme-splitter "^1.0.4"
ignore "^5.2.0" ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
is-glob "^4.0.0" is-glob "^4.0.0"
js-sdsl "^4.1.4" is-path-inside "^3.0.3"
js-yaml "^4.1.0" js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1" json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1" levn "^0.4.1"
lodash.merge "^4.6.2" lodash.merge "^4.6.2"
minimatch "^3.1.2" minimatch "^3.1.2"
natural-compare "^1.4.0" natural-compare "^1.4.0"
optionator "^0.9.1" optionator "^0.9.3"
regexpp "^3.2.0"
strip-ansi "^6.0.1" strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
text-table "^0.2.0" text-table "^0.2.0"
espree@^9.4.0: espree@^9.6.0, espree@^9.6.1:
version "9.4.0" version "9.6.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
dependencies: dependencies:
acorn "^8.8.0" acorn "^8.9.0"
acorn-jsx "^5.3.2" acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.3.0" eslint-visitor-keys "^3.4.1"
esquery@^1.4.0: esquery@^1.4.2:
version "1.4.0" version "1.5.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
dependencies: dependencies:
estraverse "^5.1.0" estraverse "^5.1.0"
@@ -2599,6 +2734,17 @@ fast-glob@^3.1.1, fast-glob@^3.2.5:
merge2 "^1.3.0" merge2 "^1.3.0"
micromatch "^4.0.4" micromatch "^4.0.4"
fast-glob@^3.2.11, fast-glob@^3.2.2:
version "3.3.1"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.2"
merge2 "^1.3.0"
micromatch "^4.0.4"
fast-glob@^3.2.9: fast-glob@^3.2.9:
version "3.2.12" version "3.2.12"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
@@ -2903,7 +3049,7 @@ glob-parent@^6.0.0:
dependencies: dependencies:
is-glob "^4.0.1" is-glob "^4.0.1"
glob-parent@^6.0.1: glob-parent@^6.0.2:
version "6.0.2" version "6.0.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
@@ -2957,10 +3103,10 @@ global-dirs@^3.0.0:
dependencies: dependencies:
ini "2.0.0" ini "2.0.0"
globals@^13.15.0: globals@^13.19.0:
version "13.17.0" version "13.23.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02"
integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==
dependencies: dependencies:
type-fest "^0.20.2" type-fest "^0.20.2"
@@ -3048,10 +3194,10 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4,
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
grapheme-splitter@^1.0.4: graphemer@^1.4.0:
version "1.0.4" version "1.4.0"
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
handle-thing@^2.0.0: handle-thing@^2.0.0:
version "2.0.1" version "2.0.1"
@@ -3326,7 +3472,12 @@ ignore@^5.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
import-fresh@^3.0.0, import-fresh@^3.2.1: ignore@^5.2.4:
version "5.2.4"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
import-fresh@^3.2.1:
version "3.3.0" version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -3522,7 +3673,7 @@ is-obj@^2.0.0:
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
is-path-inside@^3.0.2: is-path-inside@^3.0.2, is-path-inside@^3.0.3:
version "3.0.3" version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
@@ -3627,11 +3778,6 @@ js-levenshtein@^1.1.6:
resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
js-sdsl@^4.1.4:
version "4.1.4"
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6"
integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==
js-tokens@^4.0.0: js-tokens@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3745,6 +3891,11 @@ lazy-val@^1.0.4, lazy-val@^1.0.5:
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
levn@^0.4.1: levn@^0.4.1:
version "0.4.1" version "0.4.1"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -3791,6 +3942,21 @@ listr2@6.6.1:
rfdc "^1.3.0" rfdc "^1.3.0"
wrap-ansi "^8.1.0" wrap-ansi "^8.1.0"
lit-analyzer@^2.0.0-pre.3:
version "2.0.1"
resolved "https://registry.yarnpkg.com/lit-analyzer/-/lit-analyzer-2.0.1.tgz#db9d67866daf3c85ea6a5a624e1987c11d06fb86"
integrity sha512-4bHJLCbxywMHd9bnVkLDkCSHXs/KrlwUks75EhYtJNdzH07O5BSVdZdadbw4T2AvuYxb0xRO4ZjqgQJCkp8Kjg==
dependencies:
"@vscode/web-custom-data" "^0.4.2"
chalk "^2.4.2"
didyoumean2 "4.1.0"
fast-glob "^3.2.11"
parse5 "5.1.0"
ts-simple-type "~2.0.0-next.0"
vscode-css-languageservice "4.3.0"
vscode-html-languageservice "3.1.0"
web-component-analyzer "^2.0.0"
lit-element@^3.3.0: lit-element@^3.3.0:
version "3.3.3" version "3.3.3"
resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209" resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209"
@@ -3853,6 +4019,11 @@ locate-path@^6.0.0:
dependencies: dependencies:
p-locate "^5.0.0" p-locate "^5.0.0"
lodash.deburr@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b"
integrity sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==
lodash.escaperegexp@^4.1.2: lodash.escaperegexp@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
@@ -4116,7 +4287,7 @@ minimatch@3.0.4, minimatch@~3.0.2:
dependencies: dependencies:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
minimatch@^3.0.4, minimatch@^3.1.2: minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -4486,17 +4657,17 @@ opener@^1.5.1:
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
optionator@^0.9.1: optionator@^0.9.3:
version "0.9.1" version "0.9.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
dependencies: dependencies:
"@aashutoshrathi/word-wrap" "^1.2.3"
deep-is "^0.1.3" deep-is "^0.1.3"
fast-levenshtein "^2.0.6" fast-levenshtein "^2.0.6"
levn "^0.4.1" levn "^0.4.1"
prelude-ls "^1.2.1" prelude-ls "^1.2.1"
type-check "^0.4.0" type-check "^0.4.0"
word-wrap "^1.2.3"
p-cancelable@^1.0.0: p-cancelable@^1.0.0:
version "1.1.0" version "1.1.0"
@@ -4611,6 +4782,11 @@ parse5-sax-parser@^7.0.0:
dependencies: dependencies:
parse5 "^7.0.0" parse5 "^7.0.0"
parse5@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
parse5@^6.0.1: parse5@^6.0.1:
version "6.0.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
@@ -4999,10 +5175,10 @@ reflect-metadata@^0.1.13:
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
regexpp@^3.2.0: regenerator-runtime@^0.14.0:
version "3.2.0" version "0.14.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
register-service-worker@^1.7.2: register-service-worker@^1.7.2:
version "1.7.2" version "1.7.2"
@@ -5272,7 +5448,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4:
version "7.5.4" version "7.5.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
@@ -5694,7 +5870,7 @@ strip-indent@^3.0.0:
dependencies: dependencies:
min-indent "^1.0.0" min-indent "^1.0.0"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: strip-json-comments@^3.1.1:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@@ -5880,6 +6056,19 @@ truncate-utf8-bytes@^1.0.0:
dependencies: dependencies:
utf8-byte-length "^1.0.1" utf8-byte-length "^1.0.1"
ts-api-utils@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331"
integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
ts-lit-plugin@^2.0.0-pre.1:
version "2.0.0-pre.1"
resolved "https://registry.yarnpkg.com/ts-lit-plugin/-/ts-lit-plugin-2.0.0-pre.1.tgz#e0ff2607dac01595f105faece19588307fd23d8e"
integrity sha512-zXTdephVcjJ0VySiaQRbFCZegvhhePY1FHGsMYs7m/faUViPzPe8WwGryKeXmQtCaUJ7eA79areW2H/AeC7VBg==
dependencies:
lit-analyzer "^2.0.0-pre.3"
web-component-analyzer "^2.0.0-next.5"
ts-loader@^9.4.4: ts-loader@^9.4.4:
version "9.4.4" version "9.4.4"
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4"
@@ -5890,6 +6079,11 @@ ts-loader@^9.4.4:
micromatch "^4.0.0" micromatch "^4.0.0"
semver "^7.3.4" semver "^7.3.4"
ts-simple-type@2.0.0-next.0, ts-simple-type@~2.0.0-next.0:
version "2.0.0-next.0"
resolved "https://registry.yarnpkg.com/ts-simple-type/-/ts-simple-type-2.0.0-next.0.tgz#262a321ba2a17aa57f88ef31e30453beff5be246"
integrity sha512-A+hLX83gS+yH6DtzNAhzZbPfU+D9D8lHlTSd7GeoMRBjOt3GRylDqLTYbdmjA4biWvq2xSfpqfIDj2l0OA/BVg==
tslib@^1.10.0, tslib@^1.9.3: tslib@^1.10.0, tslib@^1.9.3:
version "1.14.1" version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
@@ -5976,10 +6170,10 @@ typedarray-to-buffer@^3.1.5:
dependencies: dependencies:
is-typedarray "^1.0.0" is-typedarray "^1.0.0"
typescript@^5.1.6: typescript@^5.2.2, typescript@~5.2.0:
version "5.1.6" version "5.2.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
union@~0.5.0: union@~0.5.0:
version "0.5.0" version "0.5.0"
@@ -6131,6 +6325,46 @@ verror@^1.10.0:
core-util-is "1.0.2" core-util-is "1.0.2"
extsprintf "^1.2.0" extsprintf "^1.2.0"
vscode-css-languageservice@4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.3.0.tgz#40c797d664ab6188cace33cfbb19b037580a9318"
integrity sha512-BkQAMz4oVHjr0oOAz5PdeE72txlLQK7NIwzmclfr+b6fj6I8POwB+VoXvrZLTbWt9hWRgfvgiQRkh5JwrjPJ5A==
dependencies:
vscode-languageserver-textdocument "^1.0.1"
vscode-languageserver-types "3.16.0-next.2"
vscode-nls "^4.1.2"
vscode-uri "^2.1.2"
vscode-html-languageservice@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-3.1.0.tgz#265b53bda595e6947b16b0fb8c604e1e58685393"
integrity sha512-QAyRHI98bbEIBCqTzZVA0VblGU40na0txggongw5ZgTj9UVsVk5XbLT16O9OTcbqBGSqn0oWmFDNjK/XGIDcqg==
dependencies:
vscode-languageserver-textdocument "^1.0.1"
vscode-languageserver-types "3.16.0-next.2"
vscode-nls "^4.1.2"
vscode-uri "^2.1.2"
vscode-languageserver-textdocument@^1.0.1:
version "1.0.11"
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf"
integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==
vscode-languageserver-types@3.16.0-next.2:
version "3.16.0-next.2"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083"
integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==
vscode-nls@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167"
integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==
vscode-uri@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c"
integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==
warcio@^2.2.0: warcio@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/warcio/-/warcio-2.2.0.tgz#9f307174c7b05b5546dda9e45098c4212c363561" resolved "https://registry.yarnpkg.com/warcio/-/warcio-2.2.0.tgz#9f307174c7b05b5546dda9e45098c4212c363561"
@@ -6158,6 +6392,16 @@ wbuf@^1.1.0, wbuf@^1.7.3:
dependencies: dependencies:
minimalistic-assert "^1.0.0" minimalistic-assert "^1.0.0"
web-component-analyzer@^2.0.0, web-component-analyzer@^2.0.0-next.5:
version "2.0.0"
resolved "https://registry.yarnpkg.com/web-component-analyzer/-/web-component-analyzer-2.0.0.tgz#38a66055ae2340fceaea84f19f9ee3f15233ba28"
integrity sha512-UEvwfpD+XQw99sLKiH5B1T4QwpwNyWJxp59cnlRwFfhUW6JsQpw5jMeMwi7580sNou8YL3kYoS7BWLm+yJ/jVQ==
dependencies:
fast-glob "^3.2.2"
ts-simple-type "2.0.0-next.0"
typescript "~5.2.0"
yargs "^17.7.2"
web-streams-polyfill@^3.0.3: web-streams-polyfill@^3.0.3:
version "3.2.1" version "3.2.1"
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6"
@@ -6311,11 +6555,6 @@ wildcard@^2.0.0:
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
word-wrap@^1.2.3:
version "1.2.4"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f"
integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==
wrap-ansi@^7.0.0: wrap-ansi@^7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@@ -6438,6 +6677,19 @@ yargs@^17.6.2:
y18n "^5.0.5" y18n "^5.0.5"
yargs-parser "^21.1.1" yargs-parser "^21.1.1"
yargs@^17.7.2:
version "17.7.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
dependencies:
cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.3"
y18n "^5.0.5"
yargs-parser "^21.1.1"
yauzl@^2.10.0: yauzl@^2.10.0:
version "2.10.0" version "2.10.0"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"