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:
@@ -82,4 +82,3 @@ before_cache:
|
||||
branches:
|
||||
except:
|
||||
- "/^v\\d+\\.\\d+\\.\\d+$/"
|
||||
|
||||
|
||||
+18
-21
@@ -1,28 +1,25 @@
|
||||
/* eslint-env node */
|
||||
module.exports = {
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es6": true
|
||||
env: {
|
||||
browser: true,
|
||||
es6: true,
|
||||
},
|
||||
"extends": [
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:lit/recommended",
|
||||
"prettier"
|
||||
"prettier",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
],
|
||||
"plugins": [
|
||||
"lit"
|
||||
],
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"sourceType": "module"
|
||||
plugins: ["@typescript-eslint", "lit"],
|
||||
parser: "@typescript-eslint/parser",
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018,
|
||||
sourceType: "module",
|
||||
},
|
||||
"rules": {
|
||||
"no-restricted-globals": [
|
||||
2,
|
||||
"event", "error"
|
||||
],
|
||||
"linebreak-style": [
|
||||
"error",
|
||||
"unix"
|
||||
]
|
||||
}
|
||||
rules: {
|
||||
"no-restricted-globals": [2, "event", "error"],
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"@typescript-eslint/no-explicit-any": "warn",
|
||||
},
|
||||
ignorePatterns: ["ruffle/**/*", "build/**/*"],
|
||||
};
|
||||
|
||||
+8
-3
@@ -1,4 +1,9 @@
|
||||
# Ignore everything except src
|
||||
*
|
||||
!/src/
|
||||
!src/*
|
||||
_includes
|
||||
.github
|
||||
.husky
|
||||
assets
|
||||
build
|
||||
docs
|
||||
examples
|
||||
ruffle
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
<!doctype html>
|
||||
<html class="no-overflow">
|
||||
<head>
|
||||
</head>
|
||||
<head> </head>
|
||||
<body>
|
||||
Loading SW, Please wait...
|
||||
<script>
|
||||
navigator.serviceWorker.register("/swonly.js?replayPrefix=wabac&stats=true", {scope: window.location.origin + "/"}).then(() => window.location.reload());
|
||||
navigator.serviceWorker
|
||||
.register("/swonly.js?replayPrefix=wabac&stats=true", {
|
||||
scope: window.location.origin + "/",
|
||||
})
|
||||
.then(() => window.location.reload());
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+73
-3
@@ -1,14 +1,17 @@
|
||||
## CHANGES
|
||||
|
||||
v1.8.11
|
||||
|
||||
- Loading: Use default html index, avoid custom html injection (via wabac.js 2.16.12)
|
||||
- Dependencies: Switch to wabac.js 2.16.12
|
||||
|
||||
v1.8.10
|
||||
|
||||
- Regression fix: Fix embed loading from different domain being broken in 1.8.9
|
||||
- Dependencies: Switch to wabac.js 2.16.11
|
||||
|
||||
v1.8.9:
|
||||
|
||||
- Fidelity: Ignore self-redirects when loading (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)
|
||||
@@ -16,12 +19,14 @@ v1.8.9:
|
||||
- Dependencies: Switch to wabac.js 2.16.10
|
||||
|
||||
v1.8.8
|
||||
|
||||
- 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)
|
||||
- UI: Better handling of Multi WACZ collections, list collection name, description and files on info tab
|
||||
- Dependencies: Switch to wabac.js 2.16.9
|
||||
|
||||
v1.8.7
|
||||
|
||||
- UI: Fix info tab overflow being hidden
|
||||
- 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
|
||||
@@ -29,6 +34,7 @@ v1.8.7
|
||||
- Dependencies: Switch to wabac.js 2.16.8
|
||||
|
||||
v1.8.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)
|
||||
- Fidelity: Add missing ruffle.js files to fix ruffle
|
||||
@@ -37,37 +43,45 @@ v1.8.6
|
||||
- Dependencies: Switch to wabac.js 2.16.6
|
||||
|
||||
v1.8.5
|
||||
|
||||
- Loading: Improved handling of multi-wacz collections, support loading URLs cross-WACZ to support patching
|
||||
- Dependencies: Switch to wabac.js 2.16.5
|
||||
|
||||
v1.8.4
|
||||
|
||||
- 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
|
||||
|
||||
v1.8.3
|
||||
|
||||
- Loading: fix 'Show Non-Seed Pages' for Multi WACZ collections and after reload
|
||||
- Dependencies: Switch to wabac.js 2.16.3
|
||||
|
||||
v1.8.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
|
||||
|
||||
v1.8.1
|
||||
|
||||
- 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
|
||||
- Dependencies: Switch to ruffle 2023-05-13 due to issues in later versions
|
||||
|
||||
v1.8.0
|
||||
|
||||
- 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
|
||||
- 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
|
||||
|
||||
v1.7.15
|
||||
|
||||
- UI: Loading: support URLs that have query/hashes after extension
|
||||
- Dependencies: Update to wabac.js 2.16.0 -- improved support for Multi WACZ files
|
||||
|
||||
v1.7.14
|
||||
|
||||
- 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 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
|
||||
|
||||
v1.7.13
|
||||
|
||||
- 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'
|
||||
- Dependencies: Update to wabac.js 2.15.3, wombat 3.4.6, Electron 23.1.1
|
||||
|
||||
v1.7.12
|
||||
|
||||
- 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)
|
||||
- Dependencies: Update to wabac.js 2.15.2
|
||||
|
||||
v1.7.11
|
||||
|
||||
- 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)
|
||||
- Dependencies: Update to wabac.js 2.15.0, wombat 3.4.3
|
||||
|
||||
v1.7.10
|
||||
|
||||
- Verification: Change site used for cert verification to https://crt.sh/
|
||||
|
||||
v1.7.9
|
||||
|
||||
- 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
|
||||
|
||||
v1.7.8
|
||||
|
||||
- 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
|
||||
- Dependencies: Update to wabac.js 2.13.15, wombat 3.3.13, auto-js-ipfs 2.1.0, electron 22.0
|
||||
|
||||
v1.7.7
|
||||
|
||||
- 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)
|
||||
- Dependencies: Update to wabac.js 2.13.14
|
||||
|
||||
v1.7.6
|
||||
|
||||
- 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)
|
||||
- Dependencies: Update wabac.js to 2.13.12, wombat 3.3.12, update Ruffle to 2022-11-25 release
|
||||
|
||||
v1.7.5
|
||||
|
||||
- Library: Readd assets dir to package (needed for archiveweb.page)
|
||||
|
||||
v1.7.4
|
||||
|
||||
- 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 electron 21.3.1
|
||||
- Library: Remove assets dir from npm package
|
||||
|
||||
v1.7.3
|
||||
|
||||
- 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
|
||||
- Loading: Fix occasional loading issues with multiple embeds loading on the same page
|
||||
|
||||
v1.7.2
|
||||
|
||||
- Fidelity: Fix replay of TikTok
|
||||
- Dependencies: Update to wabac.js 2.13.4
|
||||
- Docs: Update to embedding guide to mention new embed modes
|
||||
|
||||
v1.7.1
|
||||
|
||||
- Electron App: Fix electron app not loading preload.js, regression in 1.7.0
|
||||
- Fidelity: Fixed embedded tweet video issue (via wabac.js)
|
||||
- Fidelity: rewrite target="new" to not open new window
|
||||
- Dependencies: Update to wabac.js 2.13.3
|
||||
|
||||
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
|
||||
- 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).
|
||||
@@ -154,6 +182,7 @@ v1.7.0
|
||||
- Dependencies: update to wabac.js 2.13.2 to support verification, latest wombat (3.3.9)
|
||||
|
||||
v1.6.5
|
||||
|
||||
- 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
|
||||
- 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
|
||||
|
||||
v1.6.4
|
||||
|
||||
- Embeds: Support `noCache` attribute in `<replay-web-page>` to disable cacheing any HTTP response payloads
|
||||
- Dependencies: update to wabac.js 2.12.3
|
||||
|
||||
v1.6.3
|
||||
|
||||
- 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)
|
||||
- Loading: fix loading ipfs:// urls (via wabac.js)
|
||||
- Dependencies: update to wabac.js 2.12.2
|
||||
|
||||
v1.6.2
|
||||
|
||||
- Library: additional fixes, make 'purge cache' configurable
|
||||
- Library: Add index.html to npm bundle
|
||||
- UI: Fix date padding
|
||||
|
||||
v1.6.1
|
||||
|
||||
- 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.
|
||||
- Dependencies: update ruffle to 2022-07-02
|
||||
|
||||
v1.6.0
|
||||
|
||||
- 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 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
|
||||
|
||||
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 api calls
|
||||
- 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
|
||||
|
||||
v1.5.10
|
||||
|
||||
- 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
|
||||
|
||||
v1.5.9
|
||||
|
||||
- Dependencies: update to wabac.js 2.10.2
|
||||
- Loading: for experimental multi-wacz input, disable periodic reload for now
|
||||
|
||||
v1.5.8
|
||||
|
||||
- Loading: fix hosted replay via subpath when opening in new tab (#82)
|
||||
- Loading: fix multi-wacz support in wabac.js
|
||||
- Dependencies: update to wabac.js 2.10.1
|
||||
|
||||
v1.5.7
|
||||
|
||||
- Dependencies: update to wabac.js 2.10.0 and wombat 3.3.6
|
||||
- Dependencies: update to electron 16.0.6 (chromium 96)
|
||||
- Dependencies: update ruffle to latest nightly (2022-01-08)
|
||||
- Dependencies: update lit to 2.1.1
|
||||
|
||||
v1.5.6
|
||||
|
||||
- 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: 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
|
||||
|
||||
v1.5.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.
|
||||
- Dependencies: update to wabac.js 2.9.5
|
||||
@@ -229,6 +270,7 @@ v1.5.5
|
||||
- Dependencies: update ruffle to latest nightly (2021-10-25)
|
||||
|
||||
v1.5.4
|
||||
|
||||
- Fidelity: Faster rewriting of large JS files
|
||||
- Fidelity: Fixes for twitter video replay
|
||||
- Loading: Fix IPFS loading of WARCs
|
||||
@@ -237,22 +279,26 @@ v1.5.4
|
||||
- Dependencies: update to wabac.js 2.9.4
|
||||
|
||||
v1.5.3
|
||||
|
||||
- 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
|
||||
- Search: update to latest flexsearch, faster/improved searching
|
||||
|
||||
v1.5.2
|
||||
|
||||
- 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
|
||||
- Dependencies: update to wabac.js 2.9.1, wombat 3.3.3
|
||||
|
||||
v1.5.1
|
||||
|
||||
- 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: Ensure page title reflects current app
|
||||
- UI: Refresh UI after half second while waiting for service worker to load, instead of every 5.
|
||||
|
||||
v1.5.0
|
||||
|
||||
- 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 Universal builds for OS X.
|
||||
@@ -260,6 +306,7 @@ v1.5.0
|
||||
- Embeds: Better error message for when service worker could not be loaded.
|
||||
|
||||
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: 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!)
|
||||
@@ -268,6 +315,7 @@ v1.4.7
|
||||
- Dependencies: bump to wabac.js 2.8.0, wombat to 3.3.1
|
||||
|
||||
v1.4.6
|
||||
|
||||
- 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 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
|
||||
|
||||
v1.4.5
|
||||
|
||||
- Loading: Fix IPFS loading (fixed in wabac.js 2.7.8)
|
||||
- Fidelity: Support replaying localStorage/sessionStorage (if available)
|
||||
- Dependencies: bump to wabac.js 2.7.7, wombat 3.2.0
|
||||
|
||||
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: 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)
|
||||
- Dependencies: bump to wabac.js 2.7.8, wombat 3.1.8, Electron 11.4.8
|
||||
|
||||
v1.4.3
|
||||
|
||||
- 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)
|
||||
- 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
|
||||
|
||||
v1.4.2
|
||||
|
||||
- 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)
|
||||
- Update to latest wabac.js 2.7.3
|
||||
|
||||
v1.4.1
|
||||
|
||||
- Replay: Remove 'download' attribute from anchor tags, which doesn't work in Chrome
|
||||
- Loading: Fix loading of full-text search index from older wacz
|
||||
|
||||
v1.4.0
|
||||
|
||||
- Embed: add 'noSandbox' option to not add sandbox to embed iframe
|
||||
- UI: Double-clicking on page entry causes reload.
|
||||
- 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
|
||||
|
||||
v1.3.15
|
||||
|
||||
- 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
|
||||
|
||||
v1.3.14
|
||||
|
||||
- Build: Fix incorrectly packaged npm package for 1.3.13, no other changes
|
||||
|
||||
v1.3.13
|
||||
|
||||
- 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)
|
||||
- Dependencies: wabac 2.6.8
|
||||
|
||||
v1.3.12
|
||||
|
||||
- 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.
|
||||
- Embeds: Resolve embed source to current page instead of to replayBase
|
||||
@@ -340,12 +398,14 @@ v1.3.12
|
||||
- Dependencies: wabac 2.6.6
|
||||
|
||||
v1.3.11
|
||||
|
||||
- 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.
|
||||
- UI: On load failure, only add 'try again' option when reasonable.
|
||||
- Dependencies: wabac 2.6.5
|
||||
|
||||
v1.3.10
|
||||
|
||||
- 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!
|
||||
- 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
|
||||
|
||||
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
|
||||
- UI: editable mode: style fix on page delete spinner, don't show editing options on sidebar
|
||||
|
||||
v1.3.8
|
||||
|
||||
- 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: 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
|
||||
|
||||
v1.3.7
|
||||
|
||||
- Library: Add missing index.js to support loading 'replaywebpage' package
|
||||
|
||||
v1.3.6
|
||||
|
||||
- Switch back to Electron 11.2.0 / Chrome 87 to keep support for Flash plugin
|
||||
|
||||
v1.3.5
|
||||
|
||||
- Dependency update: Latest wabac.js / warcio / wombat
|
||||
- Electron App: Update to Chrome 88, fix for PDF rendering
|
||||
|
||||
v1.3.4
|
||||
|
||||
- Loading: Fix loading local files in App
|
||||
- Fidelity: Latest wabac.js
|
||||
- Autoupdate: Add initial support for auto-updating
|
||||
|
||||
v1.3.3
|
||||
|
||||
- UI: Component customization improvements, update to latest wabac.js
|
||||
- Loading: Improvements for IPFS loading, fix loading with hashtag #filename= in Electron app
|
||||
|
||||
v1.3.2
|
||||
|
||||
- UI: Show navbar on all pages, include breadcrumbs with collection title current page
|
||||
- UI: Condense frontpage UI slightly
|
||||
|
||||
v1.3.1
|
||||
|
||||
- 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)
|
||||
|
||||
v1.3.0
|
||||
|
||||
- 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: Convert Terms into general About dialog
|
||||
@@ -405,22 +475,23 @@ v1.3.0
|
||||
- UI: Purge Cache / Full Reload reloads current frame, not parent
|
||||
|
||||
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: ReplayWeb.page App supports opening WACZ, WARC and HAR files via double-clicking from OS and via command-line.
|
||||
|
||||
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: 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)
|
||||
- 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
|
||||
|
||||
- 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: Various improvements to fuzzy matching (longer params weighed higher, numeric params weighed by difference, support for required params)
|
||||
|
||||
|
||||
v1.1.1
|
||||
|
||||
- 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 embedded "about:blank" iframes, which may not have replayed correctly.
|
||||
|
||||
|
||||
v1.1.0
|
||||
|
||||
- Improved UI for embedding, allow viewing all search (story/pages/url) tabs
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# ReplayWeb.page
|
||||
|
||||
## Serverless Web Archive Replay
|
||||
|
||||
[Embedded Viewer](https://replayweb.page/docs/embedding) Usage: [](https://www.jsdelivr.com/package/npm/replaywebpage)
|
||||
|
||||
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.
|
||||
|
||||
|
||||
## What's in this repo
|
||||
|
||||
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`.
|
||||
|
||||
This repository contains:
|
||||
|
||||
- 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
|
||||
- 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.
|
||||
|
||||
|
||||
## Developing ReplayWeb.page
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
See the [user docs](https://replayweb.page/docs/) for additional info about using ReplayWeb.page
|
||||
|
||||
|
||||
|
||||
## 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.
|
||||
|
||||
|
||||
## Contributing and Bug Reports
|
||||
|
||||
Contributions are definitely welcome!
|
||||
|
||||
As this is still a new project and rapidly evolving, please open an issue first before submitting a pull request.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -42,4 +42,3 @@ exclude:
|
||||
- plugins-win/
|
||||
- plugins-mac/
|
||||
- plugins-linux/
|
||||
|
||||
|
||||
@@ -44,4 +44,3 @@ $nav-width-md: $nav-width;
|
||||
padding: 0 0 0 10px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
+1
-4
@@ -119,9 +119,7 @@ a:focus {
|
||||
font-size: $body-size;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
min-width: $body-min-width;
|
||||
overflow-x: $body-overflow-x;
|
||||
overflow-y: $body-overflow-y;
|
||||
min-width: $body-min-width; // @todo(emma, 2023-11-06) investigate why this is here
|
||||
text-rendering: $body-rendering;
|
||||
text-size-adjust: 100%;
|
||||
|
||||
@@ -132,7 +130,6 @@ a:focus {
|
||||
line-height: $body-line-height;
|
||||
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
// Make available to screen readers while hiding element visually:
|
||||
|
||||
+6
-3
@@ -8,8 +8,11 @@ body {
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<replay-web-page replaybase="./" embed="replay-with-info" src="./docs/assets/tweet-example.wacz" url="page:0"></replay-web-page>
|
||||
|
||||
<replay-web-page
|
||||
replaybase="./"
|
||||
embed="replay-with-info"
|
||||
src="./docs/assets/tweet-example.wacz"
|
||||
url="page:0"
|
||||
></replay-web-page>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+2
-2
@@ -1,10 +1,10 @@
|
||||
<!doctype html>
|
||||
<html class="no-overflow">
|
||||
<head>
|
||||
<link rel="manifest" href="/webmanifest.json">
|
||||
<link rel="manifest" href="/webmanifest.json" />
|
||||
<link rel="icon" href="build/icon.png" type="image/png" />
|
||||
<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>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
+7
-4
@@ -30,12 +30,14 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/flexsearch": "^0.7.3",
|
||||
"@typescript-eslint/eslint-plugin": "^6.9.1",
|
||||
"@typescript-eslint/parser": "^6.9.1",
|
||||
"copy-webpack-plugin": "^9.0.1",
|
||||
"css-loader": "^6.2.0",
|
||||
"electron": "^25.1.1",
|
||||
"electron-builder": "^23.0.3",
|
||||
"electron-notarize": "^1.1.1",
|
||||
"eslint": "^8.23.1",
|
||||
"eslint": "^8.52.0",
|
||||
"eslint-config-prettier": "^9.0.0",
|
||||
"eslint-plugin-lit": "^1.9.1",
|
||||
"http-server": "^13.0.2",
|
||||
@@ -48,8 +50,9 @@
|
||||
"sass-loader": "^13.3.2",
|
||||
"style-loader": "^3.2.1",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
"ts-lit-plugin": "^2.0.0-pre.1",
|
||||
"ts-loader": "^9.4.4",
|
||||
"typescript": "^5.1.6",
|
||||
"typescript": "^5.2.2",
|
||||
"webpack": "^5.75.0",
|
||||
"webpack-cli": "^5.0.1",
|
||||
"webpack-dev-server": "^4.11.1"
|
||||
@@ -76,8 +79,8 @@
|
||||
"dist": "yarn run build && yarn run pack",
|
||||
"dist-dev": "yarn run build-dev && yarn run pack",
|
||||
"release": "yarn run build && electron-builder",
|
||||
"lint": "eslint ./src/ webpack.config.js",
|
||||
"format": "prettier --write ./src",
|
||||
"lint": "eslint ./",
|
||||
"format": "prettier --write ./",
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"build": {
|
||||
|
||||
+10
-7
@@ -1,5 +1,5 @@
|
||||
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 {
|
||||
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 fasArrowRight from "@fortawesome/fontawesome-free/svgs/solid/arrow-right.svg";
|
||||
import { SWManager } from "./swmanager";
|
||||
import "./item";
|
||||
import "./item-index";
|
||||
import "./chooser";
|
||||
|
||||
// ===========================================================================
|
||||
class ReplayWebApp extends LitElement {
|
||||
@@ -157,7 +160,7 @@ class ReplayWebApp extends LitElement {
|
||||
min-width: 0px;
|
||||
flex-direction: column;
|
||||
}
|
||||
wr-coll {
|
||||
wr-item {
|
||||
height: 100%;
|
||||
}
|
||||
.navbar {
|
||||
@@ -379,7 +382,7 @@ class ReplayWebApp extends LitElement {
|
||||
}
|
||||
|
||||
renderColl() {
|
||||
return html` <wr-coll
|
||||
return html` <wr-item
|
||||
.loadInfo="${this.loadInfo}"
|
||||
sourceUrl="${this.sourceUrl || ""}"
|
||||
embed="${this.embed}"
|
||||
@@ -390,11 +393,11 @@ class ReplayWebApp extends LitElement {
|
||||
@update-title=${this.onTitle}
|
||||
@coll-loaded=${this.onCollLoaded}
|
||||
@about-show=${() => (this.showAbout = true)}
|
||||
></wr-coll>`;
|
||||
></wr-item>`;
|
||||
}
|
||||
|
||||
renderHomeIndex() {
|
||||
return html` <wr-coll-index>
|
||||
return html` <wr-item-index>
|
||||
${!IS_APP
|
||||
? html`
|
||||
<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)}"
|
||||
@load-start=${this.onStartLoad}
|
||||
></wr-chooser>
|
||||
</wr-coll-index>`;
|
||||
</wr-item-index>`;
|
||||
}
|
||||
|
||||
render() {
|
||||
@@ -763,7 +766,7 @@ class ReplayWebApp extends LitElement {
|
||||
<summary>Legalese:</summary>
|
||||
<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,
|
||||
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>
|
||||
<div class="has-text-centered">
|
||||
<a class="button is-warning" href="#" @click="${
|
||||
|
||||
+2
-1
@@ -37,7 +37,8 @@ class Chooser extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
fileDisplayName: { type: String },
|
||||
droppedFile: { type: File },
|
||||
/** @type File */
|
||||
droppedFile: { attribute: false },
|
||||
newFullImport: { type: Boolean },
|
||||
noHead: { type: Boolean },
|
||||
};
|
||||
|
||||
@@ -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 };
|
||||
@@ -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 };
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import { CollectionLoader } from "@webrecorder/wabac/src/loaders";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { ipcRenderer, contextBridge } = require("electron");
|
||||
|
||||
contextBridge.exposeInMainWorld("electron", { IS_APP: true });
|
||||
|
||||
@@ -466,6 +466,7 @@ class ElectronReplayApp {
|
||||
}
|
||||
|
||||
getOpenUrl(argv) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
argv = require("minimist")(argv.slice(process.defaultApp ? 2 : 1));
|
||||
|
||||
const filename =
|
||||
|
||||
Vendored
+1
-1
@@ -1,2 +1,2 @@
|
||||
declare module "*.svg";
|
||||
declare var __SW_NAME__: string;
|
||||
declare let __SW_NAME__: string;
|
||||
|
||||
@@ -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 };
|
||||
@@ -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
@@ -1,10 +1,9 @@
|
||||
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 type {
|
||||
SlDialog,
|
||||
SlDropdown,
|
||||
SlMenu,
|
||||
SlSelectEvent,
|
||||
} from "@shoelace-style/shoelace";
|
||||
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 Split from "split.js";
|
||||
|
||||
import type { Coll as CollInfo } from "./types";
|
||||
import type { Item as ItemInfo } from "./types";
|
||||
import type { Replay } from "./replay";
|
||||
|
||||
import "./item-info";
|
||||
|
||||
const RWP_SCHEME = "search://";
|
||||
|
||||
// ===========================================================================
|
||||
class Coll extends LitElement {
|
||||
class Item extends LitElement {
|
||||
@property({ type: Boolean })
|
||||
inited = false;
|
||||
|
||||
@@ -72,10 +73,10 @@ class Coll extends LitElement {
|
||||
showSidebar: boolean | null = null;
|
||||
|
||||
@property({ type: Object, attribute: false })
|
||||
collInfo: CollInfo | Record<string, never> | null = null;
|
||||
itemInfo: ItemInfo | Record<string, never> | null = null;
|
||||
|
||||
@property({ type: String })
|
||||
coll = "";
|
||||
item = "";
|
||||
|
||||
@property({ type: Boolean })
|
||||
hasStory = false;
|
||||
@@ -172,7 +173,7 @@ class Coll extends LitElement {
|
||||
|
||||
firstUpdated() {
|
||||
this.inited = true;
|
||||
window.addEventListener("hashchange", (event) => this.onHashChange());
|
||||
window.addEventListener("hashchange", () => this.onHashChange());
|
||||
|
||||
this.addEventListener("fullscreenchange", () => {
|
||||
this.isFullscreen = !!document.fullscreenElement;
|
||||
@@ -193,9 +194,9 @@ class Coll extends LitElement {
|
||||
while (
|
||||
this.editable &&
|
||||
this.autoUpdateInterval &&
|
||||
(!this.collInfo ||
|
||||
!this.collInfo.pages ||
|
||||
this.collInfo.pages.length < 100)
|
||||
(!this.itemInfo ||
|
||||
!this.itemInfo.pages ||
|
||||
this.itemInfo.pages.length < 100)
|
||||
) {
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, this.autoUpdateInterval * 1000),
|
||||
@@ -212,7 +213,7 @@ class Coll extends LitElement {
|
||||
const resp = await fetch(
|
||||
apiPrefix +
|
||||
"/c/" +
|
||||
this.coll +
|
||||
this.item +
|
||||
"/ts/?url=" +
|
||||
window.encodeURIComponent(this.tabData.url),
|
||||
);
|
||||
@@ -262,7 +263,7 @@ class Coll extends LitElement {
|
||||
}
|
||||
}
|
||||
if (changedProperties.has("tabData")) {
|
||||
if (!this.collInfo || !this.collInfo.coll) {
|
||||
if (!this.itemInfo || !this.itemInfo.coll) {
|
||||
return;
|
||||
}
|
||||
const newHash = "#" + new URLSearchParams(this.tabData as any).toString();
|
||||
@@ -355,31 +356,31 @@ class Coll extends LitElement {
|
||||
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);
|
||||
coll = res.coll;
|
||||
item = res.coll;
|
||||
}
|
||||
|
||||
this.coll = coll;
|
||||
this.item = item;
|
||||
|
||||
const collApiPrefix = apiPrefix + "/c/" + coll;
|
||||
const collReplayPrefix = replayPrefix + "/" + coll;
|
||||
const itemApiPrefix = apiPrefix + "/c/" + item;
|
||||
const itemReplayPrefix = replayPrefix + "/" + item;
|
||||
|
||||
const resp = await fetch(collApiPrefix + "?all=1");
|
||||
const resp = await fetch(itemApiPrefix + "?all=1");
|
||||
|
||||
if (resp.status != 200) {
|
||||
this.collInfo = {};
|
||||
this.itemInfo = {};
|
||||
return;
|
||||
}
|
||||
|
||||
const json = await resp.json();
|
||||
|
||||
this.collInfo = {
|
||||
apiPrefix: collApiPrefix,
|
||||
replayPrefix: collReplayPrefix,
|
||||
coll,
|
||||
this.itemInfo = {
|
||||
apiPrefix: itemApiPrefix,
|
||||
replayPrefix: itemReplayPrefix,
|
||||
coll: item,
|
||||
...json,
|
||||
};
|
||||
|
||||
@@ -389,14 +390,14 @@ class Coll extends LitElement {
|
||||
this.loadInfo.extraConfig.headers
|
||||
) {
|
||||
const headers = this.loadInfo.extraConfig.headers;
|
||||
await fetch(`${collApiPrefix}/updateAuth`, {
|
||||
await fetch(`${itemApiPrefix}/updateAuth`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ headers }),
|
||||
});
|
||||
}
|
||||
|
||||
if (!this.collInfo!.title) {
|
||||
this.collInfo!.title = this.collInfo!.filename;
|
||||
if (!this.itemInfo!.title) {
|
||||
this.itemInfo!.title = this.itemInfo!.filename;
|
||||
}
|
||||
|
||||
if (this.embed === "replayonly" || this.embed === "replay-with-info") {
|
||||
@@ -404,13 +405,13 @@ class Coll extends LitElement {
|
||||
}
|
||||
|
||||
this.hasStory = Boolean(
|
||||
this.collInfo!.desc || this.collInfo!.lists?.length,
|
||||
this.itemInfo!.desc || this.itemInfo!.lists?.length,
|
||||
);
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent("coll-loaded", {
|
||||
detail: {
|
||||
collInfo: this.collInfo,
|
||||
collInfo: this.itemInfo,
|
||||
alreadyLoaded: true,
|
||||
},
|
||||
}),
|
||||
@@ -419,7 +420,7 @@ class Coll extends LitElement {
|
||||
this.onHashChange();
|
||||
}
|
||||
|
||||
onCollLoaded(event) {
|
||||
onItemLoaded(event) {
|
||||
this.doUpdateInfo();
|
||||
this.loadInfo = null;
|
||||
if (event.detail.sourceUrl) {
|
||||
@@ -429,18 +430,18 @@ class Coll extends LitElement {
|
||||
new CustomEvent("coll-loaded", {
|
||||
detail: {
|
||||
sourceUrl: this.sourceUrl,
|
||||
collInfo: this.collInfo,
|
||||
collInfo: this.itemInfo,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
onCollUpdate(event) {
|
||||
onItemUpdate(event) {
|
||||
if (!this.editable) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.collInfo = { ...this.collInfo, ...event.detail };
|
||||
this.itemInfo = { ...this.itemInfo, ...event.detail };
|
||||
}
|
||||
|
||||
onHashChange() {
|
||||
@@ -453,12 +454,12 @@ class Coll extends LitElement {
|
||||
}
|
||||
|
||||
if (
|
||||
this.collInfo?.coll &&
|
||||
this.itemInfo?.coll &&
|
||||
(!this.tabData.view || !this.tabNames.includes(this.tabData.view))
|
||||
) {
|
||||
const view = this.hasStory
|
||||
? "story"
|
||||
: this.editable || this.collInfo.pages?.length
|
||||
: this.editable || this.itemInfo.pages?.length
|
||||
? "pages"
|
||||
: "resources";
|
||||
|
||||
@@ -471,11 +472,11 @@ class Coll extends LitElement {
|
||||
if (this.tabData.url && this.tabData.url.startsWith("page:")) {
|
||||
const pageIndex = Number(this.tabData.url.slice("page:".length));
|
||||
if (
|
||||
this.collInfo?.pages &&
|
||||
this.itemInfo?.pages &&
|
||||
!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.ts = getPageDateTS(page).timestamp;
|
||||
}
|
||||
@@ -498,7 +499,7 @@ class Coll extends LitElement {
|
||||
return false;
|
||||
}
|
||||
|
||||
onCollTabNav(event) {
|
||||
onItemTabNav(event) {
|
||||
if (event.detail.reload) {
|
||||
this.onRefresh(null, true);
|
||||
return;
|
||||
@@ -533,7 +534,7 @@ class Coll extends LitElement {
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return wrapCss(Coll.compStyles);
|
||||
return wrapCss(Item.compStyles);
|
||||
}
|
||||
|
||||
static get compStyles() {
|
||||
@@ -626,7 +627,7 @@ class Coll extends LitElement {
|
||||
|
||||
${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
|
||||
.loadInfo="${this.loadInfo}"
|
||||
embed="${this.embed || ""}"
|
||||
swName="${this.swName}"
|
||||
.coll="${this.coll}"
|
||||
.coll="${this.item}"
|
||||
sourceUrl="${this.sourceUrl || ""}"
|
||||
@coll-loaded=${this.onCollLoaded}
|
||||
@coll-loaded=${this.onItemLoaded}
|
||||
></wr-loader>`;
|
||||
} else if (this.collInfo) {
|
||||
} else if (this.itemInfo) {
|
||||
return html`
|
||||
${this.renderLocationBar()} ${this.renderVerifyInfo()}
|
||||
<sl-dialog label="Archive Info" ${ref(this.archiveInfoDialog)}>
|
||||
${this.renderCollInfo()}
|
||||
${this.renderItemInfo()}
|
||||
<sl-button
|
||||
slot="footer"
|
||||
variant="primary"
|
||||
@@ -894,7 +895,7 @@ class Coll extends LitElement {
|
||||
aria-label="${isSidebar ? "Browse Contents" : ""}"
|
||||
>
|
||||
${this.renderTabHeader(isSidebar)}
|
||||
${isSidebar || !isReplay ? this.renderCollTabs(isSidebar) : html``}
|
||||
${isSidebar || !isReplay ? this.renderItemTabs(isSidebar) : html``}
|
||||
</div>
|
||||
|
||||
${isReplay && this.isVisible
|
||||
@@ -902,11 +903,11 @@ class Coll extends LitElement {
|
||||
<wr-coll-replay
|
||||
role="main"
|
||||
tabindex="-1"
|
||||
.collInfo="${this.collInfo}"
|
||||
.collInfo="${this.itemInfo}"
|
||||
sourceUrl="${this.sourceUrl || ""}"
|
||||
url="${this.tabData.url || ""}"
|
||||
ts="${this.tabData.ts || ""}"
|
||||
@coll-tab-nav="${this.onCollTabNav}"
|
||||
@coll-tab-nav="${this.onItemTabNav}"
|
||||
id="replay"
|
||||
@replay-loading="${(e) =>
|
||||
(this.isLoading = e.detail.loading)}"
|
||||
@@ -1410,7 +1411,9 @@ class Coll extends LitElement {
|
||||
date,
|
||||
label: dateStr,
|
||||
});
|
||||
} catch {}
|
||||
} catch {
|
||||
/* empty */
|
||||
}
|
||||
});
|
||||
const currDateStr = tsToDate(this.ts).toLocaleString();
|
||||
return html`<div id="datetime" class="control is-hidden-mobile">
|
||||
@@ -1453,7 +1456,7 @@ class Coll extends LitElement {
|
||||
}
|
||||
|
||||
return html`<rwp-embed-receipt
|
||||
.collInfo=${this.collInfo || {}}
|
||||
.collInfo=${this.itemInfo || {}}
|
||||
url=${this.url}
|
||||
ts=${this.ts}
|
||||
.appLogo=${this.appLogo}
|
||||
@@ -1475,27 +1478,27 @@ class Coll extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
renderCollInfo() {
|
||||
if (!this.collInfo)
|
||||
renderItemInfo() {
|
||||
if (!this.itemInfo)
|
||||
return html`<sl-alert open variant="warning">
|
||||
<sl-icon slot="icon" name="exclamation-triangle"></sl-icon>
|
||||
<strong>Archive info is not available</strong><br />
|
||||
Please reload and try again.
|
||||
</sl-alert>`;
|
||||
return html`<wr-coll-info
|
||||
return html`<wr-item-info
|
||||
class="is-list"
|
||||
.coll="${this.collInfo}"
|
||||
.item="${this.itemInfo}"
|
||||
?detailed="${true}"
|
||||
?canDelete="${!this.embed}"
|
||||
@coll-purge="${this.onPurgeCache}"
|
||||
></wr-coll-info>`;
|
||||
@item-purge="${this.onPurgeCache}"
|
||||
></wr-item-info>`;
|
||||
}
|
||||
|
||||
renderExtraToolbar(/*isDropdown = false*/) {
|
||||
return "";
|
||||
}
|
||||
|
||||
renderCollTabs(isSidebar) {
|
||||
renderItemTabs(isSidebar) {
|
||||
const isStory = this.hasStory && this.tabData.view === "story";
|
||||
const isPages = this.tabData.view === "pages";
|
||||
const isResources = this.tabData.view === "resources";
|
||||
@@ -1503,10 +1506,10 @@ class Coll extends LitElement {
|
||||
return html`
|
||||
${isStory
|
||||
? html` <wr-coll-story
|
||||
.collInfo="${this.collInfo || {}}"
|
||||
.collInfo="${this.itemInfo || {}}"
|
||||
.active="${isStory}"
|
||||
currList="${this.tabData.currList || 0}"
|
||||
@coll-tab-nav="${this.onCollTabNav}"
|
||||
@coll-tab-nav="${this.onItemTabNav}"
|
||||
id="story"
|
||||
.isSidebar="${isSidebar}"
|
||||
class="${isStory ? "" : "is-hidden"} ${isSidebar ? "sidebar" : ""}"
|
||||
@@ -1516,12 +1519,12 @@ class Coll extends LitElement {
|
||||
: ""}
|
||||
${isResources
|
||||
? html` <wr-coll-resources
|
||||
.collInfo="${this.collInfo || {}}"
|
||||
.collInfo="${this.itemInfo || {}}"
|
||||
.active="${isResources}"
|
||||
query="${this.tabData.query || ""}"
|
||||
urlSearchType="${this.tabData.urlSearchType || ""}"
|
||||
.currMime="${this.tabData.currMime || ""}"
|
||||
@coll-tab-nav="${this.onCollTabNav}"
|
||||
@coll-tab-nav="${this.onItemTabNav}"
|
||||
id="resources"
|
||||
.isSidebar="${isSidebar}"
|
||||
class="is-paddingless ${isResources ? "" : "is-hidden"} ${isSidebar
|
||||
@@ -1533,7 +1536,7 @@ class Coll extends LitElement {
|
||||
: ""}
|
||||
${isPages
|
||||
? html` <wr-page-view
|
||||
.collInfo="${this.collInfo}"
|
||||
.collInfo="${this.itemInfo}"
|
||||
.active="${isPages}"
|
||||
.editable="${this.editable}"
|
||||
.isSidebar="${isSidebar}"
|
||||
@@ -1541,9 +1544,9 @@ class Coll extends LitElement {
|
||||
query="${this.tabData.query || ""}"
|
||||
.url="${this.tabData.url || ""}"
|
||||
.ts="${this.tabData.ts || ""}"
|
||||
@coll-tab-nav="${this.onCollTabNav}"
|
||||
@coll-tab-nav="${this.onItemTabNav}"
|
||||
id="pages"
|
||||
@coll-update="${this.onCollUpdate}"
|
||||
@coll-update="${this.onItemUpdate}"
|
||||
class="${isPages ? "" : "is-hidden"} ${isSidebar ? "sidebar" : ""}"
|
||||
role="${(isSidebar ? "" : "main") as any}"
|
||||
>
|
||||
@@ -1655,7 +1658,7 @@ class Coll extends LitElement {
|
||||
}
|
||||
|
||||
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, {
|
||||
method: "DELETE",
|
||||
@@ -1704,7 +1707,6 @@ class Coll extends LitElement {
|
||||
}
|
||||
|
||||
onSelectTimestamp(event: SlSelectEvent) {
|
||||
const menu = event.currentTarget as SlMenu;
|
||||
const { item } = event.detail;
|
||||
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
@@ -231,5 +231,5 @@ export {
|
||||
unsafeCSS,
|
||||
unsafeSVG,
|
||||
apiPrefix,
|
||||
replayPrefix
|
||||
replayPrefix,
|
||||
};
|
||||
|
||||
+2
-2
@@ -320,8 +320,8 @@ class PageEntry extends LitElement {
|
||||
let inx = textContent.indexOf(this.query);
|
||||
|
||||
if (inx < 0) {
|
||||
let textLower = textContent.toLowerCase();
|
||||
let queryLower = query.toLowerCase();
|
||||
const textLower = textContent.toLowerCase();
|
||||
const queryLower = query.toLowerCase();
|
||||
|
||||
inx = textLower.indexOf(queryLower);
|
||||
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
"use strict";
|
||||
|
||||
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 ndjson from "fetch-ndjson";
|
||||
|
||||
@@ -61,7 +61,7 @@ class Pages extends LitElement {
|
||||
@property({ type: Boolean })
|
||||
changeNeeded = false;
|
||||
|
||||
@property({ type: Set })
|
||||
@property({ attribute: false })
|
||||
selectedPages = new Set();
|
||||
|
||||
@property({ type: Boolean })
|
||||
|
||||
+3
-3
@@ -1,13 +1,13 @@
|
||||
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 type { Coll } from "./types";
|
||||
import type { Item } from "./types";
|
||||
|
||||
// ===========================================================================
|
||||
class Replay extends LitElement {
|
||||
@property({ type: Object })
|
||||
collInfo: Coll | Record<string, never> | null = null;
|
||||
collInfo: Item | Record<string, never> | null = null;
|
||||
|
||||
@property({ type: String })
|
||||
sourceUrl: any = null;
|
||||
|
||||
+4
-1
@@ -3,8 +3,11 @@ import { wrapCss } from "./misc";
|
||||
|
||||
import fasSortDown from "@fortawesome/fontawesome-free/svgs/solid/sort-down.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 {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
+15
-3
@@ -1,8 +1,12 @@
|
||||
export interface Coll {
|
||||
export interface Item {
|
||||
filename: string;
|
||||
sourceUrl: string;
|
||||
replayPrefix: string;
|
||||
apiPrefix: string;
|
||||
|
||||
/**
|
||||
* Archived Item ID
|
||||
*/
|
||||
coll?: string;
|
||||
name?: string;
|
||||
title?: string;
|
||||
@@ -10,8 +14,16 @@ export interface Coll {
|
||||
desc?: string;
|
||||
description?: string;
|
||||
resources?: { path: string; name: string }[];
|
||||
verify?: any;
|
||||
onDemand?: any;
|
||||
verify?: {
|
||||
numValid?: number;
|
||||
numInvalid?: number;
|
||||
domain?: string;
|
||||
certFingerprint?: string;
|
||||
datapackageHash?: string;
|
||||
publicKey?: string;
|
||||
software?: string;
|
||||
};
|
||||
onDemand?: boolean;
|
||||
pages?: any[];
|
||||
lists?: any[];
|
||||
ctime?: string;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { ReplayWebApp } from "./appmain";
|
||||
import { Chooser } from "./chooser";
|
||||
import { CollIndex, CollInfo } from "./coll-index";
|
||||
import { Coll } from "./coll";
|
||||
import { ItemIndex } from "./item-index";
|
||||
import { ItemInfo } from "./item-info";
|
||||
import { Item } from "./item";
|
||||
import { Story } from "./story";
|
||||
import { GDrive } from "./gdrive";
|
||||
import { Loader } from "./loader";
|
||||
@@ -16,9 +17,9 @@ import "./shoelace";
|
||||
export {
|
||||
ReplayWebApp,
|
||||
Chooser,
|
||||
CollIndex,
|
||||
CollInfo,
|
||||
Coll,
|
||||
ItemIndex as CollIndex, // @todo(2023-11-06) complete rename
|
||||
ItemInfo as CollInfo, // @todo(2023-11-06) complete rename
|
||||
Item as Coll, // @todo(2023-11-06) complete rename
|
||||
Story,
|
||||
GDrive,
|
||||
Loader,
|
||||
|
||||
@@ -8,6 +8,9 @@ import fasSearch from "@fortawesome/fontawesome-free/svgs/solid/search.svg";
|
||||
import "keyword-mark-element/lib/keyword-mark.js";
|
||||
|
||||
// ===========================================================================
|
||||
/**
|
||||
* @prop {boolean | undefined} active
|
||||
*/
|
||||
class URLResources extends LitElement {
|
||||
static get filters() {
|
||||
return [
|
||||
|
||||
+18
-3
@@ -14,9 +14,24 @@
|
||||
"inlineSources": true,
|
||||
"paths": {
|
||||
"flexsearch": ["./node_modules/@types/flexsearch"]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"src/**/*.ts"
|
||||
"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": ["src/**/*.ts"]
|
||||
}
|
||||
@@ -18,4 +18,3 @@
|
||||
"display": "standalone",
|
||||
"theme_color": "#27a0ff"
|
||||
}
|
||||
|
||||
|
||||
+21
-33
@@ -1,4 +1,5 @@
|
||||
/* eslint-env node */
|
||||
/* eslint @typescript-eslint/no-var-requires: "off" */
|
||||
|
||||
const path = require("path");
|
||||
const webpack = require("webpack");
|
||||
@@ -7,12 +8,12 @@ const CopyPlugin = require("copy-webpack-plugin");
|
||||
const TerserPlugin = require("terser-webpack-plugin");
|
||||
const package_json = require("./package.json");
|
||||
|
||||
|
||||
// helper proxy URL, run locally for app
|
||||
const HELPER_PROXY = "https://helper-proxy.webrecorder.workers.dev";
|
||||
|
||||
// GDrive client-id
|
||||
const GDRIVE_CLIENT_ID = "160798412227-tko4c82uopud11q105b2lvbogsj77hlg.apps.googleusercontent.com";
|
||||
const GDRIVE_CLIENT_ID =
|
||||
"160798412227-tko4c82uopud11q105b2lvbogsj77hlg.apps.googleusercontent.com";
|
||||
|
||||
// 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.'`;
|
||||
@@ -26,13 +27,12 @@ const optimization = {
|
||||
],
|
||||
};
|
||||
|
||||
|
||||
const electronMainConfig = (/*env, argv*/) => {
|
||||
return {
|
||||
target: "electron-main",
|
||||
mode: "production",
|
||||
entry: {
|
||||
"electron": "./src/electron-main.js",
|
||||
electron: "./src/electron-main.js",
|
||||
},
|
||||
optimization,
|
||||
output: {
|
||||
@@ -51,51 +51,44 @@ const electronMainConfig = (/*env, argv*/) => {
|
||||
new CopyPlugin({
|
||||
patterns: [
|
||||
// { from: "node_modules/classic-level/prebuilds/", to: "prebuilds" },
|
||||
{ from: "build/extra_prebuilds/", to: "prebuilds" }
|
||||
{ from: "build/extra_prebuilds/", to: "prebuilds" },
|
||||
],
|
||||
}),
|
||||
],
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
const electronPreloadConfig = (/*env, argv*/) => {
|
||||
return {
|
||||
target: "electron-preload",
|
||||
mode: "production",
|
||||
entry: {
|
||||
"preload": "./src/electron-preload.js",
|
||||
preload: "./src/electron-preload.js",
|
||||
},
|
||||
|
||||
optimization,
|
||||
plugins: [
|
||||
new webpack.BannerPlugin(BANNER_TEXT),
|
||||
]
|
||||
plugins: [new webpack.BannerPlugin(BANNER_TEXT)],
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
const browserConfig = (/*env, argv*/) => {
|
||||
const isDevServer = process.env.WEBPACK_SERVE;
|
||||
|
||||
const entry = {
|
||||
"ui": "./src/ui.ts"
|
||||
ui: "./src/ui.ts",
|
||||
};
|
||||
|
||||
const patterns = [
|
||||
{ from: "package.json", to: "_data/package.json" }
|
||||
];
|
||||
const patterns = [{ from: "package.json", to: "_data/package.json" }];
|
||||
|
||||
if (isDevServer) {
|
||||
entry["sw"] = "@webrecorder/wabac/src/sw.js";
|
||||
} else {
|
||||
patterns.push(
|
||||
{ from: "node_modules/@webrecorder/wabac/dist/sw.js", to: "sw.js"}
|
||||
);
|
||||
patterns.push({
|
||||
from: "node_modules/@webrecorder/wabac/dist/sw.js",
|
||||
to: "sw.js",
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
target: "web",
|
||||
mode: "production",
|
||||
@@ -103,7 +96,7 @@ const browserConfig = (/*env, argv*/) => {
|
||||
type: isDevServer ? "memory" : "filesystem",
|
||||
},
|
||||
resolve: {
|
||||
fallback: { "crypto": false },
|
||||
fallback: { crypto: false },
|
||||
extensions: [".ts", ".js"],
|
||||
},
|
||||
entry,
|
||||
@@ -114,7 +107,7 @@ const browserConfig = (/*env, argv*/) => {
|
||||
filename: "[name].js",
|
||||
libraryTarget: "self",
|
||||
globalObject: "self",
|
||||
publicPath: "/"
|
||||
publicPath: "/",
|
||||
},
|
||||
|
||||
devServer: {
|
||||
@@ -126,16 +119,13 @@ const browserConfig = (/*env, argv*/) => {
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new webpack.NormalModuleReplacementPlugin(
|
||||
/^node:*/,
|
||||
(resource) => {
|
||||
new webpack.NormalModuleReplacementPlugin(/^node:*/, (resource) => {
|
||||
switch (resource.request) {
|
||||
case "node:stream":
|
||||
resource.request = "stream-browserify";
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
}),
|
||||
|
||||
new webpack.optimize.LimitChunkCountPlugin({
|
||||
maxChunks: 1,
|
||||
@@ -151,7 +141,7 @@ const browserConfig = (/*env, argv*/) => {
|
||||
__VERSION__: JSON.stringify(package_json.version),
|
||||
}),
|
||||
new webpack.BannerPlugin(BANNER_TEXT),
|
||||
new CopyPlugin({ patterns })
|
||||
new CopyPlugin({ patterns }),
|
||||
],
|
||||
|
||||
module: {
|
||||
@@ -170,17 +160,15 @@ const browserConfig = (/*env, argv*/) => {
|
||||
},
|
||||
{
|
||||
test: /main.scss$/,
|
||||
use: ["css-loader", "sass-loader"]
|
||||
use: ["css-loader", "sass-loader"],
|
||||
},
|
||||
{
|
||||
test: /wombat.js|wombatWorkers.js|index.html$/i,
|
||||
use: ["raw-loader"],
|
||||
}
|
||||
]
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = [browserConfig, electronMainConfig, electronPreloadConfig];
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876"
|
||||
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":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
|
||||
@@ -28,6 +33,13 @@
|
||||
chalk "^2.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":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8"
|
||||
@@ -74,21 +86,38 @@
|
||||
minimatch "^3.0.4"
|
||||
plist "^3.0.4"
|
||||
|
||||
"@eslint/eslintrc@^1.3.2":
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356"
|
||||
integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==
|
||||
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
|
||||
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:
|
||||
ajv "^6.12.4"
|
||||
debug "^4.3.2"
|
||||
espree "^9.4.0"
|
||||
globals "^13.15.0"
|
||||
espree "^9.6.0"
|
||||
globals "^13.19.0"
|
||||
ignore "^5.2.0"
|
||||
import-fresh "^3.2.1"
|
||||
js-yaml "^4.1.0"
|
||||
minimatch "^3.1.2"
|
||||
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":
|
||||
version "1.4.1"
|
||||
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"
|
||||
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
|
||||
|
||||
"@humanwhocodes/config-array@^0.10.4":
|
||||
version "0.10.5"
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.5.tgz#bb679745224745fff1e9a41961c1d45a49f81c04"
|
||||
integrity sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==
|
||||
"@humanwhocodes/config-array@^0.11.13":
|
||||
version "0.11.13"
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297"
|
||||
integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==
|
||||
dependencies:
|
||||
"@humanwhocodes/object-schema" "^1.2.1"
|
||||
"@humanwhocodes/object-schema" "^2.0.1"
|
||||
debug "^4.1.1"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
"@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==
|
||||
minimatch "^3.0.5"
|
||||
|
||||
"@humanwhocodes/module-importer@^1.0.1":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
|
||||
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
|
||||
|
||||
"@humanwhocodes/object-schema@^1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
||||
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
|
||||
"@humanwhocodes/object-schema@^2.0.1":
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044"
|
||||
integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
|
||||
|
||||
"@leichtgewicht/ip-codec@^2.0.1":
|
||||
version "2.0.4"
|
||||
@@ -200,7 +224,7 @@
|
||||
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
|
||||
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"
|
||||
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":
|
||||
version "7.0.11"
|
||||
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"
|
||||
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":
|
||||
version "1.9.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278"
|
||||
@@ -686,6 +720,101 @@
|
||||
dependencies:
|
||||
"@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":
|
||||
version "1.11.1"
|
||||
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"
|
||||
integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
|
||||
|
||||
acorn@^8.7.1, acorn@^8.8.0:
|
||||
acorn@^8.7.1:
|
||||
version "8.8.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
|
||||
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:
|
||||
version "6.0.2"
|
||||
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"
|
||||
integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
|
||||
|
||||
chalk@^2.0.0:
|
||||
chalk@^2.0.0, chalk@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||
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"
|
||||
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:
|
||||
version "2.4.0"
|
||||
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"
|
||||
estraverse "^4.1.1"
|
||||
|
||||
eslint-scope@^7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
|
||||
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
|
||||
eslint-scope@^7.2.2:
|
||||
version "7.2.2"
|
||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
|
||||
integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
|
||||
dependencies:
|
||||
esrecurse "^4.3.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:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
||||
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
||||
|
||||
eslint@^8.23.1:
|
||||
version "8.23.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc"
|
||||
integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==
|
||||
eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
|
||||
version "3.4.3"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
|
||||
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:
|
||||
"@eslint/eslintrc" "^1.3.2"
|
||||
"@humanwhocodes/config-array" "^0.10.4"
|
||||
"@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
|
||||
"@eslint-community/eslint-utils" "^4.2.0"
|
||||
"@eslint-community/regexpp" "^4.6.1"
|
||||
"@eslint/eslintrc" "^2.1.2"
|
||||
"@eslint/js" "8.52.0"
|
||||
"@humanwhocodes/config-array" "^0.11.13"
|
||||
"@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"
|
||||
cross-spawn "^7.0.2"
|
||||
debug "^4.3.2"
|
||||
doctrine "^3.0.0"
|
||||
escape-string-regexp "^4.0.0"
|
||||
eslint-scope "^7.1.1"
|
||||
eslint-utils "^3.0.0"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
espree "^9.4.0"
|
||||
esquery "^1.4.0"
|
||||
eslint-scope "^7.2.2"
|
||||
eslint-visitor-keys "^3.4.3"
|
||||
espree "^9.6.1"
|
||||
esquery "^1.4.2"
|
||||
esutils "^2.0.2"
|
||||
fast-deep-equal "^3.1.3"
|
||||
file-entry-cache "^6.0.1"
|
||||
find-up "^5.0.0"
|
||||
glob-parent "^6.0.1"
|
||||
globals "^13.15.0"
|
||||
globby "^11.1.0"
|
||||
grapheme-splitter "^1.0.4"
|
||||
glob-parent "^6.0.2"
|
||||
globals "^13.19.0"
|
||||
graphemer "^1.4.0"
|
||||
ignore "^5.2.0"
|
||||
import-fresh "^3.0.0"
|
||||
imurmurhash "^0.1.4"
|
||||
is-glob "^4.0.0"
|
||||
js-sdsl "^4.1.4"
|
||||
is-path-inside "^3.0.3"
|
||||
js-yaml "^4.1.0"
|
||||
json-stable-stringify-without-jsonify "^1.0.1"
|
||||
levn "^0.4.1"
|
||||
lodash.merge "^4.6.2"
|
||||
minimatch "^3.1.2"
|
||||
natural-compare "^1.4.0"
|
||||
optionator "^0.9.1"
|
||||
regexpp "^3.2.0"
|
||||
optionator "^0.9.3"
|
||||
strip-ansi "^6.0.1"
|
||||
strip-json-comments "^3.1.0"
|
||||
text-table "^0.2.0"
|
||||
|
||||
espree@^9.4.0:
|
||||
version "9.4.0"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a"
|
||||
integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==
|
||||
espree@^9.6.0, espree@^9.6.1:
|
||||
version "9.6.1"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
|
||||
integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
|
||||
dependencies:
|
||||
acorn "^8.8.0"
|
||||
acorn "^8.9.0"
|
||||
acorn-jsx "^5.3.2"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
eslint-visitor-keys "^3.4.1"
|
||||
|
||||
esquery@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
|
||||
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
|
||||
esquery@^1.4.2:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
|
||||
integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
|
||||
dependencies:
|
||||
estraverse "^5.1.0"
|
||||
|
||||
@@ -2599,6 +2734,17 @@ fast-glob@^3.1.1, fast-glob@^3.2.5:
|
||||
merge2 "^1.3.0"
|
||||
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:
|
||||
version "3.2.12"
|
||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
|
||||
@@ -2903,7 +3049,7 @@ glob-parent@^6.0.0:
|
||||
dependencies:
|
||||
is-glob "^4.0.1"
|
||||
|
||||
glob-parent@^6.0.1:
|
||||
glob-parent@^6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
|
||||
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
|
||||
@@ -2957,10 +3103,10 @@ global-dirs@^3.0.0:
|
||||
dependencies:
|
||||
ini "2.0.0"
|
||||
|
||||
globals@^13.15.0:
|
||||
version "13.17.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4"
|
||||
integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==
|
||||
globals@^13.19.0:
|
||||
version "13.23.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02"
|
||||
integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==
|
||||
dependencies:
|
||||
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"
|
||||
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
||||
|
||||
grapheme-splitter@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
|
||||
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
|
||||
graphemer@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
|
||||
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
|
||||
|
||||
handle-thing@^2.0.0:
|
||||
version "2.0.1"
|
||||
@@ -3326,7 +3472,12 @@ ignore@^5.2.0:
|
||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
|
||||
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"
|
||||
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:
|
||||
version "4.0.0"
|
||||
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"
|
||||
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:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
|
||||
@@ -3791,6 +3942,21 @@ listr2@6.6.1:
|
||||
rfdc "^1.3.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:
|
||||
version "3.3.3"
|
||||
resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209"
|
||||
@@ -3853,6 +4019,11 @@ locate-path@^6.0.0:
|
||||
dependencies:
|
||||
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:
|
||||
version "4.1.2"
|
||||
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:
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||
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"
|
||||
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
|
||||
|
||||
optionator@^0.9.1:
|
||||
version "0.9.1"
|
||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
|
||||
integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
|
||||
optionator@^0.9.3:
|
||||
version "0.9.3"
|
||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
|
||||
integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
|
||||
dependencies:
|
||||
"@aashutoshrathi/word-wrap" "^1.2.3"
|
||||
deep-is "^0.1.3"
|
||||
fast-levenshtein "^2.0.6"
|
||||
levn "^0.4.1"
|
||||
prelude-ls "^1.2.1"
|
||||
type-check "^0.4.0"
|
||||
word-wrap "^1.2.3"
|
||||
|
||||
p-cancelable@^1.0.0:
|
||||
version "1.1.0"
|
||||
@@ -4611,6 +4782,11 @@ parse5-sax-parser@^7.0.0:
|
||||
dependencies:
|
||||
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:
|
||||
version "6.0.1"
|
||||
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"
|
||||
integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
|
||||
|
||||
regexpp@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
|
||||
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
|
||||
regenerator-runtime@^0.14.0:
|
||||
version "0.14.0"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
|
||||
integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
|
||||
|
||||
register-service-worker@^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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
|
||||
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
|
||||
@@ -5694,7 +5870,7 @@ strip-indent@^3.0.0:
|
||||
dependencies:
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||
@@ -5880,6 +6056,19 @@ truncate-utf8-bytes@^1.0.0:
|
||||
dependencies:
|
||||
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:
|
||||
version "9.4.4"
|
||||
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"
|
||||
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:
|
||||
version "1.14.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
|
||||
@@ -5976,10 +6170,10 @@ typedarray-to-buffer@^3.1.5:
|
||||
dependencies:
|
||||
is-typedarray "^1.0.0"
|
||||
|
||||
typescript@^5.1.6:
|
||||
version "5.1.6"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274"
|
||||
integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==
|
||||
typescript@^5.2.2, typescript@~5.2.0:
|
||||
version "5.2.2"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
|
||||
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
|
||||
|
||||
union@~0.5.0:
|
||||
version "0.5.0"
|
||||
@@ -6131,6 +6325,46 @@ verror@^1.10.0:
|
||||
core-util-is "1.0.2"
|
||||
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:
|
||||
version "2.2.0"
|
||||
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:
|
||||
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:
|
||||
version "3.2.1"
|
||||
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"
|
||||
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:
|
||||
version "7.0.0"
|
||||
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"
|
||||
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:
|
||||
version "2.10.0"
|
||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
||||
|
||||
Reference in New Issue
Block a user