From 7a1c060785fde72fa061c7c76824f88554d5272f Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Thu, 31 Aug 2023 17:22:49 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=F0=9F=90=B3=20chore:=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/library/dom/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/library/dom/index.ts b/src/library/dom/index.ts index 8a11bd69..62f1a206 100644 --- a/src/library/dom/index.ts +++ b/src/library/dom/index.ts @@ -46,9 +46,9 @@ const pollingQuery = ( /** * 判断当前脚本是否运行在 BilibiliLive 所在的 frame * - * 注:大部分B站直播间页面只有一个iframe,共两个frame + * 注:大部分B站直播间页面只有两个iframe(其中只有一个iframe的源是live.bilibili.com),共三个frame * - * 特殊的直播间(背景很好看的那种)有两个iframe,共三个frame + * 特殊的直播间(背景很好看的那种,top frame被用来当背景板了)有三个iframe(其中只有两个iframe的源是live.bilibili.com),共四个frame */ const isTargetFrame = (): boolean => { if (unsafeWindow.document.head.innerHTML.includes('BilibiliLive')) { From e30f8c57e1804d4976b5d6f5070a056df295a96a Mon Sep 17 00:00:00 2001 From: ADJazz <68748165+ADJazzzz@users.noreply.github.com> Date: Fri, 1 Sep 2023 02:38:35 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E6=8C=82=E6=9C=BA=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/EnhanceExperience.vue | 6 ++++++ src/library/help-info/index.ts | 4 ++++ src/library/storage/defaultValue.ts | 3 +++ src/modules/enhanceExperience/index.ts | 1 + .../enhanceExperience/sleepDetection.ts | 18 ++++++++++++++++++ src/types/helpInfo.d.ts | 1 + src/types/storage.d.ts | 3 +++ 7 files changed, 36 insertions(+) create mode 100644 src/modules/enhanceExperience/sleepDetection.ts diff --git a/src/components/EnhanceExperience.vue b/src/components/EnhanceExperience.vue index 169e5a61..9bfb6544 100644 --- a/src/components/EnhanceExperience.vue +++ b/src/components/EnhanceExperience.vue @@ -34,6 +34,12 @@ const qualityDescList = ['原画', '蓝光PRO', '蓝光', '超清PRO', '超清', + + + + + + diff --git a/src/library/help-info/index.ts b/src/library/help-info/index.ts index 910dfb27..bed277f7 100644 --- a/src/library/help-info/index.ts +++ b/src/library/help-info/index.ts @@ -215,6 +215,10 @@ const help_info: IhelpInfo = { h('span', '。') ]) ]) + }, + sleepDetection: { + title: '屏蔽挂机检测', + message: '屏蔽B站的挂机检测。' } }, RemoveElement: { diff --git a/src/library/storage/defaultValue.ts b/src/library/storage/defaultValue.ts index cce7ddac..19c82a96 100644 --- a/src/library/storage/defaultValue.ts +++ b/src/library/storage/defaultValue.ts @@ -110,6 +110,9 @@ const defaultValues: IdefaultValues = { }, noReport: { enabled: false + }, + sleepDetection: { + enabled: false } }, RemoveElement: { diff --git a/src/modules/enhanceExperience/index.ts b/src/modules/enhanceExperience/index.ts index 16497602..03dc6948 100644 --- a/src/modules/enhanceExperience/index.ts +++ b/src/modules/enhanceExperience/index.ts @@ -1,3 +1,4 @@ export { default as EnhanceExperience_SwitchLiveStreamQuality } from './switchLiveStreamQuality' export { default as EnhanceExperience_BanP2P } from './banP2P' export { default as EnhanceExperience_NoReport } from './noReport' +export { default as EnhanceExperience_SleepDetection } from './sleepDetection' diff --git a/src/modules/enhanceExperience/sleepDetection.ts b/src/modules/enhanceExperience/sleepDetection.ts new file mode 100644 index 00000000..a92d71a9 --- /dev/null +++ b/src/modules/enhanceExperience/sleepDetection.ts @@ -0,0 +1,18 @@ +import BaseModule from '../BaseModule' + +class SleepDetection extends BaseModule { + static runMultiple = true + + config = this.moduleStore.moduleConfig.EnhanceExperience.sleepDetection + + public async run() { + this.logger.log('屏蔽挂机检测模块开始运行') + if (this.config.enabled) { + setInterval(() => { + document.dispatchEvent(new MouseEvent('mousemove', { clientX: 1 })) + }, 3e5) + } + } +} + +export default SleepDetection diff --git a/src/types/helpInfo.d.ts b/src/types/helpInfo.d.ts index 1b5a6299..3a862efd 100644 --- a/src/types/helpInfo.d.ts +++ b/src/types/helpInfo.d.ts @@ -34,6 +34,7 @@ interface IhelpInfo { switchLiveStreamQuality: IhelpInfoItem banp2p: IhelpInfoItem noReport: IhelpInfoItem + sleepDetection: IhelpInfoItem } RemoveElement: { removePKBox: IhelpInfoItem diff --git a/src/types/storage.d.ts b/src/types/storage.d.ts index 7571b5d5..00e82c37 100644 --- a/src/types/storage.d.ts +++ b/src/types/storage.d.ts @@ -81,6 +81,9 @@ interface ImoduleConfig { noReport: { enabled: boolean } + sleepDetection: { + enabled: boolean + } } RemoveElement: { removePKBox: { From cc0006d7a3c1f92e9dffd18b9d36cf53287e305f Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Fri, 1 Sep 2023 15:02:36 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=F0=9F=90=B3=20chore:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index efe6a3bc..1d285d52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "terser": "^5.18.2", "typescript": "^5.0.4", "vite": "^4.3.5", - "vite-plugin-monkey": "^3.2.0", + "vite-plugin-monkey": "^3.5.0", "vue-tsc": "^1.6.4" } }, @@ -48,9 +48,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.13", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.13.tgz", - "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==", + "version": "7.22.14", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.14.tgz", + "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -678,17 +678,17 @@ "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==" }, "node_modules/@types/lodash-es": { - "version": "4.17.8", - "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.8.tgz", - "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", + "version": "4.17.9", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.9.tgz", + "integrity": "sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==", "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/luxon": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/@types/luxon/-/luxon-3.3.1.tgz", - "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==", + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/@types/luxon/-/luxon-3.3.2.tgz", + "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==", "dev": true }, "node_modules/@types/semver": { @@ -3421,9 +3421,9 @@ } }, "node_modules/vite-plugin-monkey": { - "version": "3.4.2", - "resolved": "https://registry.npmmirror.com/vite-plugin-monkey/-/vite-plugin-monkey-3.4.2.tgz", - "integrity": "sha512-A0h7tPWrWParlmoSHviMqTdAjpI/ayupv4xaycxyQtCbo4rRSB6JFdNECMjxnxTftYo76LbT2586ZFg89G73yw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-monkey/-/vite-plugin-monkey-3.5.0.tgz", + "integrity": "sha512-NS3qiLvnzyRPsbfanbnzMGk33rCmN1iGs2RkGykl7H5aCwZhpb7nyUSOy3CD8haP8rqTQ9BS23BLprV5MRIy/Q==", "dev": true, "dependencies": { "acorn-walk": "^8.2.0", diff --git a/package.json b/package.json index 06820259..6ddb6f95 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "terser": "^5.18.2", "typescript": "^5.0.4", "vite": "^4.3.5", - "vite-plugin-monkey": "^3.2.0", + "vite-plugin-monkey": "^3.5.0", "vue-tsc": "^1.6.4" } } From 3561c08f2653619c414e608c0cd4284fefd97bb5 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Fri, 1 Sep 2023 16:03:29 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=F0=9F=90=B3=20chore:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9match=E8=A7=84=E5=88=99=EF=BC=8C=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E6=8C=82=E6=9C=BA=E6=A3=80=E6=B5=8B=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/enhanceExperience/index.ts | 2 +- .../{sleepDetection.ts => noSleep.ts} | 6 +++--- vite.config.ts | 21 ++++++++++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) rename src/modules/enhanceExperience/{sleepDetection.ts => noSleep.ts} (67%) diff --git a/src/modules/enhanceExperience/index.ts b/src/modules/enhanceExperience/index.ts index 03dc6948..551aeabc 100644 --- a/src/modules/enhanceExperience/index.ts +++ b/src/modules/enhanceExperience/index.ts @@ -1,4 +1,4 @@ export { default as EnhanceExperience_SwitchLiveStreamQuality } from './switchLiveStreamQuality' export { default as EnhanceExperience_BanP2P } from './banP2P' export { default as EnhanceExperience_NoReport } from './noReport' -export { default as EnhanceExperience_SleepDetection } from './sleepDetection' +export { default as EnhanceExperience_NoSleep } from './noSleep' diff --git a/src/modules/enhanceExperience/sleepDetection.ts b/src/modules/enhanceExperience/noSleep.ts similarity index 67% rename from src/modules/enhanceExperience/sleepDetection.ts rename to src/modules/enhanceExperience/noSleep.ts index a92d71a9..3b7f2ffa 100644 --- a/src/modules/enhanceExperience/sleepDetection.ts +++ b/src/modules/enhanceExperience/noSleep.ts @@ -1,6 +1,6 @@ import BaseModule from '../BaseModule' -class SleepDetection extends BaseModule { +class NoSleep extends BaseModule { static runMultiple = true config = this.moduleStore.moduleConfig.EnhanceExperience.sleepDetection @@ -9,10 +9,10 @@ class SleepDetection extends BaseModule { this.logger.log('屏蔽挂机检测模块开始运行') if (this.config.enabled) { setInterval(() => { - document.dispatchEvent(new MouseEvent('mousemove', { clientX: 1 })) + document.dispatchEvent(new MouseEvent('mousemove')) }, 3e5) } } } -export default SleepDetection +export default NoSleep diff --git a/vite.config.ts b/vite.config.ts index 43bbf15c..5c8fdbfe 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -32,7 +32,26 @@ export default defineConfig({ icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDEuMDY1IiBoZWlnaHQ9IjEyNy43NDciIHZpZXdCb3g9IjAgMCAzNy4zMjQgMzMuOCI+PHBhdGggZmlsbD0iIzIwYjBlMyIgZD0iTTg2Ljk2MiAxMTIuMzMyYTIuNjYxIDIuNjYxIDAgMCAxIDIuMjYyIDAgNS41MzYgNS41MzYgMCAwIDEgMS4zODQgMS4wMTFsNS4zMjMgNC42NThoMy44MDVsNS4zMjMtNC42NThhNS41ODkgNS41ODkgMCAwIDEgMS4zODQtMS4wMTEgMi42NjEgMi42NjEgMCAwIDEgMy41NCAyLjIwOSAyLjY2MSAyLjY2MSAwIDAgMS0uNTg2IDEuNzgzIDE0Ljg3NyAxNC44NzcgMCAwIDEtMS4xNzEgMS4wNjUgNy42OTEgNy42OTEgMCAwIDEtLjc0NS42MTJoMy4zMjZhNS42NDIgNS42NDIgMCAwIDEgMy45MTIgMS43NTYgNS42NjkgNS42NjkgMCAwIDEgMS43ODQgMy45MTJ2MTUuMzAzYTEwLjc3OCAxMC43NzggMCAwIDEtLjEzNCAyLjMxNSA1LjkwOCA1LjkwOCAwIDAgMS0yLjY2IDMuNzI2IDUuNzIyIDUuNzIyIDAgMCAxLTMuMDYxLjg1Mkg4Ni4yMTdhMTEuMjg0IDExLjI4NCAwIDAgMS0yLjM5Ni0uMTMzIDUuODgyIDUuODgyIDAgMCAxLTMuNjcyLTIuNjYyIDUuNjk1IDUuNjk1IDAgMCAxLS45MDUtMy4wNnYtMTUuMTQzYTExLjkyMyAxMS45MjMgMCAwIDEgMC0yLjIwOSA1Ljg1NSA1Ljg1NSAwIDAgMSA1LjMyMy00LjczN2gzLjQ4NmMtLjU1OS0uNC0xLjAzOC0uODc4LTEuNTQ0LTEuMzA0YTIuNjYxIDIuNjYxIDAgMCAxLS44NTEtMi4xODMgMi42NjEgMi42NjEgMCAwIDEgMS4zMDQtMi4xMDJtLS42MTIgMTAuMzI2YTIuNjYxIDIuNjYxIDAgMCAwLTIuMTAzIDEuOTE2IDMuNTkzIDMuNTkzIDAgMCAwIDAgMS4wMTF2MTIuNTg4YTIuNjYxIDIuNjYxIDAgMCAwIDEuODM3IDIuNjYyIDMuNTEzIDMuNTEzIDAgMCAwIDEuMTQ0LjE4NmgyMS42MzdhMi42NjEgMi42NjEgMCAwIDAgMi41MjgtMS41NyAzLjcyNiAzLjcyNiAwIDAgMCAuMjY2LTEuNzU3di0xMS43MWE0LjQ3MSA0LjQ3MSAwIDAgMCAwLTEuMjc3IDIuNjYxIDIuNjYxIDAgMCAwLTEuNzMtMS44MSA0LjI4NSA0LjI4NSAwIDAgMC0xLjY1LS4yMzlIODcuNjAxYTguODg5IDguODg5IDAgMCAwLTEuMjUxIDB6bTAgMCIgc3R5bGU9InN0cm9rZS13aWR0aDouMDMzMDcyOSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc5LjE5MyAtMTEyLjA4KSIvPjxwYXRoIGQ9Ik04OC45NyAxMjguNjM2Yy4zNjMuMzc3Ljc0NS43NDcgMS4wODggMS4xNDIuNTk3LjY4NyAxLjExOCAxLjE5NyAxLjY2NiAxLjgwOS0uMTI5LTEuMTE3IDEuMzA0LTEuMTk4LjA3NC0xLjc1Ny0uNDA4LjQxNy0uOTQxLjg4NC0xLjM2IDEuMjIzLS4zOTIuMzE2LS44NjMuNjctMS4yMzUuOTUyLTEuOTA3IDEuNDQzLjIyNiA0LjA1MyAyLjEzIDIuNjA3IDAgMCAyLTEuNTM1IDIuODA3LTIuMzAxLjQ0LS40MTcuNjgtLjk1Ni43Mi0xLjU5Mi4wNC0uNjU0LS41MzUtMS4yNC0uNzk0LTEuNDk4LS45Mi0uOTE0LTEuNzQzLTEuOTY4LTIuNTUtMi44MTItMS41NzUtMS44LTQuMTIuNDI4LTIuNTQ2IDIuMjI3ek0xMDYuOTc5IDEyOC42MzZjLS4zNjMuMzc3LS43NDUuNzQ3LTEuMDg4IDEuMTQyLS41OTcuNjg3LTEuMTE4IDEuMTk3LTEuNjY2IDEuODA5LjEyOS0xLjExNy0xLjMwNC0xLjE5OC0uMDc0LTEuNzU3LjQwOC40MTcuOTQxLjg4NCAxLjM2IDEuMjIzLjM5Mi4zMTYuODYzLjY3IDEuMjM1Ljk1MiAxLjkwNyAxLjQ0My0uMjI2IDQuMDUzLTIuMTMgMi42MDcgMCAwLTItMS41MzUtMi44MDctMi4zMDEtLjQ0LS40MTctLjY4LS45NTYtLjcyLTEuNTkyLS4wNC0uNjU0LjUzNS0xLjI0Ljc5NC0xLjQ5OC45Mi0uOTE0IDEuNzQzLTEuOTY4IDIuNTUtMi44MTIgMS41NzUtMS44IDQuMTIuNDI4IDIuNTQ2IDIuMjI3eiIgc3R5bGU9ImZpbGw6IzIwYjBlMztmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6LjUyNDE1OTtzdHJva2UtZGFzaGFycmF5Om5vbmUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC03OS4xOTMgLTExMi4wOCkiLz48L3N2Zz4NCg==', copyright: '2023, andywang425 (https://github.com/andywang425)', license: 'MIT', - match: ['*://live.bilibili.com/*'], + match: [ + '*://live.bilibili.com/1*', + '*://live.bilibili.com/2*', + '*://live.bilibili.com/3*', + '*://live.bilibili.com/4*', + '*://live.bilibili.com/5*', + '*://live.bilibili.com/6*', + '*://live.bilibili.com/7*', + '*://live.bilibili.com/8*', + '*://live.bilibili.com/9*', + '*://live.bilibili.com/blanc/1*', + '*://live.bilibili.com/blanc/2*', + '*://live.bilibili.com/blanc/3*', + '*://live.bilibili.com/blanc/4*', + '*://live.bilibili.com/blanc/5*', + '*://live.bilibili.com/blanc/6*', + '*://live.bilibili.com/blanc/7*', + '*://live.bilibili.com/blanc/8*', + '*://live.bilibili.com/blanc/9*' + ], 'run-at': 'document-start', connect: [ 'api.bilibili.com', From e3783c8bf364ccbd836b359e4046bf8b5637af4b Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Fri, 1 Sep 2023 16:34:40 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E8=BF=90=E8=A1=8C=E6=97=B6=E6=9C=BAdocument-?= =?UTF-8?q?head=E5=92=8Cdocument-body?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/library/dom/index.ts | 2 +- src/library/utils/index.ts | 39 ++++++++++++++++++++++++++++++++++++-- src/main.ts | 4 ++++ src/modules/BaseModule.ts | 4 ++++ src/types/module.d.ts | 7 ++++++- 5 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/library/dom/index.ts b/src/library/dom/index.ts index 62f1a206..967ac5b4 100644 --- a/src/library/dom/index.ts +++ b/src/library/dom/index.ts @@ -51,7 +51,7 @@ const pollingQuery = ( * 特殊的直播间(背景很好看的那种,top frame被用来当背景板了)有三个iframe(其中只有两个iframe的源是live.bilibili.com),共四个frame */ const isTargetFrame = (): boolean => { - if (unsafeWindow.document.head.innerHTML.includes('BilibiliLive')) { + if (document.head.innerHTML.includes('BilibiliLive')) { return true } else { return false diff --git a/src/library/utils/index.ts b/src/library/utils/index.ts index 28d7f955..ede6e5df 100644 --- a/src/library/utils/index.ts +++ b/src/library/utils/index.ts @@ -80,10 +80,45 @@ function getUrlFromFetchInput(input: RequestInfo | URL): string { /** * 等待直到指定时刻 - * @param moment 模块运行时机 + * @param moment 运行时机 */ function waitForMoment(moment: runAtMoment): Promise { switch (moment) { + case 'document-start': { + return Promise.resolve() + } + case 'document-head': { + return new Promise((resolve) => { + if (document.head) { + resolve() + } else { + const observer = new MutationObserver((mutaions) => { + if (document.head) { + console.log('mutations head', mutaions) + observer.disconnect() + resolve() + } + }) + observer.observe(document.documentElement, { childList: true }) + } + }) + } + case 'document-body': { + return new Promise((resolve) => { + if (document.body) { + resolve() + } else { + const observer = new MutationObserver((mutaions) => { + if (document.body) { + console.log('mutations body', mutaions) + observer.disconnect() + resolve() + } + }) + observer.observe(document.documentElement, { childList: true }) + } + }) + } case 'document-end': { return new Promise((resolve) => { if (document.readyState !== 'loading') { @@ -103,7 +138,7 @@ function waitForMoment(moment: runAtMoment): Promise { }) } default: { - return Promise.resolve() + return Promise.reject('Illegal moment') } } } diff --git a/src/main.ts b/src/main.ts index 056ccd02..2a13ddfa 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,6 +14,10 @@ import { waitForMoment } from './library/utils' const logger = new Logger('Main') +await waitForMoment('document-head') + +await waitForMoment('document-body') + if (isTargetFrame()) { logger.log('document.readyState', document.readyState) diff --git a/src/modules/BaseModule.ts b/src/modules/BaseModule.ts index 85a4a0e6..5fa02631 100644 --- a/src/modules/BaseModule.ts +++ b/src/modules/BaseModule.ts @@ -20,6 +20,10 @@ class BaseModule { * * `document-start`: 尽可能早,与脚本注入时机相同 * + * `document-head`: `document.head`刚刚出现后 + * + * `document-body`: `document.body`刚刚出现后 + * * `document-end`: `document`的`DOMContentLoaded`事件触发后 * * `window-load`: `window`的`load`事件触发后 diff --git a/src/types/module.d.ts b/src/types/module.d.ts index 2e24d2bc..58f5f8b9 100644 --- a/src/types/module.d.ts +++ b/src/types/module.d.ts @@ -26,7 +26,12 @@ interface ImoduleStatus { } } -type runAtMoment = 'document-start' | 'document-end' | 'window-load' +type runAtMoment = + | 'document-start' + | 'document-head' + | 'document-body' + | 'document-end' + | 'window-load' type moduleEmitterEvents = { BiliInfo: { From 8a62f8b8654a4f880caacb8288e9bf22acfc20b2 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Sat, 2 Sep 2023 14:02:42 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=9C=A8=E5=A4=9A=E4=B8=AAframe=E4=B8=8A?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=EF=BC=88=E5=BE=85=E4=BC=98=E5=8C=96=EF=BC=89?= =?UTF-8?q?=EF=BC=8Cajax-hook=E6=9A=82=E6=97=B6=E7=94=A8=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/library/ajax-hook/index.d.ts | 111 +++++++++ src/library/ajax-hook/index.js | 10 + src/library/ajax-hook/src/xhr-hook.js | 129 ++++++++++ src/library/ajax-hook/src/xhr-proxy.js | 274 ++++++++++++++++++++++ src/library/dom/index.ts | 3 + src/library/fetch-hook/index.ts | 22 +- src/main.ts | 29 +-- src/modules/BaseModule.ts | 4 +- src/modules/enhanceExperience/banP2P.ts | 2 + src/modules/enhanceExperience/noReport.ts | 22 +- src/stores/useModuleStore.ts | 55 +++-- 11 files changed, 608 insertions(+), 53 deletions(-) create mode 100644 src/library/ajax-hook/index.d.ts create mode 100644 src/library/ajax-hook/index.js create mode 100644 src/library/ajax-hook/src/xhr-hook.js create mode 100644 src/library/ajax-hook/src/xhr-proxy.js diff --git a/src/library/ajax-hook/index.d.ts b/src/library/ajax-hook/index.d.ts new file mode 100644 index 00000000..d1e9024b --- /dev/null +++ b/src/library/ajax-hook/index.d.ts @@ -0,0 +1,111 @@ +interface XMLHttpRequestProxy extends XMLHttpRequest { + responseText: string, + readyState: number; + response: any; + responseURL: string; + responseXML: Document | null; + status: number; + statusText: string; + xhr: OriginXMLHttpRequest +} + +interface OriginXMLHttpRequest extends XMLHttpRequest { + getProxy(): XMLHttpRequestProxy; +} + +interface AttrGetterAndSetter { + getter?: (value: T, xhr: OriginXMLHttpRequest) => T; + setter?: (value: T, xhr: OriginXMLHttpRequest) => T; +} + +interface XhrRequestConfig { + method: string, + url: string, + headers: any, + body: any, + async: boolean, + user: string, + password: string, + withCredentials: boolean + xhr: OriginXMLHttpRequest, +} + +interface XhrResponse { + config: XhrRequestConfig, + headers: any, + response: any, + status: number, + statusText?: string, +} + +type XhrErrorType = 'error' | 'timeout' | 'abort' + + +interface XhrError { + config: XhrRequestConfig, + type: XhrErrorType +} + +interface Hooks { + onreadystatechange?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + onabort?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + onerror?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + onload?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + onloadend?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + onloadstart?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + onprogress?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + ontimeout?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; + abort?: ((args: Array, xhr: OriginXMLHttpRequest) => any); + getAllResponseHeaders?: (args: Array, xhr: OriginXMLHttpRequest) => any; + getResponseHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any; + open?: (args: Array, xhr: OriginXMLHttpRequest) => any; + overrideMimeType?: (args: Array, xhr: OriginXMLHttpRequest) => any; + send?: (args: Array, xhr: OriginXMLHttpRequest) => any; + setRequestHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any; + addEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any; + removeEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any; + + response?: AttrGetterAndSetter, + responseText?: AttrGetterAndSetter, + readyState?: AttrGetterAndSetter, + responseType?: AttrGetterAndSetter; + responseURL?: AttrGetterAndSetter; + responseXML?: AttrGetterAndSetter; + status?: AttrGetterAndSetter; + statusText?: AttrGetterAndSetter; + timeout?: AttrGetterAndSetter; + upload?: AttrGetterAndSetter; + withCredentials?: AttrGetterAndSetter; +} + +interface XhrHandler { + resolve(response: XhrResponse): void + + reject(err: XhrError): void +} + +interface XhrRequestHandler extends XhrHandler { + next(config: XhrRequestConfig): void +} + +interface XhrResponseHandler extends XhrHandler { + next(response: XhrResponse): void +} + +interface XhrErrorHandler extends XhrHandler { + next(error: XhrError): void +} + +interface Proxy { + onRequest?: (config: XhrRequestConfig, handler: XhrRequestHandler) => void, + onResponse?: (response: XhrResponse, handler: XhrResponseHandler) => void, + onError?: (err: XhrError, handler: XhrErrorHandler) => void, +} + +export function proxy(proxy: Proxy, win?: Window): { originXhr: XMLHttpRequest, unProxy: () => void }; + +export function unProxy(win?: Window); + +export function hook(hooks: Hooks,win?: Window): { originXhr: XMLHttpRequest, unHook: () => void }; + +export function unHook(win?: Window); diff --git a/src/library/ajax-hook/index.js b/src/library/ajax-hook/index.js new file mode 100644 index 00000000..699ad8cb --- /dev/null +++ b/src/library/ajax-hook/index.js @@ -0,0 +1,10 @@ +/* + * author: wendux + * email: 824783146@qq.com + * source code: https://github.com/wendux/Ajax-hook + **/ +export { hook } from "./src/xhr-hook" +export { proxy } from "./src/xhr-proxy" + +// 因为原版的ajax-hook存在一个bug,https://github.com/wendux/ajax-hook/pull/122 +// 所以暂时先使用 https://github.com/cyfung1031 修改后的版本 diff --git a/src/library/ajax-hook/src/xhr-hook.js b/src/library/ajax-hook/src/xhr-hook.js new file mode 100644 index 00000000..992df56e --- /dev/null +++ b/src/library/ajax-hook/src/xhr-hook.js @@ -0,0 +1,129 @@ +/* + * author: wendux + * email: 824783146@qq.com + * source code: https://github.com/wendux/Ajax-hook + */ + +export var events = ['load', 'loadend', 'timeout', 'error', 'readystatechange', 'abort']; + +var OriginXhr = '__origin_xhr'; + +export function configEvent(event, xhrProxy) { + var e = {}; + for (var attr in event) e[attr] = event[attr]; + // xhrProxy instead + e.target = e.currentTarget = xhrProxy + return e; +} + +export function hook(proxy, win) { + win = win || window; + var originXhr = win.XMLHttpRequest; + + var HookXMLHttpRequest = function () { + // We shouldn't hookAjax XMLHttpRequest.prototype because we can't + // guarantee that all attributes are on the prototype。 + // Instead, hooking XMLHttpRequest instance can avoid this problem. + + var xhr = new originXhr(); + + // Generate all callbacks(eg. onload) are enumerable (not undefined). + for (var i = 0; i < events.length; ++i) { + var key='on'+events[i]; + if (xhr[key] === undefined) xhr[key] = null; + } + + for (var attr in xhr) { + var type = ""; + try { + type = typeof xhr[attr] // May cause exception on some browser + } catch (e) { + } + if (type === "function") { + // hookAjax methods of xhr, such as `open`、`send` ... + this[attr] = hookFunction(attr); + } else if (attr !== OriginXhr) { + Object.defineProperty(this, attr, { + get: getterFactory(attr), + set: setterFactory(attr), + enumerable: true + }) + } + } + var that = this; + xhr.getProxy = function () { + return that + } + this[OriginXhr] = xhr; + } + + HookXMLHttpRequest.prototype = originXhr.prototype; + HookXMLHttpRequest.prototype.constructor = HookXMLHttpRequest; + + win.XMLHttpRequest = HookXMLHttpRequest; + + Object.assign(win.XMLHttpRequest, {UNSENT: 0, OPENED: 1, HEADERS_RECEIVED: 2, LOADING: 3, DONE: 4}); + + // Generate getter for attributes of xhr + function getterFactory(attr) { + return function () { + var v = this.hasOwnProperty(attr + "_") ? this[attr + "_"] : this[OriginXhr][attr]; + var attrGetterHook = (proxy[attr] || {})["getter"]; + return attrGetterHook && attrGetterHook(v, this) || v; + } + } + + // Generate setter for attributes of xhr; by this we have an opportunity + // to hookAjax event callbacks (eg: `onload`) of xhr; + function setterFactory(attr) { + return function (v) { + var xhr = this[OriginXhr]; + var that = this; + var hook = proxy[attr]; + // hookAjax event callbacks such as `onload`、`onreadystatechange`... + if (attr.substring(0, 2) === 'on') { + that[attr + "_"] = v; + xhr[attr] = function (e) { + e = configEvent(e, that) + var ret = proxy[attr] && proxy[attr].call(that, xhr, e) + ret || v.call(that, e); + } + } else { + //If the attribute isn't writable, generate proxy attribute + var attrSetterHook = (hook || {})["setter"]; + v = attrSetterHook && attrSetterHook(v, that) || v + this[attr + "_"] = v; + try { + // Not all attributes of xhr are writable(setter may undefined). + xhr[attr] = v; + } catch (e) { + } + } + } + } + + // Hook methods of xhr. + function hookFunction(fun) { + return function () { + var args = [].slice.call(arguments); + if (proxy[fun]) { + var ret = proxy[fun].call(this, args, this[OriginXhr]) + // If the proxy return value exists, return it directly, + // otherwise call the function of xhr. + if (ret) return ret; + } + return this[OriginXhr][fun].apply(this[OriginXhr], args); + } + } + + function unHook() { + win.XMLHttpRequest = originXhr; + HookXMLHttpRequest.prototype.constructor = originXhr; + originXhr = undefined; + } + + // Return the real XMLHttpRequest and unHook func + return { originXhr, unHook }; +} + + diff --git a/src/library/ajax-hook/src/xhr-proxy.js b/src/library/ajax-hook/src/xhr-proxy.js new file mode 100644 index 00000000..57d769e2 --- /dev/null +++ b/src/library/ajax-hook/src/xhr-proxy.js @@ -0,0 +1,274 @@ +/* + * author: wendux + * email: 824783146@qq.com + * source code: https://github.com/wendux/Ajax-hook + */ + +import {hook, configEvent, events} from "./xhr-hook"; + +var eventLoad = events[0], + eventLoadEnd = events[1], + eventTimeout = events[2], + eventError = events[3], + eventReadyStateChange = events[4], + eventAbort = events[5]; + + +var prototype = 'prototype'; + + +export function proxy(proxy, win) { + win = win || window; + return proxyAjax(proxy, win); +} + +function trim(str) { + return str.replace(/^\s+|\s+$/g, ''); +} + +function getEventTarget(xhr) { + return xhr.watcher || (xhr.watcher = document.createElement('a')); +} + +function triggerListener(xhr, name) { + var xhrProxy = xhr.getProxy(); + var callback = 'on' + name + '_'; + var event = configEvent({type: name}, xhrProxy); + xhrProxy[callback] && xhrProxy[callback](event); + var evt; + if (typeof(Event) === 'function') { + evt = new Event(name, {bubbles: false}); + } else { + // https://stackoverflow.com/questions/27176983/dispatchevent-not-working-in-ie11 + evt = document.createEvent('Event'); + evt.initEvent(name, false, true); + } + getEventTarget(xhr).dispatchEvent(evt); +} + + +function Handler(xhr) { + this.xhr = xhr; + this.xhrProxy = xhr.getProxy(); +} + +Handler[prototype] = Object.create({ + resolve: function resolve(response) { + var xhrProxy = this.xhrProxy; + var xhr = this.xhr; + xhrProxy.readyState = 4; + xhr.resHeader = response.headers; + xhrProxy.response = xhrProxy.responseText = response.response; + xhrProxy.statusText = response.statusText; + xhrProxy.status = response.status; + triggerListener(xhr, eventReadyStateChange); + triggerListener(xhr, eventLoad); + triggerListener(xhr, eventLoadEnd); + }, + reject: function reject(error) { + this.xhrProxy.status = 0; + triggerListener(this.xhr, error.type); + triggerListener(this.xhr, eventLoadEnd); + } +}); + +function makeHandler(next) { + function sub(xhr) { + Handler.call(this, xhr); + } + + sub[prototype] = Object.create(Handler[prototype]); + sub[prototype].next = next + return sub; +} + +var RequestHandler = makeHandler(function (rq) { + var xhr = this.xhr; + rq = rq || xhr.config; + xhr.withCredentials = rq.withCredentials; + xhr.open(rq.method, rq.url, rq.async !== false, rq.user, rq.password); + for (var key in rq.headers) { + xhr.setRequestHeader(key, rq.headers[key]); + } + xhr.send(rq.body); +}); + +var ResponseHandler = makeHandler(function (response) { + this.resolve(response); +}); + +var ErrorHandler = makeHandler(function (error) { + this.reject(error); +}); + +function proxyAjax(proxy, win) { + var onRequest = proxy.onRequest, + onResponse = proxy.onResponse, + onError = proxy.onError; + + function handleResponse(xhr, xhrProxy) { + var handler = new ResponseHandler(xhr); + var getResponseData = function () { + // object getter is part of ES5 + // getter to avoid uncessary processing. only proceed if response.response is called. + // property 'response' is enumerable such that JSON.stringify(response) contains response + var responseType = xhrProxy.responseType; + if (!responseType || responseType === 'text') { + return xhrProxy.responseText; + } + // reference: https://shanabrian.com/web/html-css-js-technics/js-ie10-ie11-xhr-json-string.php + // reference: https://github.com/axios/axios/issues/2390 + // json - W3C standard - xhrProxy.response = JSON object; responseText is unobtainable + // For details, see https://github.com/wendux/ajax-hook/issues/117 + // IE 9, 10 & 11 - only responseText + if (responseType === 'json' && typeof JSON === 'object' && ((navigator || 0).userAgent || '').indexOf('Trident') !== -1) { + return JSON.parse(xhrProxy.responseText); + } + return xhrProxy.response; + }; //ie9 + var responseData; + var ret = { + get response() { + if (getResponseData) { + responseData = getResponseData(); + getResponseData = null; + } + return responseData; + }, + set response(nv) { + getResponseData = null; + responseData = nv; + return true; + }, + status: xhrProxy.status, + statusText: xhrProxy.statusText, + config: xhr.config, + headers: xhr.resHeader || xhr.getAllResponseHeaders().split('\r\n').reduce(function (ob, str) { + if (str === "") return ob; + var m = str.split(":"); + ob[m.shift()] = trim(m.join(':')); + return ob; + }, {}) + }; + if (!onResponse) return handler.resolve(ret); + onResponse(ret, handler); + } + + function onerror(xhr, xhrProxy, error, errorType) { + var handler = new ErrorHandler(xhr); + error = {config: xhr.config, error: error, type: errorType}; + if (onError) { + onError(error, handler); + } else { + handler.next(error); + } + } + + function preventXhrProxyCallback() { + return true; + } + + function errorCallback(errorType) { + return function (xhr, e) { + onerror(xhr, this, e, errorType); + return true; + } + } + + function stateChangeCallback(xhr, xhrProxy) { + if (xhr.readyState === 4 && xhr.status !== 0) { + handleResponse(xhr, xhrProxy); + } else if (xhr.readyState !== 4) { + triggerListener(xhr, eventReadyStateChange); + } + return true; + } + + + var { originXhr, unHook } = hook({ + onload: preventXhrProxyCallback, + onloadend: preventXhrProxyCallback, + onerror: errorCallback(eventError), + ontimeout: errorCallback(eventTimeout), + onabort: errorCallback(eventAbort), + onreadystatechange: function (xhr) { + return stateChangeCallback(xhr, this); + }, + open: function open(args, xhr) { + var _this = this; + var config = xhr.config = {headers: {}}; + config.method = args[0]; + config.url = args[1]; + config.async = args[2]; + config.user = args[3]; + config.password = args[4]; + config.xhr = xhr; + var evName = 'on' + eventReadyStateChange; + if (!xhr[evName]) { + xhr[evName] = function () { + return stateChangeCallback(xhr, _this); + }; + } + + // 如果有请求拦截器,则在调用onRequest后再打开链接。因为onRequest最佳调用时机是在send前, + // 所以我们在send拦截函数中再手动调用open,因此返回true阻止xhr.open调用。 + // + // 如果没有请求拦截器,则不用阻断xhr.open调用 + if (onRequest) return true; + }, + send: function (args, xhr) { + var config = xhr.config + config.withCredentials = xhr.withCredentials + config.body = args[0]; + if (onRequest) { + // In 'onRequest', we may call XHR's event handler, such as `xhr.onload`. + // However, XHR's event handler may not be set until xhr.send is called in + // the user's code, so we use `setTimeout` to avoid this situation + var req = function () { + onRequest(config, new RequestHandler(xhr)); + } + config.async === false ? req() : setTimeout(req) + return true; + } + }, + setRequestHeader: function (args, xhr) { + // Collect request headers + xhr.config.headers[args[0].toLowerCase()] = args[1]; + if (onRequest) return true; + }, + addEventListener: function (args, xhr) { + var _this = this; + if (events.indexOf(args[0]) !== -1) { + var handler = args[1]; + getEventTarget(xhr).addEventListener(args[0], function (e) { + var event = configEvent(e, _this); + event.type = args[0]; + event.isTrusted = true; + handler.call(_this, event); + }); + return true; + } + }, + getAllResponseHeaders: function (_, xhr) { + var headers = xhr.resHeader + if (headers) { + var header = ""; + for (var key in headers) { + header += key + ': ' + headers[key] + '\r\n'; + } + return header; + } + }, + getResponseHeader: function (args, xhr) { + var headers = xhr.resHeader + if (headers) { + return headers[(args[0] || '').toLowerCase()]; + } + } + }, win); + + return { + originXhr, + unProxy: unHook + } +} diff --git a/src/library/dom/index.ts b/src/library/dom/index.ts index 967ac5b4..c991fd2e 100644 --- a/src/library/dom/index.ts +++ b/src/library/dom/index.ts @@ -51,6 +51,9 @@ const pollingQuery = ( * 特殊的直播间(背景很好看的那种,top frame被用来当背景板了)有三个iframe(其中只有两个iframe的源是live.bilibili.com),共四个frame */ const isTargetFrame = (): boolean => { + console.log('d h i', document.head.innerHTML) + console.log('w l h', window.location.href) + console.log('iframes', document.querySelectorAll('iframe').length) if (document.head.innerHTML.includes('BilibiliLive')) { return true } else { diff --git a/src/library/fetch-hook/index.ts b/src/library/fetch-hook/index.ts index 74938383..9c275258 100644 --- a/src/library/fetch-hook/index.ts +++ b/src/library/fetch-hook/index.ts @@ -66,17 +66,11 @@ class ResponseHandler { } } +let isHooked: boolean = false let onRequestHandlers: onRequestHandler[] = [] let onResponseHandlers: onResponseHandler[] = [] -const hook = (proxy: Iproxy, win: Window) => { - if (proxy.onRequest) { - onRequestHandlers.push(proxy.onRequest) - } - if (proxy.onResponse) { - onResponseHandlers.push(proxy.onResponse) - } - +const hook = (win: Window) => { win.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { // 发起请求前 for (const handler of onRequestHandlers) { @@ -133,7 +127,17 @@ const fproxy = ( /** 原生 fetch 函数 */ originFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise } => { - hook(proxy, win) + if (proxy.onRequest) { + onRequestHandlers.push(proxy.onRequest) + } + if (proxy.onResponse) { + onResponseHandlers.push(proxy.onResponse) + } + + if (!isHooked) { + hook(win) + isHooked = true + } return { unProxy: () => { diff --git a/src/main.ts b/src/main.ts index 2a13ddfa..92de129c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,20 @@ import { waitForMoment } from './library/utils' const logger = new Logger('Main') -await waitForMoment('document-head') +const pinia = createPinia() +const cacheStore = useCacheStore(pinia) +const moduleStore = useModuleStore(pinia) + +cacheStore.checkIfMainBLTHRunning() + +if (!cacheStore.isMainBLTHRunning) { + logger.log('当前脚本是Main BLTH,开始存活心跳') + cacheStore.startAliveHeartBeat() +} else { + logger.log('其它页面上存在正在运行的Main BLTH') +} + +moduleStore.loadModules('unknown') await waitForMoment('document-body') @@ -22,21 +35,10 @@ if (isTargetFrame()) { logger.log('document.readyState', document.readyState) const app = createApp(App) - const pinia = createPinia() app.use(ElementPlus) app.use(pinia) - const cacheStore = useCacheStore() - cacheStore.checkIfMainBLTHRunning() - - if (!cacheStore.isMainBLTHRunning) { - logger.log('当前脚本是Main BLTH,开始存活心跳') - cacheStore.startAliveHeartBeat() - } else { - logger.log('其它页面上存在正在运行的Main BLTH') - } - for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component) } @@ -45,8 +47,7 @@ if (isTargetFrame()) { app.component(key, component) } - const moduleStore = useModuleStore() - moduleStore.loadModules() + moduleStore.loadModules('yes') const mountApp = () => { const div = dce('div') diff --git a/src/modules/BaseModule.ts b/src/modules/BaseModule.ts index 5fa02631..be41882c 100644 --- a/src/modules/BaseModule.ts +++ b/src/modules/BaseModule.ts @@ -28,7 +28,9 @@ class BaseModule { * * `window-load`: `window`的`load`事件触发后 */ - static runAt: runAtMoment = 'document-start' + static runAt: runAtMoment = 'document-body' + + static onFrame: 'all' | 'target' = 'target' /** * 用于在控制台中输出日志信息 */ diff --git a/src/modules/enhanceExperience/banP2P.ts b/src/modules/enhanceExperience/banP2P.ts index 8f118099..58e0de14 100644 --- a/src/modules/enhanceExperience/banP2P.ts +++ b/src/modules/enhanceExperience/banP2P.ts @@ -1,8 +1,10 @@ import { unsafeWindow } from '$' +import { runAtMoment } from '../../types/module' import BaseModule from '../BaseModule' class BanP2P extends BaseModule { static runMultiple = true + static runAt: runAtMoment = 'document-start' config = this.moduleStore.moduleConfig.EnhanceExperience.banp2p diff --git a/src/modules/enhanceExperience/noReport.ts b/src/modules/enhanceExperience/noReport.ts index 5db18867..ec0e7b90 100644 --- a/src/modules/enhanceExperience/noReport.ts +++ b/src/modules/enhanceExperience/noReport.ts @@ -1,12 +1,14 @@ import { unsafeWindow } from '$' -import { XhrRequestConfig, XhrRequestHandler, proxy } from 'ajax-hook' +import { XhrRequestConfig, XhrRequestHandler, proxy } from '../../library/ajax-hook' import { Iproxy, fproxy } from '../../library/fetch-hook' import BaseModule from '../BaseModule' import { getUrlFromFetchInput } from '../../library/utils' -import { isSelfTopFrame } from '../../library/dom' +import { runAtMoment } from '../../types/module' class NoReport extends BaseModule { static runMultiple = true + static runAt: runAtMoment = 'document-start' + static onFrame: 'all' | 'target' = 'all' config = this.moduleStore.moduleConfig.EnhanceExperience.noReport @@ -76,14 +78,14 @@ class NoReport extends BaseModule { proxy(ajaxHookProxyConfig, unsafeWindow) fproxy(fetchHookConfig, unsafeWindow) - if (!isSelfTopFrame()) { - // 如果处于特殊直播间(有多个frame),也拦截顶层frame的日志上报 - // 但由于注入时机的关系,初期的一些日志报上拦截不到 - // 要优化这一点的话可能要调整模块运行逻辑,允许模块在初期的时候就能在多个frame上允许 - this.hookProperties(unsafeWindow.top as Window) - proxy(ajaxHookProxyConfig, unsafeWindow.top as Window) - fproxy(fetchHookConfig, unsafeWindow.top as Window) - } + // if (!isSelfTopFrame()) { + // // 如果处于特殊直播间(有多个frame),也拦截顶层frame的日志上报 + // // 但由于注入时机的关系,初期的一些日志报上拦截不到 + // // 要优化这一点的话可能要调整模块运行逻辑,允许模块在初期的时候就能在多个frame上允许 + // this.hookProperties(unsafeWindow.top as Window) + // proxy(ajaxHookProxyConfig, unsafeWindow.top as Window) + // fproxy(fetchHookConfig, unsafeWindow.top as Window) + // } } public async run() { diff --git a/src/stores/useModuleStore.ts b/src/stores/useModuleStore.ts index f694a4a7..a8665bc8 100644 --- a/src/stores/useModuleStore.ts +++ b/src/stores/useModuleStore.ts @@ -40,6 +40,8 @@ const defaultModuleStatus: ImoduleStatus = { } } +const loadedModuleNames: string[] = [] + export const useModuleStore = defineStore('module', () => { // 所有模块的配置信息 const moduleConfig: ImoduleConfig = reactive(Storage.getModuleConfig()) @@ -50,29 +52,44 @@ export const useModuleStore = defineStore('module', () => { const moduleStatus: ImoduleStatus = reactive(defaultModuleStatus) /** - * 加载(运行)所有模块 + * 加载模块 */ - async function loadModules() { + async function loadModules(isOnTargetFrame: 'unknown' | 'yes') { const cacheStore = useCacheStore() - // 按优先级顺序逐个运行默认模块 - for (const [name, module] of Object.entries(defaultModules).sort( - (a, b) => a[1].sequence - b[1].sequence - )) { - try { - if (module.runMultiple || !cacheStore.isMainBLTHRunning) { - await new (module as new (moduleName: string) => DefaultBaseModule)(name).run() + if (isOnTargetFrame === 'unknown') { + for (const [name, module] of Object.entries(otherModules)) { + if (module.onFrame === 'all') { + if (module.runMultiple || !cacheStore.isMainBLTHRunning) { + waitForMoment(module.runAt).then(() => + new (module as new (moduleName: string) => BaseModule)(name).run() + ) + loadedModuleNames.push(name) + } } - } catch (err) { - new Logger('loadModules').error('加载默认模块时发生致命错误,挂机助手停止运行:', err) - return } - } - // 运行其它模块 - for (const [name, module] of Object.entries(otherModules)) { - if (module.runMultiple || !cacheStore.isMainBLTHRunning) { - waitForMoment(module.runAt).then(() => - new (module as new (moduleName: string) => BaseModule)(name).run() - ) + } else { + // 按优先级顺序逐个运行默认模块 + for (const [name, module] of Object.entries(defaultModules).sort( + (a, b) => a[1].sequence - b[1].sequence + )) { + try { + if (module.runMultiple || !cacheStore.isMainBLTHRunning) { + await new (module as new (moduleName: string) => DefaultBaseModule)(name).run() + } + } catch (err) { + new Logger('loadModules').error('加载默认模块时发生致命错误,挂机助手停止运行:', err) + return + } + } + // 运行其它模块 + for (const [name, module] of Object.entries(otherModules)) { + if (!loadedModuleNames.includes(name)) { + if (module.runMultiple || !cacheStore.isMainBLTHRunning) { + waitForMoment(module.runAt).then(() => + new (module as new (moduleName: string) => BaseModule)(name).run() + ) + } + } } } } From 7dc216c9314fe7bc22338b62a74c0688844a58ae Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Sat, 2 Sep 2023 16:01:08 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=F0=9F=90=B3=20chore:=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=A8=A1=E5=9D=97=E7=9A=84=E5=A4=9Aframe=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 13 +++---------- src/library/dom/index.ts | 5 +---- src/library/utils/index.ts | 11 +++++++---- src/main.ts | 15 ++++++--------- src/modules/BaseModule.ts | 12 +++++++++--- src/modules/DefaultBaseModule.ts | 11 ++++++++++- src/stores/useModuleStore.ts | 16 +++++++++++----- src/types/index.d.ts | 1 + src/types/module.d.ts | 13 ++++++++++++- 9 files changed, 60 insertions(+), 37 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2612a188..4fd41852 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -138,17 +138,10 @@ npm run preview ## 已知问题 -如果要调试或开发涉及到拦截网络请求(使用ajax-hook或fetch-hook)的模块,需检查一下脚本有没有被及时注入到页面上。因为如果注入得太晚会错过一些网络请求。 +如果要开发或调试运行时机很早的模块,建议先编译脚本(npm run build)然后运行编译后的脚本。在dev状态下调试这类功能可能会遇到以下问题: -你可以在控制台里找到一条输出脚本被注入时的页面加载状态的日志:`document.readyState <状态>`。 -如果状态是`loading`那就没问题,但假如状态是`interactive`甚至`complete`,那就说明脚本被注入得太晚了。 - -造成这种现象的原因在开发状态下(npm run dev),首先要通过发送网络请求从vite获取到BLTH所需的各个文件,然后才能把BLTH注入到页面上。 -在这个过程中B站的js可能先一步被获取到并执行,导致注入BLTH的时机被延后。 - -建议把浏览器开发者工具网络选项卡(Network)中的停用缓存(Disable cache)勾上,这样可以延后B站的js被获取到的时间。勾选之后大部分情况下脚本都能被及时注入。 - -当然先编译脚本然后运行编译后的脚本也是可以的,但这样就比较麻烦。 +- 脚本会被注入得太晚,无法很好地测试 +- 脚本会被注入得太早导致`document.head`为`null`而报错。 ## commit 规范 diff --git a/src/library/dom/index.ts b/src/library/dom/index.ts index c991fd2e..5827e8c4 100644 --- a/src/library/dom/index.ts +++ b/src/library/dom/index.ts @@ -44,16 +44,13 @@ const pollingQuery = ( } /** - * 判断当前脚本是否运行在 BilibiliLive 所在的 frame + * 判断当前脚本是否运行在 BilibiliLive 所在的 frame(需要等到 document-body 后才能判断) * * 注:大部分B站直播间页面只有两个iframe(其中只有一个iframe的源是live.bilibili.com),共三个frame * * 特殊的直播间(背景很好看的那种,top frame被用来当背景板了)有三个iframe(其中只有两个iframe的源是live.bilibili.com),共四个frame */ const isTargetFrame = (): boolean => { - console.log('d h i', document.head.innerHTML) - console.log('w l h', window.location.href) - console.log('iframes', document.querySelectorAll('iframe').length) if (document.head.innerHTML.includes('BilibiliLive')) { return true } else { diff --git a/src/library/utils/index.ts b/src/library/utils/index.ts index ede6e5df..254c3bbd 100644 --- a/src/library/utils/index.ts +++ b/src/library/utils/index.ts @@ -85,16 +85,17 @@ function getUrlFromFetchInput(input: RequestInfo | URL): string { function waitForMoment(moment: runAtMoment): Promise { switch (moment) { case 'document-start': { + // 在 document-start 阶段,document-head 可能为 null return Promise.resolve() } case 'document-head': { + // 在 document-head 阶段,document.head 已经出现但是部分内部节点可能还没出现 return new Promise((resolve) => { if (document.head) { resolve() } else { - const observer = new MutationObserver((mutaions) => { + const observer = new MutationObserver(() => { if (document.head) { - console.log('mutations head', mutaions) observer.disconnect() resolve() } @@ -104,13 +105,13 @@ function waitForMoment(moment: runAtMoment): Promise { }) } case 'document-body': { + // 在 document-body 阶段,document.body 已经出现但是部分内部节点可能还没出现 return new Promise((resolve) => { if (document.body) { resolve() } else { - const observer = new MutationObserver((mutaions) => { + const observer = new MutationObserver(() => { if (document.body) { - console.log('mutations body', mutaions) observer.disconnect() resolve() } @@ -120,6 +121,7 @@ function waitForMoment(moment: runAtMoment): Promise { }) } case 'document-end': { + // 在 document-end 阶段,DOM 加载完成,但部分资源可能还没获取到(比如图片) return new Promise((resolve) => { if (document.readyState !== 'loading') { resolve() @@ -129,6 +131,7 @@ function waitForMoment(moment: runAtMoment): Promise { }) } case 'window-load': { + // 在 window-load 阶段,整个网页加载完毕 return new Promise((resolve) => { if (document.readyState === 'complete') { resolve() diff --git a/src/main.ts b/src/main.ts index 92de129c..a92115ca 100644 --- a/src/main.ts +++ b/src/main.ts @@ -13,6 +13,7 @@ import { useModuleStore } from './stores/useModuleStore' import { waitForMoment } from './library/utils' const logger = new Logger('Main') +logger.log('document.readyState', document.readyState) const pinia = createPinia() const cacheStore = useCacheStore(pinia) @@ -32,8 +33,6 @@ moduleStore.loadModules('unknown') await waitForMoment('document-body') if (isTargetFrame()) { - logger.log('document.readyState', document.readyState) - const app = createApp(App) app.use(ElementPlus) @@ -49,12 +48,10 @@ if (isTargetFrame()) { moduleStore.loadModules('yes') - const mountApp = () => { - const div = dce('div') - div.id = 'BLTH' - document.body.append(div) - app.mount(div) - } + await waitForMoment('document-end') - waitForMoment('document-end').then(() => mountApp()) + const div = dce('div') + div.id = 'BLTH' + document.body.append(div) + app.mount(div) } diff --git a/src/modules/BaseModule.ts b/src/modules/BaseModule.ts index be41882c..c67a91ef 100644 --- a/src/modules/BaseModule.ts +++ b/src/modules/BaseModule.ts @@ -1,6 +1,6 @@ import { useModuleStore } from '../stores/useModuleStore' import Logger from '../library/logger' -import { moduleStatus, runAtMoment } from '../types/module' +import { moduleStatus, onFrameTypes, runAtMoment } from '../types/module' class BaseModule { /** @@ -29,8 +29,14 @@ class BaseModule { * `window-load`: `window`的`load`事件触发后 */ static runAt: runAtMoment = 'document-body' - - static onFrame: 'all' | 'target' = 'target' + /** + * 模块运行的 frame + * + * `all`: 所有符合脚本`@match`规则的 frame + * + * `target`: window.BilibiliLive 存在的那个 frame + */ + static onFrame: onFrameTypes = 'target' /** * 用于在控制台中输出日志信息 */ diff --git a/src/modules/DefaultBaseModule.ts b/src/modules/DefaultBaseModule.ts index f93202ca..315ca4de 100644 --- a/src/modules/DefaultBaseModule.ts +++ b/src/modules/DefaultBaseModule.ts @@ -1,10 +1,19 @@ +import { onFrameTypes, runAtMoment } from '../types/module' import BaseModule from './BaseModule' class DefaultBaseModule extends BaseModule { + /** + * 默认模块的运行时机总是 document-body + */ + static runAt: runAtMoment = 'document-body' + /** + * 默认模块只能在目标 frame 上运行 + */ + static onFrame: onFrameTypes = 'target' /** * 优先级,数字越小优先级越高 */ - static sequence?: number + static sequence: number = 0 /** * 默认模块按顺序逐个运行,所以必须返回一个 Promise */ diff --git a/src/stores/useModuleStore.ts b/src/stores/useModuleStore.ts index a8665bc8..6c426c6d 100644 --- a/src/stores/useModuleStore.ts +++ b/src/stores/useModuleStore.ts @@ -10,7 +10,7 @@ import * as otherModules from '../modules' import Logger from '../library/logger' import mitt from '../library/mitt' import { delayToNextMoment } from '../library/luxon' -import { ImoduleStatus, moduleEmitterEvents, moduleStatus } from '../types/module' +import { ImoduleStatus, isOnTargetFrameTypes, moduleEmitterEvents, moduleStatus } from '../types/module' import { deepestIterate, waitForMoment } from '../library/utils' import { useCacheStore } from './useCacheStore' @@ -40,7 +40,8 @@ const defaultModuleStatus: ImoduleStatus = { } } -const loadedModuleNames: string[] = [] +// 早期(不确定当前 frame 是否是目标 frame 的时候)加载的模块名称 +const earlyLoadedModuleNames: string[] = [] export const useModuleStore = defineStore('module', () => { // 所有模块的配置信息 @@ -53,8 +54,12 @@ export const useModuleStore = defineStore('module', () => { /** * 加载模块 + * + * @param isOnTargetFrame 当前脚本是否运行在目标 frame 上 + * - `unknown`: 不知道(至少要等到`document-body`后才能确定) + * - `yes`: 是的 */ - async function loadModules(isOnTargetFrame: 'unknown' | 'yes') { + async function loadModules(isOnTargetFrame: isOnTargetFrameTypes) { const cacheStore = useCacheStore() if (isOnTargetFrame === 'unknown') { for (const [name, module] of Object.entries(otherModules)) { @@ -63,7 +68,7 @@ export const useModuleStore = defineStore('module', () => { waitForMoment(module.runAt).then(() => new (module as new (moduleName: string) => BaseModule)(name).run() ) - loadedModuleNames.push(name) + earlyLoadedModuleNames.push(name) } } } @@ -83,7 +88,8 @@ export const useModuleStore = defineStore('module', () => { } // 运行其它模块 for (const [name, module] of Object.entries(otherModules)) { - if (!loadedModuleNames.includes(name)) { + // 对 onFrame 为 all 的模块来说,如果之前运行过,现在就不运行了 + if (!earlyLoadedModuleNames.includes(name)) { if (module.runMultiple || !cacheStore.isMainBLTHRunning) { waitForMoment(module.runAt).then(() => new (module as new (moduleName: string) => BaseModule)(name).run() diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 3ba89249..016bda3b 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1,3 +1,4 @@ export * from './helpInfo' export * from './cookies' export * from './storage' +export * from './module' diff --git a/src/types/module.d.ts b/src/types/module.d.ts index 58f5f8b9..a1687595 100644 --- a/src/types/module.d.ts +++ b/src/types/module.d.ts @@ -33,6 +33,10 @@ type runAtMoment = | 'document-end' | 'window-load' +type onFrameTypes = 'all' | 'target' + +type isOnTargetFrameTypes = 'unknown' | 'yes' + type moduleEmitterEvents = { BiliInfo: { target: string @@ -42,4 +46,11 @@ type moduleEmitterEvents = { } } -export { moduleStatus, ImoduleStatus, runAtMoment, moduleEmitterEvents } +export { + moduleStatus, + ImoduleStatus, + runAtMoment, + moduleEmitterEvents, + onFrameTypes, + isOnTargetFrameTypes +} From 4289c0975701658868cc7d581fd75e8a77dadc8d Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Sun, 3 Sep 2023 12:18:36 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=F0=9F=90=B3=20chore:=20=E5=86=99?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=EF=BC=8C=E7=BB=86=E8=8A=82=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 2 +- src/App.vue | 9 ++++----- src/library/dom/index.ts | 12 +++++++----- src/main.ts | 2 ++ src/stores/useModuleStore.ts | 1 + 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4fd41852..16a35f73 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -138,7 +138,7 @@ npm run preview ## 已知问题 -如果要开发或调试运行时机很早的模块,建议先编译脚本(npm run build)然后运行编译后的脚本。在dev状态下调试这类功能可能会遇到以下问题: +如果要开发或调试运行时机很早的模块,建议先编译脚本(npm run build)然后运行编译后的脚本。在 dev 状态下调试这类功能可能会遇到以下问题: - 脚本会被注入得太晚,无法很好地测试 - 脚本会被注入得太早导致`document.head`为`null`而报错。 diff --git a/src/App.vue b/src/App.vue index c66c7ba8..9de00407 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,10 +3,9 @@ import { useUIStore } from './stores/useUIStore' import PanelHeader from './components/PanelHeader.vue' import PanelAside from './components/PanelAside.vue' import PanelMain from './components/PanelMain.vue' -import { dce, dq, pollingQuery } from './library/dom' +import { dce, dq, pollingQuery, isSelfTopFrame, topFrameDocuemntElement } from './library/dom' import hotkeys from 'hotkeys-js' import _ from 'lodash' -import { isSelfTopFrame, topFrameDocuemnt } from './library/dom' import Logger from './library/logger' const uiStore = useUIStore() @@ -56,13 +55,13 @@ if (livePlayer) { button.innerText = uiStore.isShowPanelButtonText playerHeaderLeft.append(button) if (!isSelfTopFrame()) { - // 在特殊直播间,脚本所在的 TargetFrame 只占屏幕中间一块地方 + // 在特殊直播间,脚本所在的目标 frame 只占屏幕中间一块地方 // 如果焦点不在里面,快捷键会失效 // 所以这里额外把 hotkeys 注入到顶层 frame 确保快捷键总是可用 hotkeys( 'alt+b', { - element: topFrameDocuemnt() as any + element: topFrameDocuemntElement() }, throttleButtoOnClick ) @@ -72,7 +71,7 @@ if (livePlayer) { .catch(() => logger.error("Can't find playerHeaderLeft in time")) // 监听页面缩放,调整控制面板大小 // 因为这个操作频率不高就不节流或防抖了 - window.onresize = setPanelSize + window.addEventListener('resize', () => setPanelSize()) // 监听 html 根节点和 body 节点 // 主要是为了适配滚动条的显示/隐藏和实验室中的功能 const observer = new MutationObserver(() => setPanelSize()) diff --git a/src/library/dom/index.ts b/src/library/dom/index.ts index 5827e8c4..fb70c54a 100644 --- a/src/library/dom/index.ts +++ b/src/library/dom/index.ts @@ -46,9 +46,11 @@ const pollingQuery = ( /** * 判断当前脚本是否运行在 BilibiliLive 所在的 frame(需要等到 document-body 后才能判断) * - * 注:大部分B站直播间页面只有两个iframe(其中只有一个iframe的源是live.bilibili.com),共三个frame + * 注:大部分B站直播间页面只有两个iframe,共三个 frame; + * 脚本只会被注入到顶层 frame * - * 特殊的直播间(背景很好看的那种,top frame被用来当背景板了)有三个iframe(其中只有两个iframe的源是live.bilibili.com),共四个frame + * 特殊的直播间(背景很好看的那种,top frame被用来当背景板了)有三个 iframe,共四个 frame; + * 脚本会被注入到顶层 frame 和一个 iframe */ const isTargetFrame = (): boolean => { if (document.head.innerHTML.includes('BilibiliLive')) { @@ -64,8 +66,8 @@ const isTargetFrame = (): boolean => { const isSelfTopFrame = (): boolean => unsafeWindow.self === unsafeWindow.top /** - * 获取顶层 frame 的 document + * 获取顶层 frame 的 documentElement */ -const topFrameDocuemnt = (): Document | undefined => unsafeWindow.top?.document +const topFrameDocuemntElement = (): HTMLElement | undefined => unsafeWindow.top?.document?.documentElement -export { dq, dqa, dce, pollingQuery, isTargetFrame, isSelfTopFrame, topFrameDocuemnt } +export { dq, dqa, dce, pollingQuery, isTargetFrame, isSelfTopFrame, topFrameDocuemntElement } diff --git a/src/main.ts b/src/main.ts index a92115ca..e5817f34 100644 --- a/src/main.ts +++ b/src/main.ts @@ -13,9 +13,11 @@ import { useModuleStore } from './stores/useModuleStore' import { waitForMoment } from './library/utils' const logger = new Logger('Main') + logger.log('document.readyState', document.readyState) const pinia = createPinia() +// 在 app.use(pinia) 之前要将 pinia 作为参数传入 const cacheStore = useCacheStore(pinia) const moduleStore = useModuleStore(pinia) diff --git a/src/stores/useModuleStore.ts b/src/stores/useModuleStore.ts index 6c426c6d..bda6c23d 100644 --- a/src/stores/useModuleStore.ts +++ b/src/stores/useModuleStore.ts @@ -68,6 +68,7 @@ export const useModuleStore = defineStore('module', () => { waitForMoment(module.runAt).then(() => new (module as new (moduleName: string) => BaseModule)(name).run() ) + // 记录被加载的、onFrame 为 all 的模块名称 earlyLoadedModuleNames.push(name) } } From 9926479f9b2896783010f200d23d1c5b4f9b68b4 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Mon, 4 Sep 2023 13:20:47 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E2=9C=A8=20feat:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E8=BF=90=E8=A1=8C=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9ErunAfterDefault?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/BaseModule.ts | 8 ++- src/modules/DefaultBaseModule.ts | 4 -- src/modules/default/biliInfo.ts | 2 - src/modules/enhanceExperience/banP2P.ts | 6 ++- src/modules/enhanceExperience/noReport.ts | 7 +-- src/modules/enhanceExperience/noSleep.ts | 6 ++- src/stores/useModuleStore.ts | 60 ++++++++++++++++------- 7 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/modules/BaseModule.ts b/src/modules/BaseModule.ts index c67a91ef..202215ff 100644 --- a/src/modules/BaseModule.ts +++ b/src/modules/BaseModule.ts @@ -16,7 +16,7 @@ class BaseModule { */ static runMultiple: boolean = false /** - * 模块运行时机 + * 模块运行时机,默认 document-body * * `document-start`: 尽可能早,与脚本注入时机相同 * @@ -30,13 +30,17 @@ class BaseModule { */ static runAt: runAtMoment = 'document-body' /** - * 模块运行的 frame + * 模块运行的 frame,默认 target * * `all`: 所有符合脚本`@match`规则的 frame * * `target`: window.BilibiliLive 存在的那个 frame */ static onFrame: onFrameTypes = 'target' + /** + * 是否要等默认模块运行完了再运行,默认 true + */ + static runAfterDefault: boolean = true /** * 用于在控制台中输出日志信息 */ diff --git a/src/modules/DefaultBaseModule.ts b/src/modules/DefaultBaseModule.ts index 315ca4de..68ac3327 100644 --- a/src/modules/DefaultBaseModule.ts +++ b/src/modules/DefaultBaseModule.ts @@ -10,10 +10,6 @@ class DefaultBaseModule extends BaseModule { * 默认模块只能在目标 frame 上运行 */ static onFrame: onFrameTypes = 'target' - /** - * 优先级,数字越小优先级越高 - */ - static sequence: number = 0 /** * 默认模块按顺序逐个运行,所以必须返回一个 Promise */ diff --git a/src/modules/default/biliInfo.ts b/src/modules/default/biliInfo.ts index a35d543e..0a95bfd2 100644 --- a/src/modules/default/biliInfo.ts +++ b/src/modules/default/biliInfo.ts @@ -10,8 +10,6 @@ import { sleep } from '../../library/utils' import { useModuleStore } from '../../stores/useModuleStore' class BiliInfo extends DefaultBaseModule { - public static sequence = 0 - private getBilibiliLive(): Window['BilibiliLive'] { this.logger.log('unsafeWindow.BilibiliLive', unsafeWindow.BilibiliLive) // 返回一个 BilibiliLive 的引用 diff --git a/src/modules/enhanceExperience/banP2P.ts b/src/modules/enhanceExperience/banP2P.ts index 58e0de14..3043741c 100644 --- a/src/modules/enhanceExperience/banP2P.ts +++ b/src/modules/enhanceExperience/banP2P.ts @@ -1,10 +1,12 @@ import { unsafeWindow } from '$' -import { runAtMoment } from '../../types/module' +import { onFrameTypes, runAtMoment } from '../../types/module' import BaseModule from '../BaseModule' class BanP2P extends BaseModule { - static runMultiple = true + static runMultiple: boolean = true static runAt: runAtMoment = 'document-start' + static onFrame: onFrameTypes = 'all' + static runAfterDefault: boolean = false config = this.moduleStore.moduleConfig.EnhanceExperience.banp2p diff --git a/src/modules/enhanceExperience/noReport.ts b/src/modules/enhanceExperience/noReport.ts index ec0e7b90..7ddb93c9 100644 --- a/src/modules/enhanceExperience/noReport.ts +++ b/src/modules/enhanceExperience/noReport.ts @@ -3,12 +3,13 @@ import { XhrRequestConfig, XhrRequestHandler, proxy } from '../../library/ajax-h import { Iproxy, fproxy } from '../../library/fetch-hook' import BaseModule from '../BaseModule' import { getUrlFromFetchInput } from '../../library/utils' -import { runAtMoment } from '../../types/module' +import { onFrameTypes, runAtMoment } from '../../types/module' class NoReport extends BaseModule { - static runMultiple = true + static runMultiple: boolean = true static runAt: runAtMoment = 'document-start' - static onFrame: 'all' | 'target' = 'all' + static onFrame: onFrameTypes = 'all' + static runAfterDefault: boolean = false config = this.moduleStore.moduleConfig.EnhanceExperience.noReport diff --git a/src/modules/enhanceExperience/noSleep.ts b/src/modules/enhanceExperience/noSleep.ts index 3b7f2ffa..2ec1cf93 100644 --- a/src/modules/enhanceExperience/noSleep.ts +++ b/src/modules/enhanceExperience/noSleep.ts @@ -1,7 +1,11 @@ +import { onFrameTypes, runAtMoment } from '../../types/module' import BaseModule from '../BaseModule' class NoSleep extends BaseModule { - static runMultiple = true + static runMultiple: boolean = true + static runAt: runAtMoment = 'window-load' + static onFrame: onFrameTypes = 'target' + static runAfterDefault: boolean = false config = this.moduleStore.moduleConfig.EnhanceExperience.sleepDetection diff --git a/src/stores/useModuleStore.ts b/src/stores/useModuleStore.ts index bda6c23d..5ddd510b 100644 --- a/src/stores/useModuleStore.ts +++ b/src/stores/useModuleStore.ts @@ -10,7 +10,12 @@ import * as otherModules from '../modules' import Logger from '../library/logger' import mitt from '../library/mitt' import { delayToNextMoment } from '../library/luxon' -import { ImoduleStatus, isOnTargetFrameTypes, moduleEmitterEvents, moduleStatus } from '../types/module' +import { + ImoduleStatus, + isOnTargetFrameTypes, + moduleEmitterEvents, + moduleStatus +} from '../types/module' import { deepestIterate, waitForMoment } from '../library/utils' import { useCacheStore } from './useCacheStore' @@ -52,6 +57,26 @@ export const useModuleStore = defineStore('module', () => { // 模块状态,用于显示状态图标 const moduleStatus: ImoduleStatus = reactive(defaultModuleStatus) + /** + * 加载默认模块(该函数不导出) + */ + async function loadDefaultModules(): Promise { + const cacheStore = useCacheStore() + const promiseArray: Promise[] = [] + // 按优先级顺序逐个运行默认模块 + for (const [name, module] of Object.entries(defaultModules)) { + if (module.runMultiple || !cacheStore.isMainBLTHRunning) { + promiseArray.push(new (module as new (moduleName: string) => DefaultBaseModule)(name).run()) + } + } + try { + return Promise.all(promiseArray) + } catch (reason) { + new Logger('loadModules').error('加载默认模块时发生致命错误,挂机助手停止运行:', reason) + return Promise.reject(reason) + } + } + /** * 加载模块 * @@ -59,7 +84,7 @@ export const useModuleStore = defineStore('module', () => { * - `unknown`: 不知道(至少要等到`document-body`后才能确定) * - `yes`: 是的 */ - async function loadModules(isOnTargetFrame: isOnTargetFrameTypes) { + function loadModules(isOnTargetFrame: isOnTargetFrameTypes) { const cacheStore = useCacheStore() if (isOnTargetFrame === 'unknown') { for (const [name, module] of Object.entries(otherModules)) { @@ -68,33 +93,30 @@ export const useModuleStore = defineStore('module', () => { waitForMoment(module.runAt).then(() => new (module as new (moduleName: string) => BaseModule)(name).run() ) - // 记录被加载的、onFrame 为 all 的模块名称 + // 记录被加载的 onFrame 为 all 的模块名称 earlyLoadedModuleNames.push(name) } } } } else { - // 按优先级顺序逐个运行默认模块 - for (const [name, module] of Object.entries(defaultModules).sort( - (a, b) => a[1].sequence - b[1].sequence - )) { - try { - if (module.runMultiple || !cacheStore.isMainBLTHRunning) { - await new (module as new (moduleName: string) => DefaultBaseModule)(name).run() - } - } catch (err) { - new Logger('loadModules').error('加载默认模块时发生致命错误,挂机助手停止运行:', err) - return - } - } + // 加载默认模块 + const defaultModulesLoaded: Promise = loadDefaultModules() // 运行其它模块 for (const [name, module] of Object.entries(otherModules)) { // 对 onFrame 为 all 的模块来说,如果之前运行过,现在就不运行了 if (!earlyLoadedModuleNames.includes(name)) { if (module.runMultiple || !cacheStore.isMainBLTHRunning) { - waitForMoment(module.runAt).then(() => - new (module as new (moduleName: string) => BaseModule)(name).run() - ) + waitForMoment(module.runAt).then(async () => { + try { + if (module.runAfterDefault) { + // 等待默认模块运行完毕 + await defaultModulesLoaded + } + new (module as new (moduleName: string) => BaseModule)(name).run() + } catch (e) { + // 默认模块运行出错,不运行该模块 + } + }) } } } From 091c5b67b7f9eab949923f575fc8a14f31950cb8 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Mon, 4 Sep 2023 19:32:18 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=F0=9F=8E=88=20perf:=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BC=98=E5=8C=96=EF=BC=8C=E6=8B=86=E5=88=86?= =?UTF-8?q?=E6=88=90=E5=B0=8F=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/library/luxon/index.ts | 1 - src/modules/BaseModule.ts | 4 + .../liveTasks/medalTasks/watchTask.ts | 8 +- src/modules/default/biliInfo.ts | 242 ------------------ src/modules/default/bilibiliLive.ts | 39 +++ src/modules/default/cookies.ts | 23 ++ src/modules/default/dailyRewardInfo.ts | 45 ++++ src/modules/default/dynamicVideos.ts | 49 ++++ src/modules/default/fansMetals.ts | 76 ++++++ src/modules/default/index.ts | 7 +- src/modules/default/userInfo.ts | 37 +++ src/modules/enhanceExperience/noSleep.ts | 3 +- .../switchLiveStreamQuality.ts | 1 + src/stores/useModuleStore.ts | 31 +-- src/types/cookies.d.ts | 1 + src/types/module.d.ts | 2 +- 16 files changed, 303 insertions(+), 266 deletions(-) delete mode 100644 src/modules/default/biliInfo.ts create mode 100644 src/modules/default/bilibiliLive.ts create mode 100644 src/modules/default/cookies.ts create mode 100644 src/modules/default/dailyRewardInfo.ts create mode 100644 src/modules/default/dynamicVideos.ts create mode 100644 src/modules/default/fansMetals.ts create mode 100644 src/modules/default/userInfo.ts diff --git a/src/library/luxon/index.ts b/src/library/luxon/index.ts index 8e4abd8f..5981935b 100644 --- a/src/library/luxon/index.ts +++ b/src/library/luxon/index.ts @@ -49,7 +49,6 @@ function isTimestampToday(timestamp: number, hour: number = 0, minute: number = * * @param hour 小时(0-23),默认0 * @param minute 分钟(0-59),默认5 - * @returns 毫秒数 */ function delayToNextMoment(hour: number = 0, minute: number = 5): Iduration { const now = DateTime.now() diff --git a/src/modules/BaseModule.ts b/src/modules/BaseModule.ts index 202215ff..613b1dbb 100644 --- a/src/modules/BaseModule.ts +++ b/src/modules/BaseModule.ts @@ -39,6 +39,10 @@ class BaseModule { static onFrame: onFrameTypes = 'target' /** * 是否要等默认模块运行完了再运行,默认 true + * + * 如果设置为 true,那么就不能保证该模块被及时地执行 + * + * 因为默认模块的运行时机总是 document-body,而且默认模块的运行时间是不确定的 */ static runAfterDefault: boolean = true /** diff --git a/src/modules/dailyTasks/liveTasks/medalTasks/watchTask.ts b/src/modules/dailyTasks/liveTasks/medalTasks/watchTask.ts index 890324d5..fe90095b 100644 --- a/src/modules/dailyTasks/liveTasks/medalTasks/watchTask.ts +++ b/src/modules/dailyTasks/liveTasks/medalTasks/watchTask.ts @@ -5,10 +5,10 @@ import { useBiliStore } from '../../../../stores/useBiliStore' import Logger from '../../../../library/logger' import CryptoJS from 'crypto-js' import { uuid, sleep } from '../../../../library/utils' -import { getCookie } from '../../../../library/cookie' import { useModuleStore } from '../../../../stores/useModuleStore' import { ImoduleConfig } from '../../../../types' import { moduleStatus, runAtMoment } from '../../../../types/module' +import { getCookie } from '../../../../library/cookie' interface sypderData { benchmark: string @@ -66,12 +66,12 @@ class RoomHeart { } /** Cookie LIVE_BUVID */ - private buvid = getCookie('LIVE_BUVID') + private buvid: string | null = useBiliStore().cookies?.LIVE_BUVID ?? getCookie('LIVE_BUVID') private uuid = uuid() /** 计算签名和发送请求时均需要 JSON.stringify */ - private device = [this.buvid as string, this.uuid] + private device: string[] = [this.buvid as string, this.uuid] /** 浏览器 user agent */ private ua = navigator.userAgent @@ -254,7 +254,7 @@ class RoomHeart { } class WatchTask extends BaseModule { - static runAt: runAtMoment = 'document-end' + static runAt: runAtMoment = 'window-load' medalTasksConfig = this.moduleStore.moduleConfig.DailyTasks.LiveTasks.medalTasks config = this.medalTasksConfig.watch diff --git a/src/modules/default/biliInfo.ts b/src/modules/default/biliInfo.ts deleted file mode 100644 index 0a95bfd2..00000000 --- a/src/modules/default/biliInfo.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { unsafeWindow } from '$' -import { useBiliStore } from '../../stores/useBiliStore' -import BAPI from '../../library/bili-api' -import { LiveData, MainData } from '../../library/bili-api/data' -import DefaultBaseModule from '../DefaultBaseModule' -import { getCookies } from '../../library/cookie' -import { IbiliCookies } from '../../types' -import { delayToNextMoment, isTimestampToday } from '../../library/luxon' -import { sleep } from '../../library/utils' -import { useModuleStore } from '../../stores/useModuleStore' - -class BiliInfo extends DefaultBaseModule { - private getBilibiliLive(): Window['BilibiliLive'] { - this.logger.log('unsafeWindow.BilibiliLive', unsafeWindow.BilibiliLive) - // 返回一个 BilibiliLive 的引用 - // 需要注意的是 BilibiliLive 里的部分属性需要等一会才会被初始化(window.onload 触发后可正常使用) - return unsafeWindow.BilibiliLive - } - - /** - * 获取 Cookies - * - * bili_jct: 常作为参数 csrf 在请求中出现 - * LIVE_BUVID: 如果用户以前从来没看过直播,此时可能为 null - */ - private getCookies(): IbiliCookies { - return getCookies(['bili_jct', 'LIVE_BUVID']) - } - - /** - * 通过 BAPI.main.nav 获取用户基本信息 - */ - private async getUserInfo(): Promise { - try { - const response = await BAPI.main.nav() - this.logger.log('BAPI.main.nav response', response) - if (response.code === 0) { - return Promise.resolve(response.data) - } else { - this.logger.error('获取用户信息失败', response.message) - return Promise.reject(response.message) - } - } catch (error) { - this.logger.error('获取用户信息出错', error) - return Promise.reject(error) - } - } - - /** - * 获取礼物配置信息 - * - * 如礼物id,名称,亲密度等等 - */ - private async getGiftConfig(): Promise { - try { - // TODO: 添加条件判断 - throw new Error('送礼功能尚未完成,暂时不需要获取礼物配置信息,请忽略本报错 >︿<') - const response = await BAPI.live.roomGiftConfig() - this.logger.log('BAPI.live.roomGiftConfig response', response) - if (response.code === 0) { - return Promise.resolve(response.data) - } else { - this.logger.error('获取礼物配置信息失败', response.message) - return Promise.reject(response.message) - } - } catch (error) { - this.logger.error('获取礼物配置信息出错', error) - return Promise.reject(error) - } - } - - /** - * 获取今日主站每日任务的完成情况 - */ - private async getDailyRewardInfo(): Promise { - const MainSiteTasks = this.moduleStore.moduleConfig.DailyTasks.MainSiteTasks - // 开启了任意一项主站功能且该功能今天没完成过 - if ( - Object.values(MainSiteTasks).some((t) => t.enabled && !isTimestampToday(t._lastCompleteTime)) - ) { - try { - const response = await BAPI.main.reward() - this.logger.log('BAPI.main.reward response', response) - if (response.code === 0) { - return Promise.resolve(response.data) - } else { - this.logger.error('获取主站每日任务完成情况失败', response.message) - return Promise.reject(response.message) - } - } catch (error) { - this.logger.error('获取主站每日任务完成情况出错', error) - return Promise.reject(error) - } - } else { - return Promise.reject() - } - } - - /** - * 从动态中获取一页视频的信息 - * - * 每日观看视频,每日分享视频,每日投币都会用到 - */ - private async getDynamicVideo(): Promise { - const MainSiteTasks = this.moduleStore.moduleConfig.DailyTasks.MainSiteTasks - // 开启了观看视频、每日分享视频或每日投币功能且今天没完成过 - if ( - Object.entries(MainSiteTasks) - .filter(([key]) => ['watch', 'share', 'coin'].includes(key)) - .some((keyValue) => keyValue[1].enabled && !isTimestampToday(keyValue[1]._lastCompleteTime)) - ) { - try { - const response = await BAPI.main.dynamicAll('video') - this.logger.log('BAPI.main.dynamicAll response', response) - if (response.code === 0) { - return Promise.resolve(response.data.items) - } else { - this.logger.error('获取主站每日任务完成情况失败', response.message) - return Promise.reject(response.message) - } - } catch (error) { - this.logger.error('获取主站每日任务完成情况出错', error) - return Promise.reject(error) - } - } else { - return Promise.reject() - } - } - - /** - * 获取粉丝勋章 - * - * @param pages 获取的页数 - * @param force 是否无视配置强制获取,默认fasle - */ - private async getFansMetals(pages = 10, force = false): Promise { - const medalTasks = this.moduleStore.moduleConfig.DailyTasks.LiveTasks.medalTasks - // 开启了任意一项粉丝勋章相关功能且该功能今天没完成过 - if ( - force || - Object.entries(medalTasks) - .filter(([key]) => ['danmu', 'like', 'watch'].includes(key)) - .some( - (keyValue) => - (keyValue[1] as any).enabled && - !isTimestampToday((keyValue[1] as any)._lastCompleteTime) - ) - ) { - const fansMetalList: LiveData.FansMedalPanel.List[] = [] - let total_page = 1 - try { - const firstPageResponse = await BAPI.live.fansMedalPanel(1) - this.logger.log('BAPI.live.fansMedalPanel(1) response', firstPageResponse) - if (firstPageResponse.code === 0) { - total_page = firstPageResponse.data.page_info.total_page - // 第一页的 list 缺少当前佩戴和最近获得的勋章,需通过 special_list 获取 - fansMetalList.push(...firstPageResponse.data.special_list, ...firstPageResponse.data.list) - } else { - this.logger.error('获取粉丝勋章列表第1页失败', firstPageResponse.message) - return Promise.reject(firstPageResponse.message) - } - for (let page = 2; page <= Math.min(total_page, pages); page++) { - const response = await BAPI.live.fansMedalPanel(page) - this.logger.log(`BAPI.live.fansMedalPanel(${page}) response`, response) - if (firstPageResponse.code === 0) { - fansMetalList.push(...response.data.list) - } else { - this.logger.error(`获取粉丝勋章列表第${page}页失败`, firstPageResponse.message) - return fansMetalList - } - // 防止风控,稍微加点延时 - await sleep(250) - } - return Promise.resolve(fansMetalList) - } catch (error) { - return Promise.reject(error) - } - } else { - return Promise.reject() - } - } - - public async run(): Promise { - const biliStore = useBiliStore() - // 直接返回目标值的方法 - biliStore.BilibiliLive = this.getBilibiliLive() - biliStore.cookies = this.getCookies() - // 返回 Promise 的方法 - // 如果 this.getUserInfo 发生错误,会被 loadModules 捕获,脚本终止运行 - biliStore.userInfo = await this.getUserInfo() - setTimeout(async () => { - biliStore.userInfo = await this.getUserInfo() - }, delayToNextMoment(0, 4).ms) - - // 并发运行多个 Promise - const allPromiseResult = await Promise.allSettled([ - this.getGiftConfig(), - this.getDailyRewardInfo(), - this.getDynamicVideo(), - this.getFansMetals() - ]) - this.logger.log('allPromiseResult', allPromiseResult) - - biliStore.giftConfig = - allPromiseResult[0].status === 'fulfilled' ? allPromiseResult[0].value : null - - biliStore.dailyRewardInfo = - allPromiseResult[1].status === 'fulfilled' ? allPromiseResult[1].value : null - setTimeout(async () => { - const biliStore = useBiliStore() - // 先将主站每日任务状态重置成未完成,防止API数据更新不及时 - if (biliStore.dailyRewardInfo) { - biliStore.dailyRewardInfo.login = false - biliStore.dailyRewardInfo.share = false - biliStore.dailyRewardInfo.watch = false - biliStore.dailyRewardInfo.coins = 0 - } - // 再次获取任务完成情况 - biliStore.dailyRewardInfo = await this.getDailyRewardInfo() - }, delayToNextMoment(0, 4).ms) - - biliStore.dynamicVideos = - allPromiseResult[2].status === 'fulfilled' ? allPromiseResult[2].value : null - setTimeout(async () => { - biliStore.dynamicVideos = await this.getDynamicVideo() - }, delayToNextMoment(0, 4).ms) - - biliStore.fansMedals = - allPromiseResult[3].status === 'fulfilled' ? allPromiseResult[3].value : null - setTimeout(async () => { - biliStore.fansMedals = await this.getFansMetals() - }, delayToNextMoment(0, 4).ms) - - useModuleStore().emitter.on('BiliInfo', async (event) => { - if (event.target === 'getFansMetals') { - biliStore.fansMedals = await this.getFansMetals(10, true) - } - }) - } -} - -export default BiliInfo diff --git a/src/modules/default/bilibiliLive.ts b/src/modules/default/bilibiliLive.ts new file mode 100644 index 00000000..d8a97e3c --- /dev/null +++ b/src/modules/default/bilibiliLive.ts @@ -0,0 +1,39 @@ +import { useBiliStore } from '../../stores/useBiliStore' +import DefaultBaseModule from '../DefaultBaseModule' +import { unsafeWindow } from '$' + +class BilibiliLive extends DefaultBaseModule { + /** + * 获取 window.BilibiliLive + * @returns 一个 window.BilibiliLive 对象的引用 + */ + private getBilibiliLive(): Promise { + this.logger.log('unsafeWindow.BilibiliLive', unsafeWindow.BilibiliLive) + + return new Promise((resolve) => { + // window.Bilibili 的定义在 document.head 里,此时一定已经是个 Object 了 + if (unsafeWindow.BilibiliLive.UID !== 0) { + resolve(unsafeWindow.BilibiliLive) + return + } + unsafeWindow.BilibiliLive = new Proxy(unsafeWindow.BilibiliLive, { + set(target: Window['BilibiliLive'], prop: keyof Window['BilibiliLive'], value: never) { + target[prop] = value + // UID 是最后被赋值的属性,等 UID 被赋值后 BilibiliLive 的所有属性就都被初始化了 + if (prop === 'UID' && unsafeWindow.BilibiliLive.UID !== 0) { + resolve(unsafeWindow.BilibiliLive) + // 取消代理,还原为 Object + unsafeWindow.BilibiliLive = target + } + return true + } + }) + }) + } + + public async run(): Promise { + useBiliStore().BilibiliLive = await this.getBilibiliLive() + } +} + +export default BilibiliLive diff --git a/src/modules/default/cookies.ts b/src/modules/default/cookies.ts new file mode 100644 index 00000000..564c6a55 --- /dev/null +++ b/src/modules/default/cookies.ts @@ -0,0 +1,23 @@ +import { useBiliStore } from '../../stores/useBiliStore' +import DefaultBaseModule from '../DefaultBaseModule' +import { getCookies } from '../../library/cookie' +import { IbiliCookies } from '../../types/cookies' + +class Cookies extends DefaultBaseModule { + /** + * 获取 Cookies + * + * bili_jct: 常作为参数 csrf 在请求中出现 + * + * LIVE_BUVID: 如果用户以前从来没看过直播,此时可能为 null + */ + private getCookies(): IbiliCookies { + return getCookies(['bili_jct', 'LIVE_BUVID']) + } + + public async run(): Promise { + useBiliStore().cookies = this.getCookies() + } +} + +export default Cookies diff --git a/src/modules/default/dailyRewardInfo.ts b/src/modules/default/dailyRewardInfo.ts new file mode 100644 index 00000000..19cc4872 --- /dev/null +++ b/src/modules/default/dailyRewardInfo.ts @@ -0,0 +1,45 @@ +import { useBiliStore } from '../../stores/useBiliStore' +import BAPI from '../../library/bili-api' +import { MainData } from '../../library/bili-api/data' +import DefaultBaseModule from '../DefaultBaseModule' +import { delayToNextMoment, isTimestampToday } from '../../library/luxon' + +class DailyRewardInfo extends DefaultBaseModule { + /** + * 获取今日主站每日任务的完成情况 + */ + private async getDailyRewardInfo(): Promise { + const MainSiteTasks = this.moduleStore.moduleConfig.DailyTasks.MainSiteTasks + // 开启了任意一项主站功能且该功能今天没完成过 + if ( + Object.values(MainSiteTasks).some((t) => t.enabled && !isTimestampToday(t._lastCompleteTime)) + ) { + try { + const response = await BAPI.main.reward() + this.logger.log('BAPI.main.reward response', response) + if (response.code === 0) { + return Promise.resolve(response.data) + } else { + this.logger.error('获取主站每日任务完成情况失败', response.message) + return Promise.reject(response.message) + } + } catch (error) { + this.logger.error('获取主站每日任务完成情况出错', error) + return Promise.reject(error) + } + } else { + return Promise.resolve(null) + } + } + + public async run(): Promise { + const biliStore = useBiliStore() + biliStore.dailyRewardInfo = await this.getDailyRewardInfo() + + setTimeout(async () => { + biliStore.dailyRewardInfo = await this.getDailyRewardInfo() + }, delayToNextMoment(0, 4).ms) + } +} + +export default DailyRewardInfo diff --git a/src/modules/default/dynamicVideos.ts b/src/modules/default/dynamicVideos.ts new file mode 100644 index 00000000..0aa4531c --- /dev/null +++ b/src/modules/default/dynamicVideos.ts @@ -0,0 +1,49 @@ +import { useBiliStore } from '../../stores/useBiliStore' +import BAPI from '../../library/bili-api' +import { MainData } from '../../library/bili-api/data' +import DefaultBaseModule from '../DefaultBaseModule' +import { delayToNextMoment, isTimestampToday } from '../../library/luxon' + +class DynamicVideos extends DefaultBaseModule { + /** + * 从动态中获取一页视频的信息 + * + * 每日观看视频,每日分享视频,每日投币都会用到 + */ + private async getDynamicVideos(): Promise { + const MainSiteTasks = this.moduleStore.moduleConfig.DailyTasks.MainSiteTasks + // 开启了观看视频、每日分享视频或每日投币功能且今天没完成过 + if ( + Object.entries(MainSiteTasks) + .filter(([key]) => ['watch', 'share', 'coin'].includes(key)) + .some((keyValue) => keyValue[1].enabled && !isTimestampToday(keyValue[1]._lastCompleteTime)) + ) { + try { + const response = await BAPI.main.dynamicAll('video') + this.logger.log('BAPI.main.dynamicAll response', response) + if (response.code === 0) { + return Promise.resolve(response.data.items) + } else { + this.logger.error('获取主站每日任务完成情况失败', response.message) + return Promise.reject(response.message) + } + } catch (error) { + this.logger.error('获取主站每日任务完成情况出错', error) + return Promise.reject(error) + } + } else { + return Promise.resolve(null) + } + } + + public async run(): Promise { + const biliStore = useBiliStore() + biliStore.dynamicVideos = await this.getDynamicVideos() + + setTimeout(async () => { + biliStore.dynamicVideos = await this.getDynamicVideos() + }, delayToNextMoment(0, 4).ms) + } +} + +export default DynamicVideos diff --git a/src/modules/default/fansMetals.ts b/src/modules/default/fansMetals.ts new file mode 100644 index 00000000..9d43db26 --- /dev/null +++ b/src/modules/default/fansMetals.ts @@ -0,0 +1,76 @@ +import { useBiliStore } from '../../stores/useBiliStore' +import BAPI from '../../library/bili-api' +import { LiveData } from '../../library/bili-api/data' +import DefaultBaseModule from '../DefaultBaseModule' +import { delayToNextMoment, isTimestampToday } from '../../library/luxon' +import { sleep } from '../../library/utils' + +class FansMetals extends DefaultBaseModule { + /** + * 获取粉丝勋章 + * + * @param pages 获取的页数 + * @param force 是否无视配置强制获取,默认fasle + */ + private async getFansMetals( + pages = 10, + force = false + ): Promise { + const medalTasks = this.moduleStore.moduleConfig.DailyTasks.LiveTasks.medalTasks + // 开启了任意一项粉丝勋章相关功能且该功能今天没完成过 + if ( + force || + Object.entries(medalTasks) + .filter(([key]) => ['danmu', 'like', 'watch'].includes(key)) + .some( + (keyValue) => + (keyValue[1] as any).enabled && + !isTimestampToday((keyValue[1] as any)._lastCompleteTime) + ) + ) { + const fansMetalList: LiveData.FansMedalPanel.List[] = [] + let total_page = 1 + try { + const firstPageResponse = await BAPI.live.fansMedalPanel(1) + this.logger.log('BAPI.live.fansMedalPanel(1) response', firstPageResponse) + if (firstPageResponse.code === 0) { + total_page = firstPageResponse.data.page_info.total_page + // 第一页的 list 缺少当前佩戴和最近获得的勋章,需通过 special_list 获取 + fansMetalList.push(...firstPageResponse.data.special_list, ...firstPageResponse.data.list) + } else { + this.logger.error('获取粉丝勋章列表第1页失败', firstPageResponse.message) + return Promise.reject(firstPageResponse.message) + } + for (let page = 2; page <= Math.min(total_page, pages); page++) { + const response = await BAPI.live.fansMedalPanel(page) + this.logger.log(`BAPI.live.fansMedalPanel(${page}) response`, response) + if (firstPageResponse.code === 0) { + fansMetalList.push(...response.data.list) + } else { + this.logger.error(`获取粉丝勋章列表第${page}页失败`, firstPageResponse.message) + return fansMetalList + } + // 防止风控,稍微加点延时 + await sleep(250) + } + return Promise.resolve(fansMetalList) + } catch (error) { + this.logger.error('获取粉丝勋章列表出错', error) + return Promise.reject(error) + } + } else { + return Promise.resolve(null) + } + } + + public async run(): Promise { + const biliStore = useBiliStore() + biliStore.fansMedals = await this.getFansMetals() + + setTimeout(async () => { + biliStore.fansMedals = await this.getFansMetals() + }, delayToNextMoment(0, 4).ms) + } +} + +export default FansMetals diff --git a/src/modules/default/index.ts b/src/modules/default/index.ts index 5ffbedb7..66255d59 100644 --- a/src/modules/default/index.ts +++ b/src/modules/default/index.ts @@ -1 +1,6 @@ -export { default as BiliInfo } from './biliInfo' +export { default as Default_UserInfo } from './userInfo' +export { default as Default_DailyRewardInfo } from './dailyRewardInfo' +export { default as Default_DynamicVideos } from './dynamicVideos' +export { default as Default_FansMetals } from './fansMetals' +export { default as Default_Cookies } from './cookies' +export { default as Default_BilibiliLive } from './bilibiliLive' diff --git a/src/modules/default/userInfo.ts b/src/modules/default/userInfo.ts new file mode 100644 index 00000000..9f67cf69 --- /dev/null +++ b/src/modules/default/userInfo.ts @@ -0,0 +1,37 @@ +import { useBiliStore } from '../../stores/useBiliStore' +import BAPI from '../../library/bili-api' +import { MainData } from '../../library/bili-api/data' +import DefaultBaseModule from '../DefaultBaseModule' +import { delayToNextMoment } from '../../library/luxon' + +class UserInfo extends DefaultBaseModule { + /** + * 通过 BAPI.main.nav 获取用户基本信息 + */ + private async getUserInfo(): Promise { + try { + const response = await BAPI.main.nav() + this.logger.log('BAPI.main.nav response', response) + if (response.code === 0) { + return Promise.resolve(response.data) + } else { + this.logger.error('获取用户信息失败', response.message) + return Promise.reject(response.message) + } + } catch (error) { + this.logger.error('获取用户信息出错', error) + return Promise.reject(error) + } + } + + public async run(): Promise { + const biliStore = useBiliStore() + biliStore.userInfo = await this.getUserInfo() + + setTimeout(async () => { + biliStore.userInfo = await this.getUserInfo() + }, delayToNextMoment(0, 4).ms) + } +} + +export default UserInfo diff --git a/src/modules/enhanceExperience/noSleep.ts b/src/modules/enhanceExperience/noSleep.ts index 2ec1cf93..bf7b8847 100644 --- a/src/modules/enhanceExperience/noSleep.ts +++ b/src/modules/enhanceExperience/noSleep.ts @@ -1,10 +1,9 @@ -import { onFrameTypes, runAtMoment } from '../../types/module' +import { runAtMoment } from '../../types/module' import BaseModule from '../BaseModule' class NoSleep extends BaseModule { static runMultiple: boolean = true static runAt: runAtMoment = 'window-load' - static onFrame: onFrameTypes = 'target' static runAfterDefault: boolean = false config = this.moduleStore.moduleConfig.EnhanceExperience.sleepDetection diff --git a/src/modules/enhanceExperience/switchLiveStreamQuality.ts b/src/modules/enhanceExperience/switchLiveStreamQuality.ts index 9d5da5ac..e14706f9 100644 --- a/src/modules/enhanceExperience/switchLiveStreamQuality.ts +++ b/src/modules/enhanceExperience/switchLiveStreamQuality.ts @@ -6,6 +6,7 @@ import BaseModule from '../BaseModule' class SwitchLiveStreamQuality extends BaseModule { static runMultiple: boolean = true static runAt: runAtMoment = 'window-load' + static runAfterDefault: boolean = false config = this.moduleStore.moduleConfig.EnhanceExperience.switchLiveStreamQuality diff --git a/src/stores/useModuleStore.ts b/src/stores/useModuleStore.ts index 5ddd510b..ba0bd3a4 100644 --- a/src/stores/useModuleStore.ts +++ b/src/stores/useModuleStore.ts @@ -45,8 +45,8 @@ const defaultModuleStatus: ImoduleStatus = { } } -// 早期(不确定当前 frame 是否是目标 frame 的时候)加载的模块名称 -const earlyLoadedModuleNames: string[] = [] +// 在所有 frame 上运行的被加载的模块名称 +const allFrameModuleNames: string[] = [] export const useModuleStore = defineStore('module', () => { // 所有模块的配置信息 @@ -60,7 +60,7 @@ export const useModuleStore = defineStore('module', () => { /** * 加载默认模块(该函数不导出) */ - async function loadDefaultModules(): Promise { + function loadDefaultModules(): Promise { const cacheStore = useCacheStore() const promiseArray: Promise[] = [] // 按优先级顺序逐个运行默认模块 @@ -69,12 +69,7 @@ export const useModuleStore = defineStore('module', () => { promiseArray.push(new (module as new (moduleName: string) => DefaultBaseModule)(name).run()) } } - try { - return Promise.all(promiseArray) - } catch (reason) { - new Logger('loadModules').error('加载默认模块时发生致命错误,挂机助手停止运行:', reason) - return Promise.reject(reason) - } + return Promise.all(promiseArray) } /** @@ -86,15 +81,20 @@ export const useModuleStore = defineStore('module', () => { */ function loadModules(isOnTargetFrame: isOnTargetFrameTypes) { const cacheStore = useCacheStore() + const logger = new Logger('ModuleStore_LoadModules') if (isOnTargetFrame === 'unknown') { for (const [name, module] of Object.entries(otherModules)) { if (module.onFrame === 'all') { if (module.runMultiple || !cacheStore.isMainBLTHRunning) { - waitForMoment(module.runAt).then(() => - new (module as new (moduleName: string) => BaseModule)(name).run() - ) - // 记录被加载的 onFrame 为 all 的模块名称 - earlyLoadedModuleNames.push(name) + if (!module.runAfterDefault) { + // 如果不需要等默认模块运行完了再运行,现在就加载并记录 + // 否则不做记录,等之后(isOnTargetFrame 为 yes时)再加载 + waitForMoment(module.runAt).then(() => + new (module as new (moduleName: string) => BaseModule)(name).run() + ) + // 记录被加载的 onFrame 为 all 的模块名称 + allFrameModuleNames.push(name) + } } } } @@ -104,7 +104,7 @@ export const useModuleStore = defineStore('module', () => { // 运行其它模块 for (const [name, module] of Object.entries(otherModules)) { // 对 onFrame 为 all 的模块来说,如果之前运行过,现在就不运行了 - if (!earlyLoadedModuleNames.includes(name)) { + if (!allFrameModuleNames.includes(name)) { if (module.runMultiple || !cacheStore.isMainBLTHRunning) { waitForMoment(module.runAt).then(async () => { try { @@ -115,6 +115,7 @@ export const useModuleStore = defineStore('module', () => { new (module as new (moduleName: string) => BaseModule)(name).run() } catch (e) { // 默认模块运行出错,不运行该模块 + logger.error(`运行默认模块时出错,模块${name}不运行`, e) } }) } diff --git a/src/types/cookies.d.ts b/src/types/cookies.d.ts index 88151e2b..d06ca3ba 100644 --- a/src/types/cookies.d.ts +++ b/src/types/cookies.d.ts @@ -1,5 +1,6 @@ interface IbiliCookies { bili_jct: string | null + LIVE_BUVID: string | null } export { IbiliCookies } diff --git a/src/types/module.d.ts b/src/types/module.d.ts index a1687595..1721e486 100644 --- a/src/types/module.d.ts +++ b/src/types/module.d.ts @@ -38,7 +38,7 @@ type onFrameTypes = 'all' | 'target' type isOnTargetFrameTypes = 'unknown' | 'yes' type moduleEmitterEvents = { - BiliInfo: { + UserInfo: { target: string } DailyTask_LiveTask_AppUserTask: { From d71f1f3e86383724566f6d4d25357521a89ff45a Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Tue, 5 Sep 2023 10:23:38 +0800 Subject: [PATCH 11/17] =?UTF-8?q?=F0=9F=8E=88=20perf:=20=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=8A=E6=8A=A5=E3=80=81=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E6=8C=82=E6=9C=BA=E6=A3=80=E6=B5=8B=E3=80=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E7=94=BB=E8=B4=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/library/dom/index.ts | 3 ++- src/main.ts | 2 +- src/modules/enhanceExperience/noReport.ts | 13 +++------ src/modules/enhanceExperience/noSleep.ts | 2 +- .../switchLiveStreamQuality.ts | 27 ++++--------------- 5 files changed, 12 insertions(+), 35 deletions(-) diff --git a/src/library/dom/index.ts b/src/library/dom/index.ts index fb70c54a..06530082 100644 --- a/src/library/dom/index.ts +++ b/src/library/dom/index.ts @@ -68,6 +68,7 @@ const isSelfTopFrame = (): boolean => unsafeWindow.self === unsafeWindow.top /** * 获取顶层 frame 的 documentElement */ -const topFrameDocuemntElement = (): HTMLElement | undefined => unsafeWindow.top?.document?.documentElement +const topFrameDocuemntElement = (): HTMLElement | undefined => + unsafeWindow.top?.document?.documentElement export { dq, dqa, dce, pollingQuery, isTargetFrame, isSelfTopFrame, topFrameDocuemntElement } diff --git a/src/main.ts b/src/main.ts index e5817f34..eaf2234f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -17,7 +17,7 @@ const logger = new Logger('Main') logger.log('document.readyState', document.readyState) const pinia = createPinia() -// 在 app.use(pinia) 之前要将 pinia 作为参数传入 + const cacheStore = useCacheStore(pinia) const moduleStore = useModuleStore(pinia) diff --git a/src/modules/enhanceExperience/noReport.ts b/src/modules/enhanceExperience/noReport.ts index 7ddb93c9..c311e0b0 100644 --- a/src/modules/enhanceExperience/noReport.ts +++ b/src/modules/enhanceExperience/noReport.ts @@ -31,7 +31,9 @@ class NoReport extends BaseModule { Object.defineProperties(win, { reportObserver: { get() { - return {} + return { + reportCustomData: function () {} + } }, set() {} }, @@ -78,15 +80,6 @@ class NoReport extends BaseModule { this.hookProperties(unsafeWindow) proxy(ajaxHookProxyConfig, unsafeWindow) fproxy(fetchHookConfig, unsafeWindow) - - // if (!isSelfTopFrame()) { - // // 如果处于特殊直播间(有多个frame),也拦截顶层frame的日志上报 - // // 但由于注入时机的关系,初期的一些日志报上拦截不到 - // // 要优化这一点的话可能要调整模块运行逻辑,允许模块在初期的时候就能在多个frame上允许 - // this.hookProperties(unsafeWindow.top as Window) - // proxy(ajaxHookProxyConfig, unsafeWindow.top as Window) - // fproxy(fetchHookConfig, unsafeWindow.top as Window) - // } } public async run() { diff --git a/src/modules/enhanceExperience/noSleep.ts b/src/modules/enhanceExperience/noSleep.ts index bf7b8847..fdbfcfdb 100644 --- a/src/modules/enhanceExperience/noSleep.ts +++ b/src/modules/enhanceExperience/noSleep.ts @@ -13,7 +13,7 @@ class NoSleep extends BaseModule { if (this.config.enabled) { setInterval(() => { document.dispatchEvent(new MouseEvent('mousemove')) - }, 3e5) + }, 3e5) // 5分钟 } } } diff --git a/src/modules/enhanceExperience/switchLiveStreamQuality.ts b/src/modules/enhanceExperience/switchLiveStreamQuality.ts index e14706f9..4279473f 100644 --- a/src/modules/enhanceExperience/switchLiveStreamQuality.ts +++ b/src/modules/enhanceExperience/switchLiveStreamQuality.ts @@ -46,29 +46,12 @@ class SwitchLiveStreamQuality extends BaseModule { this.logger.log(`已将画质切换为${this.config.qualityDesc}`, targetQuality) } } - - // 如果位于特殊直播间,等当前 iframe 中嵌套的最后一个 iframe 加载完再去切换画质就不会出现一直转圈的现象 - // 对于普通直播间来说,绝大多数情况下直接切换画质即可,但仍有小概率出现一直转圈的现象 - const iframes = document.querySelectorAll('iframe') - const lastIframe = iframes.item(iframes.length - 1) - - // 因为同源策略(same-origin policy)的关系,我们没法访问部分 iframe 的 document.readyState - // 只能完全依赖于 onload - // 因此设计了一个超时机制,超时了立刻切换画质 - const timer = setTimeout( - () => { - this.logger.log('等待最后一个iframe的load事件超时,立即切换画质') - lastIframe.onload = null - switchFn() - // 这里针对特殊直播间和普通直播间设置了两套超时时间,特殊直播间超时时间更长 - }, - !isSelfTopFrame() ? 3000 : 1500 + // 直接切换画质可能会有个加载中图标一直转圈,目前没有找到确切的最早可切换画质时机 + setTimeout( + () => switchFn(), + // 这里针对特殊直播间和普通直播间设置了两套超时时间,特殊直播间超时时间更长 + !isSelfTopFrame() ? 5000 : 2500 ) - - lastIframe.onload = () => { - clearTimeout(timer) - switchFn() - } } } From 35d81e48c7c47a29130419751677ce3f08de5fe8 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Tue, 5 Sep 2023 10:24:25 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=F0=9F=90=9E=20fix:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=90=8D=E5=8D=95=E4=B8=8D=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/LiveTasks.vue | 4 ++-- src/modules/default/fansMetals.ts | 5 +++++ src/types/module.d.ts | 6 +++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/LiveTasks.vue b/src/components/LiveTasks.vue index 38fa5bb3..88049e54 100644 --- a/src/components/LiveTasks.vue +++ b/src/components/LiveTasks.vue @@ -100,8 +100,8 @@ const handleEditList = () => { } }) // 利用 emitter 通知 BiliInfo 模块去获取数据 - moduleStore.emitter.emit('BiliInfo', { - target: 'getFansMetals' + moduleStore.emitter.emit('Default_FansMedals', { + module: 'LiveTasks' }) } else { initSelection(medalInfoTableData.value) diff --git a/src/modules/default/fansMetals.ts b/src/modules/default/fansMetals.ts index 9d43db26..7e1ee910 100644 --- a/src/modules/default/fansMetals.ts +++ b/src/modules/default/fansMetals.ts @@ -4,6 +4,7 @@ import { LiveData } from '../../library/bili-api/data' import DefaultBaseModule from '../DefaultBaseModule' import { delayToNextMoment, isTimestampToday } from '../../library/luxon' import { sleep } from '../../library/utils' +import { useModuleStore } from '../../stores/useModuleStore' class FansMetals extends DefaultBaseModule { /** @@ -70,6 +71,10 @@ class FansMetals extends DefaultBaseModule { setTimeout(async () => { biliStore.fansMedals = await this.getFansMetals() }, delayToNextMoment(0, 4).ms) + + useModuleStore().emitter.on('Default_FansMedals', async () => { + biliStore.fansMedals = await this.getFansMetals(10, true) + }) } } diff --git a/src/types/module.d.ts b/src/types/module.d.ts index 1721e486..ee4e85e2 100644 --- a/src/types/module.d.ts +++ b/src/types/module.d.ts @@ -38,12 +38,12 @@ type onFrameTypes = 'all' | 'target' type isOnTargetFrameTypes = 'unknown' | 'yes' type moduleEmitterEvents = { - UserInfo: { - target: string - } DailyTask_LiveTask_AppUserTask: { module: string } + Default_FansMedals: { + module: string + } } export { From 3ae685d23d3d8e6e6fc4334ed64713a1858e19f4 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Tue, 5 Sep 2023 10:24:36 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=F0=9F=8C=88=20style:=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/library/ajax-hook/index.d.ts | 138 ++++++----- src/library/ajax-hook/index.js | 4 +- src/library/ajax-hook/src/xhr-hook.js | 92 +++---- src/library/ajax-hook/src/xhr-proxy.js | 330 +++++++++++++------------ 4 files changed, 295 insertions(+), 269 deletions(-) diff --git a/src/library/ajax-hook/index.d.ts b/src/library/ajax-hook/index.d.ts index d1e9024b..919a1d81 100644 --- a/src/library/ajax-hook/index.d.ts +++ b/src/library/ajax-hook/index.d.ts @@ -1,81 +1,94 @@ interface XMLHttpRequestProxy extends XMLHttpRequest { - responseText: string, - readyState: number; - response: any; - responseURL: string; - responseXML: Document | null; - status: number; - statusText: string; + responseText: string + readyState: number + response: any + responseURL: string + responseXML: Document | null + status: number + statusText: string xhr: OriginXMLHttpRequest } interface OriginXMLHttpRequest extends XMLHttpRequest { - getProxy(): XMLHttpRequestProxy; + getProxy(): XMLHttpRequestProxy } interface AttrGetterAndSetter { - getter?: (value: T, xhr: OriginXMLHttpRequest) => T; - setter?: (value: T, xhr: OriginXMLHttpRequest) => T; + getter?: (value: T, xhr: OriginXMLHttpRequest) => T + setter?: (value: T, xhr: OriginXMLHttpRequest) => T } interface XhrRequestConfig { - method: string, - url: string, - headers: any, - body: any, - async: boolean, - user: string, - password: string, + method: string + url: string + headers: any + body: any + async: boolean + user: string + password: string withCredentials: boolean - xhr: OriginXMLHttpRequest, + xhr: OriginXMLHttpRequest } interface XhrResponse { - config: XhrRequestConfig, - headers: any, - response: any, - status: number, - statusText?: string, + config: XhrRequestConfig + headers: any + response: any + status: number + statusText?: string } type XhrErrorType = 'error' | 'timeout' | 'abort' - interface XhrError { - config: XhrRequestConfig, + config: XhrRequestConfig type: XhrErrorType } interface Hooks { - onreadystatechange?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - onabort?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - onerror?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - onload?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - onloadend?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - onloadstart?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - onprogress?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - ontimeout?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null; - abort?: ((args: Array, xhr: OriginXMLHttpRequest) => any); - getAllResponseHeaders?: (args: Array, xhr: OriginXMLHttpRequest) => any; - getResponseHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any; - open?: (args: Array, xhr: OriginXMLHttpRequest) => any; - overrideMimeType?: (args: Array, xhr: OriginXMLHttpRequest) => any; - send?: (args: Array, xhr: OriginXMLHttpRequest) => any; - setRequestHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any; - addEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any; - removeEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any; - - response?: AttrGetterAndSetter, - responseText?: AttrGetterAndSetter, - readyState?: AttrGetterAndSetter, - responseType?: AttrGetterAndSetter; - responseURL?: AttrGetterAndSetter; - responseXML?: AttrGetterAndSetter; - status?: AttrGetterAndSetter; - statusText?: AttrGetterAndSetter; - timeout?: AttrGetterAndSetter; - upload?: AttrGetterAndSetter; - withCredentials?: AttrGetterAndSetter; + onreadystatechange?: + | ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) + | null + onabort?: + | ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) + | null + onerror?: + | ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) + | null + onload?: ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) | null + onloadend?: + | ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) + | null + onloadstart?: + | ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) + | null + onprogress?: + | ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) + | null + ontimeout?: + | ((this: XMLHttpRequestProxy, xhr: OriginXMLHttpRequest, ev: ProgressEvent) => any) + | null + abort?: (args: Array, xhr: OriginXMLHttpRequest) => any + getAllResponseHeaders?: (args: Array, xhr: OriginXMLHttpRequest) => any + getResponseHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any + open?: (args: Array, xhr: OriginXMLHttpRequest) => any + overrideMimeType?: (args: Array, xhr: OriginXMLHttpRequest) => any + send?: (args: Array, xhr: OriginXMLHttpRequest) => any + setRequestHeader?: (args: Array, xhr: OriginXMLHttpRequest) => any + addEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any + removeEventListener?: (args: Array, xhr: OriginXMLHttpRequest) => any + + response?: AttrGetterAndSetter + responseText?: AttrGetterAndSetter + readyState?: AttrGetterAndSetter + responseType?: AttrGetterAndSetter + responseURL?: AttrGetterAndSetter + responseXML?: AttrGetterAndSetter + status?: AttrGetterAndSetter + statusText?: AttrGetterAndSetter + timeout?: AttrGetterAndSetter + upload?: AttrGetterAndSetter + withCredentials?: AttrGetterAndSetter } interface XhrHandler { @@ -97,15 +110,18 @@ interface XhrErrorHandler extends XhrHandler { } interface Proxy { - onRequest?: (config: XhrRequestConfig, handler: XhrRequestHandler) => void, - onResponse?: (response: XhrResponse, handler: XhrResponseHandler) => void, - onError?: (err: XhrError, handler: XhrErrorHandler) => void, + onRequest?: (config: XhrRequestConfig, handler: XhrRequestHandler) => void + onResponse?: (response: XhrResponse, handler: XhrResponseHandler) => void + onError?: (err: XhrError, handler: XhrErrorHandler) => void } -export function proxy(proxy: Proxy, win?: Window): { originXhr: XMLHttpRequest, unProxy: () => void }; +export function proxy( + proxy: Proxy, + win?: Window +): { originXhr: XMLHttpRequest; unProxy: () => void } -export function unProxy(win?: Window); +export function unProxy(win?: Window) -export function hook(hooks: Hooks,win?: Window): { originXhr: XMLHttpRequest, unHook: () => void }; +export function hook(hooks: Hooks, win?: Window): { originXhr: XMLHttpRequest; unHook: () => void } -export function unHook(win?: Window); +export function unHook(win?: Window) diff --git a/src/library/ajax-hook/index.js b/src/library/ajax-hook/index.js index 699ad8cb..4e8e517e 100644 --- a/src/library/ajax-hook/index.js +++ b/src/library/ajax-hook/index.js @@ -3,8 +3,8 @@ * email: 824783146@qq.com * source code: https://github.com/wendux/Ajax-hook **/ -export { hook } from "./src/xhr-hook" -export { proxy } from "./src/xhr-proxy" +export { hook } from './src/xhr-hook' +export { proxy } from './src/xhr-proxy' // 因为原版的ajax-hook存在一个bug,https://github.com/wendux/ajax-hook/pull/122 // 所以暂时先使用 https://github.com/cyfung1031 修改后的版本 diff --git a/src/library/ajax-hook/src/xhr-hook.js b/src/library/ajax-hook/src/xhr-hook.js index 992df56e..905c0036 100644 --- a/src/library/ajax-hook/src/xhr-hook.js +++ b/src/library/ajax-hook/src/xhr-hook.js @@ -4,72 +4,77 @@ * source code: https://github.com/wendux/Ajax-hook */ -export var events = ['load', 'loadend', 'timeout', 'error', 'readystatechange', 'abort']; +export var events = ['load', 'loadend', 'timeout', 'error', 'readystatechange', 'abort'] -var OriginXhr = '__origin_xhr'; +var OriginXhr = '__origin_xhr' export function configEvent(event, xhrProxy) { - var e = {}; - for (var attr in event) e[attr] = event[attr]; + var e = {} + for (var attr in event) e[attr] = event[attr] // xhrProxy instead e.target = e.currentTarget = xhrProxy - return e; + return e } export function hook(proxy, win) { - win = win || window; - var originXhr = win.XMLHttpRequest; + win = win || window + var originXhr = win.XMLHttpRequest var HookXMLHttpRequest = function () { // We shouldn't hookAjax XMLHttpRequest.prototype because we can't // guarantee that all attributes are on the prototype。 // Instead, hooking XMLHttpRequest instance can avoid this problem. - var xhr = new originXhr(); + var xhr = new originXhr() // Generate all callbacks(eg. onload) are enumerable (not undefined). for (var i = 0; i < events.length; ++i) { - var key='on'+events[i]; - if (xhr[key] === undefined) xhr[key] = null; + var key = 'on' + events[i] + if (xhr[key] === undefined) xhr[key] = null } for (var attr in xhr) { - var type = ""; + var type = '' try { type = typeof xhr[attr] // May cause exception on some browser - } catch (e) { - } - if (type === "function") { + } catch (e) {} + if (type === 'function') { // hookAjax methods of xhr, such as `open`、`send` ... - this[attr] = hookFunction(attr); + this[attr] = hookFunction(attr) } else if (attr !== OriginXhr) { Object.defineProperty(this, attr, { get: getterFactory(attr), set: setterFactory(attr), enumerable: true - }) + }) } } - var that = this; + var that = this xhr.getProxy = function () { return that } - this[OriginXhr] = xhr; + this[OriginXhr] = xhr } - HookXMLHttpRequest.prototype = originXhr.prototype; - HookXMLHttpRequest.prototype.constructor = HookXMLHttpRequest; + HookXMLHttpRequest.prototype = originXhr.prototype + HookXMLHttpRequest.prototype.constructor = HookXMLHttpRequest - win.XMLHttpRequest = HookXMLHttpRequest; + win.XMLHttpRequest = HookXMLHttpRequest - Object.assign(win.XMLHttpRequest, {UNSENT: 0, OPENED: 1, HEADERS_RECEIVED: 2, LOADING: 3, DONE: 4}); + Object.assign(win.XMLHttpRequest, { + UNSENT: 0, + OPENED: 1, + HEADERS_RECEIVED: 2, + LOADING: 3, + DONE: 4 + }) // Generate getter for attributes of xhr function getterFactory(attr) { return function () { - var v = this.hasOwnProperty(attr + "_") ? this[attr + "_"] : this[OriginXhr][attr]; - var attrGetterHook = (proxy[attr] || {})["getter"]; - return attrGetterHook && attrGetterHook(v, this) || v; + var v = this.hasOwnProperty(attr + '_') ? this[attr + '_'] : this[OriginXhr][attr] + var attrGetterHook = (proxy[attr] || {})['getter'] + return (attrGetterHook && attrGetterHook(v, this)) || v } } @@ -77,27 +82,26 @@ export function hook(proxy, win) { // to hookAjax event callbacks (eg: `onload`) of xhr; function setterFactory(attr) { return function (v) { - var xhr = this[OriginXhr]; - var that = this; - var hook = proxy[attr]; + var xhr = this[OriginXhr] + var that = this + var hook = proxy[attr] // hookAjax event callbacks such as `onload`、`onreadystatechange`... if (attr.substring(0, 2) === 'on') { - that[attr + "_"] = v; + that[attr + '_'] = v xhr[attr] = function (e) { e = configEvent(e, that) var ret = proxy[attr] && proxy[attr].call(that, xhr, e) - ret || v.call(that, e); + ret || v.call(that, e) } } else { //If the attribute isn't writable, generate proxy attribute - var attrSetterHook = (hook || {})["setter"]; - v = attrSetterHook && attrSetterHook(v, that) || v - this[attr + "_"] = v; + var attrSetterHook = (hook || {})['setter'] + v = (attrSetterHook && attrSetterHook(v, that)) || v + this[attr + '_'] = v try { // Not all attributes of xhr are writable(setter may undefined). - xhr[attr] = v; - } catch (e) { - } + xhr[attr] = v + } catch (e) {} } } } @@ -105,25 +109,23 @@ export function hook(proxy, win) { // Hook methods of xhr. function hookFunction(fun) { return function () { - var args = [].slice.call(arguments); + var args = [].slice.call(arguments) if (proxy[fun]) { var ret = proxy[fun].call(this, args, this[OriginXhr]) // If the proxy return value exists, return it directly, // otherwise call the function of xhr. - if (ret) return ret; + if (ret) return ret } - return this[OriginXhr][fun].apply(this[OriginXhr], args); + return this[OriginXhr][fun].apply(this[OriginXhr], args) } } function unHook() { - win.XMLHttpRequest = originXhr; - HookXMLHttpRequest.prototype.constructor = originXhr; - originXhr = undefined; + win.XMLHttpRequest = originXhr + HookXMLHttpRequest.prototype.constructor = originXhr + originXhr = undefined } // Return the real XMLHttpRequest and unHook func - return { originXhr, unHook }; + return { originXhr, unHook } } - - diff --git a/src/library/ajax-hook/src/xhr-proxy.js b/src/library/ajax-hook/src/xhr-proxy.js index 57d769e2..e24d44af 100644 --- a/src/library/ajax-hook/src/xhr-proxy.js +++ b/src/library/ajax-hook/src/xhr-proxy.js @@ -4,268 +4,276 @@ * source code: https://github.com/wendux/Ajax-hook */ -import {hook, configEvent, events} from "./xhr-hook"; +import { hook, configEvent, events } from './xhr-hook' var eventLoad = events[0], eventLoadEnd = events[1], eventTimeout = events[2], eventError = events[3], eventReadyStateChange = events[4], - eventAbort = events[5]; - - -var prototype = 'prototype'; + eventAbort = events[5] +var prototype = 'prototype' export function proxy(proxy, win) { - win = win || window; - return proxyAjax(proxy, win); + win = win || window + return proxyAjax(proxy, win) } function trim(str) { - return str.replace(/^\s+|\s+$/g, ''); + return str.replace(/^\s+|\s+$/g, '') } function getEventTarget(xhr) { - return xhr.watcher || (xhr.watcher = document.createElement('a')); + return xhr.watcher || (xhr.watcher = document.createElement('a')) } function triggerListener(xhr, name) { - var xhrProxy = xhr.getProxy(); - var callback = 'on' + name + '_'; - var event = configEvent({type: name}, xhrProxy); - xhrProxy[callback] && xhrProxy[callback](event); - var evt; - if (typeof(Event) === 'function') { - evt = new Event(name, {bubbles: false}); + var xhrProxy = xhr.getProxy() + var callback = 'on' + name + '_' + var event = configEvent({ type: name }, xhrProxy) + xhrProxy[callback] && xhrProxy[callback](event) + var evt + if (typeof Event === 'function') { + evt = new Event(name, { bubbles: false }) } else { // https://stackoverflow.com/questions/27176983/dispatchevent-not-working-in-ie11 - evt = document.createEvent('Event'); - evt.initEvent(name, false, true); + evt = document.createEvent('Event') + evt.initEvent(name, false, true) } - getEventTarget(xhr).dispatchEvent(evt); + getEventTarget(xhr).dispatchEvent(evt) } - function Handler(xhr) { - this.xhr = xhr; - this.xhrProxy = xhr.getProxy(); + this.xhr = xhr + this.xhrProxy = xhr.getProxy() } Handler[prototype] = Object.create({ resolve: function resolve(response) { - var xhrProxy = this.xhrProxy; - var xhr = this.xhr; - xhrProxy.readyState = 4; - xhr.resHeader = response.headers; - xhrProxy.response = xhrProxy.responseText = response.response; - xhrProxy.statusText = response.statusText; - xhrProxy.status = response.status; - triggerListener(xhr, eventReadyStateChange); - triggerListener(xhr, eventLoad); - triggerListener(xhr, eventLoadEnd); + var xhrProxy = this.xhrProxy + var xhr = this.xhr + xhrProxy.readyState = 4 + xhr.resHeader = response.headers + xhrProxy.response = xhrProxy.responseText = response.response + xhrProxy.statusText = response.statusText + xhrProxy.status = response.status + triggerListener(xhr, eventReadyStateChange) + triggerListener(xhr, eventLoad) + triggerListener(xhr, eventLoadEnd) }, reject: function reject(error) { - this.xhrProxy.status = 0; - triggerListener(this.xhr, error.type); - triggerListener(this.xhr, eventLoadEnd); + this.xhrProxy.status = 0 + triggerListener(this.xhr, error.type) + triggerListener(this.xhr, eventLoadEnd) } -}); +}) function makeHandler(next) { function sub(xhr) { - Handler.call(this, xhr); + Handler.call(this, xhr) } - sub[prototype] = Object.create(Handler[prototype]); + sub[prototype] = Object.create(Handler[prototype]) sub[prototype].next = next - return sub; + return sub } var RequestHandler = makeHandler(function (rq) { - var xhr = this.xhr; - rq = rq || xhr.config; - xhr.withCredentials = rq.withCredentials; - xhr.open(rq.method, rq.url, rq.async !== false, rq.user, rq.password); + var xhr = this.xhr + rq = rq || xhr.config + xhr.withCredentials = rq.withCredentials + xhr.open(rq.method, rq.url, rq.async !== false, rq.user, rq.password) for (var key in rq.headers) { - xhr.setRequestHeader(key, rq.headers[key]); + xhr.setRequestHeader(key, rq.headers[key]) } - xhr.send(rq.body); -}); + xhr.send(rq.body) +}) var ResponseHandler = makeHandler(function (response) { - this.resolve(response); -}); + this.resolve(response) +}) var ErrorHandler = makeHandler(function (error) { - this.reject(error); -}); + this.reject(error) +}) function proxyAjax(proxy, win) { var onRequest = proxy.onRequest, onResponse = proxy.onResponse, - onError = proxy.onError; + onError = proxy.onError function handleResponse(xhr, xhrProxy) { - var handler = new ResponseHandler(xhr); + var handler = new ResponseHandler(xhr) var getResponseData = function () { // object getter is part of ES5 // getter to avoid uncessary processing. only proceed if response.response is called. // property 'response' is enumerable such that JSON.stringify(response) contains response - var responseType = xhrProxy.responseType; + var responseType = xhrProxy.responseType if (!responseType || responseType === 'text') { - return xhrProxy.responseText; + return xhrProxy.responseText } // reference: https://shanabrian.com/web/html-css-js-technics/js-ie10-ie11-xhr-json-string.php // reference: https://github.com/axios/axios/issues/2390 // json - W3C standard - xhrProxy.response = JSON object; responseText is unobtainable // For details, see https://github.com/wendux/ajax-hook/issues/117 // IE 9, 10 & 11 - only responseText - if (responseType === 'json' && typeof JSON === 'object' && ((navigator || 0).userAgent || '').indexOf('Trident') !== -1) { - return JSON.parse(xhrProxy.responseText); + if ( + responseType === 'json' && + typeof JSON === 'object' && + ((navigator || 0).userAgent || '').indexOf('Trident') !== -1 + ) { + return JSON.parse(xhrProxy.responseText) } - return xhrProxy.response; - }; //ie9 - var responseData; + return xhrProxy.response + } //ie9 + var responseData var ret = { get response() { if (getResponseData) { - responseData = getResponseData(); - getResponseData = null; + responseData = getResponseData() + getResponseData = null } - return responseData; + return responseData }, set response(nv) { - getResponseData = null; - responseData = nv; - return true; + getResponseData = null + responseData = nv + return true }, status: xhrProxy.status, statusText: xhrProxy.statusText, config: xhr.config, - headers: xhr.resHeader || xhr.getAllResponseHeaders().split('\r\n').reduce(function (ob, str) { - if (str === "") return ob; - var m = str.split(":"); - ob[m.shift()] = trim(m.join(':')); - return ob; - }, {}) - }; - if (!onResponse) return handler.resolve(ret); - onResponse(ret, handler); + headers: + xhr.resHeader || + xhr + .getAllResponseHeaders() + .split('\r\n') + .reduce(function (ob, str) { + if (str === '') return ob + var m = str.split(':') + ob[m.shift()] = trim(m.join(':')) + return ob + }, {}) + } + if (!onResponse) return handler.resolve(ret) + onResponse(ret, handler) } function onerror(xhr, xhrProxy, error, errorType) { - var handler = new ErrorHandler(xhr); - error = {config: xhr.config, error: error, type: errorType}; + var handler = new ErrorHandler(xhr) + error = { config: xhr.config, error: error, type: errorType } if (onError) { - onError(error, handler); + onError(error, handler) } else { - handler.next(error); + handler.next(error) } } function preventXhrProxyCallback() { - return true; + return true } function errorCallback(errorType) { return function (xhr, e) { - onerror(xhr, this, e, errorType); - return true; + onerror(xhr, this, e, errorType) + return true } } function stateChangeCallback(xhr, xhrProxy) { if (xhr.readyState === 4 && xhr.status !== 0) { - handleResponse(xhr, xhrProxy); + handleResponse(xhr, xhrProxy) } else if (xhr.readyState !== 4) { - triggerListener(xhr, eventReadyStateChange); + triggerListener(xhr, eventReadyStateChange) } - return true; + return true } + var { originXhr, unHook } = hook( + { + onload: preventXhrProxyCallback, + onloadend: preventXhrProxyCallback, + onerror: errorCallback(eventError), + ontimeout: errorCallback(eventTimeout), + onabort: errorCallback(eventAbort), + onreadystatechange: function (xhr) { + return stateChangeCallback(xhr, this) + }, + open: function open(args, xhr) { + var _this = this + var config = (xhr.config = { headers: {} }) + config.method = args[0] + config.url = args[1] + config.async = args[2] + config.user = args[3] + config.password = args[4] + config.xhr = xhr + var evName = 'on' + eventReadyStateChange + if (!xhr[evName]) { + xhr[evName] = function () { + return stateChangeCallback(xhr, _this) + } + } - var { originXhr, unHook } = hook({ - onload: preventXhrProxyCallback, - onloadend: preventXhrProxyCallback, - onerror: errorCallback(eventError), - ontimeout: errorCallback(eventTimeout), - onabort: errorCallback(eventAbort), - onreadystatechange: function (xhr) { - return stateChangeCallback(xhr, this); - }, - open: function open(args, xhr) { - var _this = this; - var config = xhr.config = {headers: {}}; - config.method = args[0]; - config.url = args[1]; - config.async = args[2]; - config.user = args[3]; - config.password = args[4]; - config.xhr = xhr; - var evName = 'on' + eventReadyStateChange; - if (!xhr[evName]) { - xhr[evName] = function () { - return stateChangeCallback(xhr, _this); - }; - } - - // 如果有请求拦截器,则在调用onRequest后再打开链接。因为onRequest最佳调用时机是在send前, - // 所以我们在send拦截函数中再手动调用open,因此返回true阻止xhr.open调用。 - // - // 如果没有请求拦截器,则不用阻断xhr.open调用 - if (onRequest) return true; - }, - send: function (args, xhr) { - var config = xhr.config - config.withCredentials = xhr.withCredentials - config.body = args[0]; - if (onRequest) { - // In 'onRequest', we may call XHR's event handler, such as `xhr.onload`. - // However, XHR's event handler may not be set until xhr.send is called in - // the user's code, so we use `setTimeout` to avoid this situation - var req = function () { - onRequest(config, new RequestHandler(xhr)); + // 如果有请求拦截器,则在调用onRequest后再打开链接。因为onRequest最佳调用时机是在send前, + // 所以我们在send拦截函数中再手动调用open,因此返回true阻止xhr.open调用。 + // + // 如果没有请求拦截器,则不用阻断xhr.open调用 + if (onRequest) return true + }, + send: function (args, xhr) { + var config = xhr.config + config.withCredentials = xhr.withCredentials + config.body = args[0] + if (onRequest) { + // In 'onRequest', we may call XHR's event handler, such as `xhr.onload`. + // However, XHR's event handler may not be set until xhr.send is called in + // the user's code, so we use `setTimeout` to avoid this situation + var req = function () { + onRequest(config, new RequestHandler(xhr)) + } + config.async === false ? req() : setTimeout(req) + return true } - config.async === false ? req() : setTimeout(req) - return true; - } - }, - setRequestHeader: function (args, xhr) { - // Collect request headers - xhr.config.headers[args[0].toLowerCase()] = args[1]; - if (onRequest) return true; - }, - addEventListener: function (args, xhr) { - var _this = this; - if (events.indexOf(args[0]) !== -1) { - var handler = args[1]; - getEventTarget(xhr).addEventListener(args[0], function (e) { - var event = configEvent(e, _this); - event.type = args[0]; - event.isTrusted = true; - handler.call(_this, event); - }); - return true; - } - }, - getAllResponseHeaders: function (_, xhr) { - var headers = xhr.resHeader - if (headers) { - var header = ""; - for (var key in headers) { - header += key + ': ' + headers[key] + '\r\n'; + }, + setRequestHeader: function (args, xhr) { + // Collect request headers + xhr.config.headers[args[0].toLowerCase()] = args[1] + if (onRequest) return true + }, + addEventListener: function (args, xhr) { + var _this = this + if (events.indexOf(args[0]) !== -1) { + var handler = args[1] + getEventTarget(xhr).addEventListener(args[0], function (e) { + var event = configEvent(e, _this) + event.type = args[0] + event.isTrusted = true + handler.call(_this, event) + }) + return true + } + }, + getAllResponseHeaders: function (_, xhr) { + var headers = xhr.resHeader + if (headers) { + var header = '' + for (var key in headers) { + header += key + ': ' + headers[key] + '\r\n' + } + return header + } + }, + getResponseHeader: function (args, xhr) { + var headers = xhr.resHeader + if (headers) { + return headers[(args[0] || '').toLowerCase()] } - return header; } }, - getResponseHeader: function (args, xhr) { - var headers = xhr.resHeader - if (headers) { - return headers[(args[0] || '').toLowerCase()]; - } - } - }, win); + win + ) return { originXhr, From f6543e13762ef3b98a666c9f6eabe44f0753810f Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Tue, 5 Sep 2023 16:35:56 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=F0=9F=90=B3=20chore:=20npm=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 947 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 625 insertions(+), 324 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d285d52..250066ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bilibili-live-tasks-helper", - "version": "7.1.0", + "version": "7.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bilibili-live-tasks-helper", - "version": "7.1.0", + "version": "7.1.1", "dependencies": { "ajax-hook": "^3.0.1", "crypto-js": "^4.1.1", @@ -40,7 +40,7 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, "engines": { @@ -48,9 +48,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.14", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.14.tgz", - "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", + "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -60,7 +60,7 @@ }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", - "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", "engines": { "node": ">=10" @@ -68,7 +68,7 @@ }, "node_modules/@element-plus/icons-vue": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", "peerDependencies": { "vue": "^3.2.0" @@ -76,7 +76,7 @@ }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" @@ -92,7 +92,7 @@ }, "node_modules/@esbuild/android-arm64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" @@ -108,7 +108,7 @@ }, "node_modules/@esbuild/android-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" @@ -124,7 +124,7 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" @@ -140,7 +140,7 @@ }, "node_modules/@esbuild/darwin-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" @@ -156,7 +156,7 @@ }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" @@ -172,7 +172,7 @@ }, "node_modules/@esbuild/freebsd-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" @@ -188,7 +188,7 @@ }, "node_modules/@esbuild/linux-arm": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" @@ -204,7 +204,7 @@ }, "node_modules/@esbuild/linux-arm64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ "arm64" @@ -220,7 +220,7 @@ }, "node_modules/@esbuild/linux-ia32": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" @@ -236,7 +236,7 @@ }, "node_modules/@esbuild/linux-loong64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" @@ -252,7 +252,7 @@ }, "node_modules/@esbuild/linux-mips64el": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" @@ -268,7 +268,7 @@ }, "node_modules/@esbuild/linux-ppc64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" @@ -284,7 +284,7 @@ }, "node_modules/@esbuild/linux-riscv64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" @@ -300,7 +300,7 @@ }, "node_modules/@esbuild/linux-s390x": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" @@ -316,7 +316,7 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" @@ -332,7 +332,7 @@ }, "node_modules/@esbuild/netbsd-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" @@ -348,7 +348,7 @@ }, "node_modules/@esbuild/openbsd-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ "x64" @@ -364,7 +364,7 @@ }, "node_modules/@esbuild/sunos-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" @@ -380,7 +380,7 @@ }, "node_modules/@esbuild/win32-arm64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" @@ -396,7 +396,7 @@ }, "node_modules/@esbuild/win32-ia32": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" @@ -412,7 +412,7 @@ }, "node_modules/@esbuild/win32-x64": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" @@ -428,7 +428,7 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { @@ -443,7 +443,7 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.8.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { @@ -452,7 +452,7 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { @@ -468,11 +468,14 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { "version": "8.48.0", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.48.0.tgz", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { @@ -481,7 +484,7 @@ }, "node_modules/@floating-ui/core": { "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", "dependencies": { "@floating-ui/utils": "^0.1.1" @@ -489,7 +492,7 @@ }, "node_modules/@floating-ui/dom": { "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.5.1.tgz", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", "dependencies": { "@floating-ui/core": "^1.4.1", @@ -498,12 +501,12 @@ }, "node_modules/@floating-ui/utils": { "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { @@ -517,22 +520,26 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { @@ -546,7 +553,7 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { @@ -555,7 +562,7 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { @@ -564,7 +571,7 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { @@ -574,12 +581,12 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.19", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { @@ -589,7 +596,7 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { @@ -602,7 +609,7 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { @@ -611,7 +618,7 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { @@ -624,7 +631,7 @@ }, "node_modules/@pkgr/utils": { "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/@pkgr/utils/-/utils-2.4.2.tgz", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", "dev": true, "dependencies": { @@ -637,23 +644,30 @@ }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/@popperjs/core": { "name": "@sxzz/popperjs-es", "version": "2.11.7", - "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } }, "node_modules/@rushstack/eslint-patch": { "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz", "integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==", "dev": true }, "node_modules/@trysound/sax": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, "engines": { @@ -661,25 +675,25 @@ } }, "node_modules/@types/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.2.tgz", + "integrity": "sha512-t33RNmTu5ufG/sorROIafiCVJMx3jz95bXUMoPAZcUD14fxMXnuTzqzXZoxpR0tNx2xpw11Dlmem9vGCsrSOfA==", "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.12", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/lodash": { "version": "4.14.197", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.197.tgz", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==" }, "node_modules/@types/lodash-es": { "version": "4.17.9", - "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.9.tgz", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.9.tgz", "integrity": "sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==", "dependencies": { "@types/lodash": "*" @@ -687,24 +701,24 @@ }, "node_modules/@types/luxon": { "version": "3.3.2", - "resolved": "https://registry.npmmirror.com/@types/luxon/-/luxon-3.3.2.tgz", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==", "dev": true }, "node_modules/@types/semver": { "version": "7.5.1", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.1.tgz", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", "dev": true }, "node_modules/@types/web-bluetooth": { "version": "0.0.16", - "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { @@ -722,6 +736,10 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { "@typescript-eslint/parser": "^5.0.0", "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -734,7 +752,7 @@ }, "node_modules/@typescript-eslint/parser": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { @@ -746,6 +764,10 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, @@ -757,7 +779,7 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { @@ -766,11 +788,15 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/type-utils": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { @@ -782,6 +808,10 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { "eslint": "*" }, @@ -793,16 +823,20 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { @@ -817,6 +851,10 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -825,7 +863,7 @@ }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { @@ -841,13 +879,17 @@ "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { @@ -856,11 +898,15 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@vitejs/plugin-vue": { "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz", "integrity": "sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==", "dev": true, "engines": { @@ -873,7 +919,7 @@ }, "node_modules/@volar/language-core": { "version": "1.10.1", - "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.10.1.tgz", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.1.tgz", "integrity": "sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==", "dev": true, "dependencies": { @@ -882,7 +928,7 @@ }, "node_modules/@volar/source-map": { "version": "1.10.1", - "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.10.1.tgz", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.1.tgz", "integrity": "sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==", "dev": true, "dependencies": { @@ -891,7 +937,7 @@ }, "node_modules/@volar/typescript": { "version": "1.10.1", - "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.10.1.tgz", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.1.tgz", "integrity": "sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==", "dev": true, "dependencies": { @@ -900,7 +946,7 @@ }, "node_modules/@vue/compiler-core": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "dependencies": { "@babel/parser": "^7.21.3", @@ -911,7 +957,7 @@ }, "node_modules/@vue/compiler-dom": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "dependencies": { "@vue/compiler-core": "3.3.4", @@ -920,7 +966,7 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", "dependencies": { "@babel/parser": "^7.20.15", @@ -937,7 +983,7 @@ }, "node_modules/@vue/compiler-ssr": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "dependencies": { "@vue/compiler-dom": "3.3.4", @@ -946,12 +992,12 @@ }, "node_modules/@vue/devtools-api": { "version": "6.5.0", - "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "node_modules/@vue/eslint-config-prettier": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz", "integrity": "sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==", "dev": true, "dependencies": { @@ -965,7 +1011,7 @@ }, "node_modules/@vue/eslint-config-typescript": { "version": "11.0.3", - "resolved": "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", "dev": true, "dependencies": { @@ -989,7 +1035,7 @@ }, "node_modules/@vue/language-core": { "version": "1.8.8", - "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.8.tgz", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.8.tgz", "integrity": "sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==", "dev": true, "dependencies": { @@ -1013,7 +1059,7 @@ }, "node_modules/@vue/language-core/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { @@ -1022,7 +1068,7 @@ }, "node_modules/@vue/language-core/node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { @@ -1030,11 +1076,14 @@ }, "engines": { "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@vue/reactivity": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "dependencies": { "@vue/shared": "3.3.4" @@ -1042,7 +1091,7 @@ }, "node_modules/@vue/reactivity-transform": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "dependencies": { "@babel/parser": "^7.20.15", @@ -1054,7 +1103,7 @@ }, "node_modules/@vue/runtime-core": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", "dependencies": { "@vue/reactivity": "3.3.4", @@ -1063,7 +1112,7 @@ }, "node_modules/@vue/runtime-dom": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "dependencies": { "@vue/runtime-core": "3.3.4", @@ -1073,7 +1122,7 @@ }, "node_modules/@vue/server-renderer": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "dependencies": { "@vue/compiler-ssr": "3.3.4", @@ -1085,18 +1134,18 @@ }, "node_modules/@vue/shared": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, "node_modules/@vue/tsconfig": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", "dev": true }, "node_modules/@vue/typescript": { "version": "1.8.8", - "resolved": "https://registry.npmmirror.com/@vue/typescript/-/typescript-1.8.8.tgz", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.8.tgz", "integrity": "sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==", "dev": true, "dependencies": { @@ -1106,18 +1155,21 @@ }, "node_modules/@vueuse/core": { "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", "dependencies": { "@types/web-bluetooth": "^0.0.16", "@vueuse/metadata": "9.13.0", "@vueuse/shared": "9.13.0", "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { "version": "0.14.6", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", "hasInstallScript": true, "bin": { @@ -1127,6 +1179,9 @@ "engines": { "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" @@ -1139,20 +1194,26 @@ }, "node_modules/@vueuse/metadata": { "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, "node_modules/@vueuse/shared": { "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", "dependencies": { "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { "version": "0.14.6", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", "hasInstallScript": true, "bin": { @@ -1162,6 +1223,9 @@ "engines": { "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" @@ -1174,7 +1238,7 @@ }, "node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { @@ -1186,7 +1250,7 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { @@ -1195,7 +1259,7 @@ }, "node_modules/acorn-walk": { "version": "8.2.0", - "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { @@ -1204,7 +1268,7 @@ }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, "engines": { @@ -1213,12 +1277,12 @@ }, "node_modules/ajax-hook": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/ajax-hook/-/ajax-hook-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/ajax-hook/-/ajax-hook-3.0.2.tgz", "integrity": "sha512-YXI42oQ66s/zbAzNKaNhobTAV7tJ6VYYqBiLZKq11OKwFqT10RuZUrMiLsbgCxsANOVojSHdJgjP7PHWOFyVcw==" }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { @@ -1226,11 +1290,15 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { @@ -1239,7 +1307,7 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { @@ -1247,17 +1315,20 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { @@ -1266,18 +1337,18 @@ }, "node_modules/async-validator": { "version": "4.2.5", - "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/big-integer": { "version": "1.6.51", - "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true, "engines": { @@ -1286,13 +1357,13 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "node_modules/bplist-parser": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, "dependencies": { @@ -1304,7 +1375,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { @@ -1314,7 +1385,7 @@ }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { @@ -1326,13 +1397,13 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/bundle-name": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, "dependencies": { @@ -1340,11 +1411,14 @@ }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { @@ -1353,7 +1427,7 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { @@ -1362,11 +1436,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { @@ -1378,13 +1455,13 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "engines": { @@ -1393,13 +1470,13 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { @@ -1413,12 +1490,12 @@ }, "node_modules/crypto-js": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" }, "node_modules/css-select": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { @@ -1427,11 +1504,14 @@ "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-tree": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "dependencies": { @@ -1444,16 +1524,19 @@ }, "node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "bin": { @@ -1465,7 +1548,7 @@ }, "node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmmirror.com/csso/-/csso-5.0.5.tgz", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "dependencies": { @@ -1478,7 +1561,7 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "dependencies": { @@ -1492,29 +1575,29 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.28.tgz", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true }, "node_modules/csstype": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/dayjs": { "version": "1.11.9", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" }, "node_modules/de-indent": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { @@ -1531,13 +1614,13 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/default-browser": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "dependencies": { @@ -1548,11 +1631,14 @@ }, "engines": { "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/default-browser-id": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, "dependencies": { @@ -1561,20 +1647,26 @@ }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/detect-port": { "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/detect-port/-/detect-port-1.5.1.tgz", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, "dependencies": { @@ -1588,7 +1680,7 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { @@ -1600,7 +1692,7 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { @@ -1612,24 +1704,33 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { @@ -1637,22 +1738,28 @@ }, "engines": { "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/element-plus": { "version": "2.3.12", - "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.3.12.tgz", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.3.12.tgz", "integrity": "sha512-fAWpbKCyt+l1dsqSNPOs/F/dBN4Wp5CGAyxbiS5zqDwI4q3QPM+LxLU2h3GUHMIBtMGCvmsG98j5HPMkTKkvcA==", "dependencies": { "@ctrl/tinycolor": "^3.4.1", @@ -1677,16 +1784,19 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/esbuild": { "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, @@ -1723,21 +1833,24 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "8.48.0", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.48.0.tgz", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { @@ -1784,11 +1897,14 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-prettier": { "version": "8.10.0", - "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { @@ -1800,7 +1916,7 @@ }, "node_modules/eslint-plugin-prettier": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { @@ -1810,6 +1926,9 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/prettier" + }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", @@ -1826,7 +1945,7 @@ }, "node_modules/eslint-plugin-vue": { "version": "9.17.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", "dev": true, "dependencies": { @@ -1847,7 +1966,7 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { @@ -1860,16 +1979,19 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { @@ -1878,11 +2000,14 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { @@ -1891,7 +2016,7 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { @@ -1901,11 +2026,14 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { @@ -1917,7 +2045,7 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { @@ -1926,7 +2054,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { @@ -1938,7 +2066,7 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { @@ -1947,7 +2075,7 @@ }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { @@ -1956,12 +2084,12 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { @@ -1970,7 +2098,7 @@ }, "node_modules/execa": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/execa/-/execa-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "dependencies": { @@ -1986,23 +2114,26 @@ }, "engines": { "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "node_modules/fast-glob": { "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { @@ -2018,7 +2149,7 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { @@ -2030,19 +2161,19 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastq": { "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { @@ -2051,7 +2182,7 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { @@ -2063,7 +2194,7 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { @@ -2075,7 +2206,7 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { @@ -2084,11 +2215,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { @@ -2102,19 +2236,19 @@ }, "node_modules/flatted": { "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, @@ -2128,16 +2262,19 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { @@ -2150,11 +2287,14 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { @@ -2166,7 +2306,7 @@ }, "node_modules/globals": { "version": "13.21.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.21.0.tgz", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { @@ -2174,11 +2314,14 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { @@ -2191,17 +2334,20 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { @@ -2210,7 +2356,7 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { @@ -2219,14 +2365,21 @@ }, "node_modules/hotkeys-js": { "version": "3.12.0", - "resolved": "https://registry.npmmirror.com/hotkeys-js/-/hotkeys-js-3.12.0.tgz", + "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.12.0.tgz", "integrity": "sha512-Z+N573ycUKIGwFYS3ID1RzMJiGmtWMGKMiaNLyJS8B1ei+MllF4ZYmKS2T0kMWBktOz+WZLVNikftEgnukOrXg==" }, "node_modules/htmlparser2": { "version": "9.0.0", - "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.0.0.tgz", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -2236,7 +2389,7 @@ }, "node_modules/human-signals": { "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-4.3.1.tgz", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { @@ -2245,7 +2398,7 @@ }, "node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { @@ -2254,7 +2407,7 @@ }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { @@ -2263,11 +2416,14 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { @@ -2276,7 +2432,7 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { @@ -2286,13 +2442,13 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/install": { "version": "0.13.0", - "resolved": "https://registry.npmmirror.com/install/-/install-0.13.0.tgz", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", "engines": { "node": ">= 0.10" @@ -2300,7 +2456,7 @@ }, "node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "bin": { @@ -2308,11 +2464,14 @@ }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { @@ -2321,7 +2480,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { @@ -2333,7 +2492,7 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "dependencies": { @@ -2344,11 +2503,14 @@ }, "engines": { "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { @@ -2357,7 +2519,7 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "engines": { @@ -2366,16 +2528,19 @@ }, "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { @@ -2387,7 +2552,7 @@ }, "node_modules/is-wsl/node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "bin": { @@ -2395,17 +2560,20 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { @@ -2417,25 +2585,25 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/keyv": { "version": "4.5.3", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.3.tgz", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "dependencies": { @@ -2444,7 +2612,7 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { @@ -2457,7 +2625,7 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { @@ -2465,21 +2633,24 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash-unified": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", "peerDependencies": { "@types/lodash-es": "*", @@ -2489,13 +2660,13 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { @@ -2507,7 +2678,7 @@ }, "node_modules/luxon": { "version": "3.4.2", - "resolved": "https://registry.npmmirror.com/luxon/-/luxon-3.4.2.tgz", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.2.tgz", "integrity": "sha512-uBoAVCVcajsrqy3pv7eo5jEUz1oeLmCcnMv8n4AJpT5hbpN9lUssAXibNElpbLce3Mhm9dyBzwYLs9zctM/0tA==", "engines": { "node": ">=12" @@ -2515,7 +2686,7 @@ }, "node_modules/magic-string": { "version": "0.30.3", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.3.tgz", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -2526,24 +2697,24 @@ }, "node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.30.tgz", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, "node_modules/memoize-one": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "engines": { @@ -2552,7 +2723,7 @@ }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { @@ -2565,16 +2736,19 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { @@ -2586,12 +2760,12 @@ }, "node_modules/mitt": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" }, "node_modules/mrmime": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, "engines": { @@ -2600,20 +2774,26 @@ }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/muggle-string": { "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", "dev": true }, "node_modules/nanoid": { "version": "3.3.6", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2623,24 +2803,24 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "node_modules/normalize-wheel-es": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" }, "node_modules/npm-run-path": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { @@ -2648,29 +2828,38 @@ }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { @@ -2679,7 +2868,7 @@ }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { @@ -2687,11 +2876,14 @@ }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/open/-/open-9.1.0.tgz", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "dependencies": { @@ -2702,11 +2894,14 @@ }, "engines": { "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.3", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { @@ -2723,7 +2918,7 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { @@ -2731,11 +2926,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { @@ -2743,11 +2941,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { @@ -2759,7 +2960,7 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { @@ -2768,7 +2969,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { @@ -2777,7 +2978,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { @@ -2786,7 +2987,7 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { @@ -2795,26 +2996,32 @@ }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pinia": { "version": "2.1.6", - "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.6.tgz", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz", "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", "dependencies": { "@vue/devtools-api": "^6.5.0", "vue-demi": ">=0.14.5" }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, "peerDependencies": { "@vue/composition-api": "^1.4.0", "typescript": ">=4.4.4", @@ -2831,7 +3038,7 @@ }, "node_modules/pinia/node_modules/vue-demi": { "version": "0.14.6", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", "hasInstallScript": true, "bin": { @@ -2841,6 +3048,9 @@ "engines": { "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" @@ -2853,8 +3063,22 @@ }, "node_modules/postcss": { "version": "8.4.29", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.29.tgz", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -2866,7 +3090,7 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.13", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { @@ -2879,7 +3103,7 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { @@ -2888,7 +3112,7 @@ }, "node_modules/prettier": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, "bin": { @@ -2896,11 +3120,14 @@ }, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "dependencies": { @@ -2912,7 +3139,7 @@ }, "node_modules/punycode": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { @@ -2921,13 +3148,27 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { @@ -2936,7 +3177,7 @@ }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { @@ -2946,7 +3187,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { @@ -2954,11 +3195,14 @@ }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { "version": "3.28.1", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.28.1.tgz", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", "dev": true, "bin": { @@ -2974,7 +3218,7 @@ }, "node_modules/run-applescript": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, "dependencies": { @@ -2982,11 +3226,14 @@ }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-applescript/node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { @@ -3002,11 +3249,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/run-applescript/node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { @@ -3015,16 +3265,19 @@ }, "node_modules/run-applescript/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-applescript/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { @@ -3033,7 +3286,7 @@ }, "node_modules/run-applescript/node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { @@ -3045,7 +3298,7 @@ }, "node_modules/run-applescript/node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { @@ -3053,11 +3306,14 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-applescript/node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { @@ -3066,16 +3322,30 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { @@ -3090,7 +3360,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { @@ -3102,7 +3372,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { @@ -3111,13 +3381,13 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { @@ -3126,7 +3396,7 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { @@ -3135,7 +3405,7 @@ }, "node_modules/source-map-js": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" @@ -3143,7 +3413,7 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { @@ -3153,7 +3423,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { @@ -3165,25 +3435,31 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { @@ -3195,7 +3471,7 @@ }, "node_modules/svgo": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/svgo/-/svgo-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", "dev": true, "dependencies": { @@ -3211,11 +3487,15 @@ }, "engines": { "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, "node_modules/synckit": { "version": "0.8.5", - "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.8.5.tgz", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", "dev": true, "dependencies": { @@ -3224,18 +3504,21 @@ }, "engines": { "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/systemjs": { "version": "6.14.2", - "resolved": "https://registry.npmmirror.com/systemjs/-/systemjs-6.14.2.tgz", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.2.tgz", "integrity": "sha512-1TlOwvKWdXxAY9vba+huLu99zrQURDWA8pUTYsRIYDZYQbGyK+pyEP4h4dlySsqo7ozyJBmYD20F+iUHhAltEg==", "dev": true }, "node_modules/terser": { - "version": "5.19.3", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.19.3.tgz", - "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -3252,28 +3535,31 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/titleize": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/titleize/-/titleize-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { @@ -3285,13 +3571,13 @@ }, "node_modules/tslib": { "version": "2.6.2", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { @@ -3306,13 +3592,13 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { @@ -3324,16 +3610,19 @@ }, "node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typescript": { "version": "5.2.2", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.2.2.tgz", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "devOptional": true, "bin": { @@ -3346,7 +3635,7 @@ }, "node_modules/untildify": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, "engines": { @@ -3355,7 +3644,7 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { @@ -3364,13 +3653,13 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/vite": { "version": "4.4.9", - "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", "dev": true, "dependencies": { @@ -3384,6 +3673,9 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, @@ -3451,7 +3743,7 @@ }, "node_modules/vue": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "dependencies": { "@vue/compiler-dom": "3.3.4", @@ -3463,7 +3755,7 @@ }, "node_modules/vue-eslint-parser": { "version": "9.3.1", - "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", "dev": true, "dependencies": { @@ -3478,13 +3770,16 @@ "engines": { "node": "^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, "peerDependencies": { "eslint": ">=6.0.0" } }, "node_modules/vue-eslint-parser/node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { @@ -3493,11 +3788,14 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/vue-eslint-parser/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { @@ -3506,7 +3804,7 @@ }, "node_modules/vue-template-compiler": { "version": "2.7.14", - "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "dependencies": { @@ -3516,7 +3814,7 @@ }, "node_modules/vue-tsc": { "version": "1.8.8", - "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.8.tgz", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.8.tgz", "integrity": "sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==", "dev": true, "dependencies": { @@ -3533,7 +3831,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { @@ -3548,13 +3846,13 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/xml-name-validator": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, "engines": { @@ -3563,17 +3861,20 @@ }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } } diff --git a/package.json b/package.json index 6ddb6f95..9ab9b8ff 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bilibili-live-tasks-helper", "private": true, - "version": "7.1.0", + "version": "7.1.1", "type": "module", "scripts": { "dev": "vite", From ae578c76ac058ad9a6da141e6c1f0bcfcc01c37c Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Tue, 5 Sep 2023 16:39:14 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=F0=9F=93=83=20docs:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b74af1d..b59f968a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # 更新日志 +## [7.1.1] - 2023-9-5 + +## 新增 + +- 屏蔽挂机检测模块 +- 更多模块运行时机 +- 支持指定模块运行的frame,以及是否在默认模块运行完后运行 + +## 调整 + +- 部分模块微调:运行时机,运行frame,是否在默认模块运行完后运行 +- 对体验优化板块中的所有模块进行了优化 + +## 修复 + +- 继续尝试修复部分情况下脚本被注入得太早导致完全失效的Bug + ## [7.1.0] - 2023-8-30 ## 新增 From aeb7d72f3a53eb7778598e29f17d49d0a2f8ecd4 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Tue, 5 Sep 2023 16:40:16 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=F0=9F=93=83=20docs:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b59f968a..ca2cfe0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - 部分模块微调:运行时机,运行frame,是否在默认模块运行完后运行 - 对体验优化板块中的所有模块进行了优化 +- 由于ajax-hook存在一个对脚本影响较大的bug,暂时从cdn改为本地修改后的 ## 修复 From 689d5a120053cd43a7a22a8e7b1739f3525f2773 Mon Sep 17 00:00:00 2001 From: andywang425 <13120989656@163.com> Date: Tue, 5 Sep 2023 16:53:27 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=F0=9F=90=B3=20chore:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9help-info?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/library/help-info/index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/library/help-info/index.ts b/src/library/help-info/index.ts index bed277f7..258c3790 100644 --- a/src/library/help-info/index.ts +++ b/src/library/help-info/index.ts @@ -218,7 +218,13 @@ const help_info: IhelpInfo = { }, sleepDetection: { title: '屏蔽挂机检测', - message: '屏蔽B站的挂机检测。' + message: h('p', [ + h('div', '屏蔽B站直播间的挂机检测。'), + h( + 'div', + '如果长时间没有操作,会提示“检测到您已离开当前屏幕,倒计时后即将暂停播放”。开启本功能后即可避免这种情况。' + ) + ]) } }, RemoveElement: {