From d8447b36d032ca7138ed26efb4edf3cfc68307e5 Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:09:56 +0800 Subject: [PATCH 01/11] TYPE THEM ALL!!!!1!1 --- .github/workflows/build.yml | 12 - .vscode/settings.json | 3 + build.ts | 17 + main/entry.js | 44 - main/entry.ts | 50 + main/handle/cgi.js | 80 -- main/handle/cgi.ts | 99 ++ main/handle/main.js | 283 ---- main/handle/main.ts | 481 +++++++ main/utils/cons.js | 18 - main/utils/cons.ts | 18 + main/utils/engine.js | 319 ----- main/utils/engine.ts | 439 +++++++ main/utils/rebuild.js | 46 - main/utils/rebuild.ts | 53 + package.json | 13 +- pnpm-lock.yaml | 1806 ++++++++++++++++++++++++++ static/autoupdate.js | 108 +- static/config.schema.json | 237 +--- static/config.yaml | 253 ++-- tsconfig.json | 18 + types/cacheDB.d.ts | 42 + types/configType.ts | 250 ++++ types/esbuild-copy-static-files.d.ts | 12 + types/globalThis.d.ts | 7 + 25 files changed, 3547 insertions(+), 1161 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 build.ts delete mode 100644 main/entry.js create mode 100644 main/entry.ts delete mode 100644 main/handle/cgi.js create mode 100644 main/handle/cgi.ts delete mode 100644 main/handle/main.js create mode 100644 main/handle/main.ts delete mode 100644 main/utils/cons.js create mode 100644 main/utils/cons.ts delete mode 100644 main/utils/engine.js create mode 100644 main/utils/engine.ts delete mode 100644 main/utils/rebuild.js create mode 100644 main/utils/rebuild.ts create mode 100644 pnpm-lock.yaml create mode 100644 tsconfig.json create mode 100644 types/cacheDB.d.ts create mode 100644 types/configType.ts create mode 100644 types/esbuild-copy-static-files.d.ts create mode 100644 types/globalThis.d.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dec8bba..ed3f4f5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,27 +19,15 @@ jobs: - name: Install & Build run: > rm -rf .gitignore - echo "node_modules" >> .gitignore - echo "doc/node_modules" >> .gitignore - npm i -D - npm install -D webpack-cli webpack - npm run build - echo "clientworker.js.org" > ./dist/CNAME - cd doc - npm add --dev vitepress vue - npm run "docs:build" - - - - name: Deploy to GithubPage uses: peaceiris/actions-gh-pages@v3 with: diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3662b37 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/build.ts b/build.ts new file mode 100644 index 0000000..9b4df95 --- /dev/null +++ b/build.ts @@ -0,0 +1,17 @@ +import { build } from "esbuild"; +import copyStaticFiles from "esbuild-copy-static-files"; + +(async () => { + await build({ + entryPoints: ["./main/entry.js"], + entryNames: "[dir]/cw", + bundle: true, + outdir: "dist", + minify: true, + sourcemap: true, + target: ["es2015"], + plugins: [copyStaticFiles({ src: "static", dest: "dist" })], + }); +})(); + +export {}; diff --git a/main/entry.js b/main/entry.js deleted file mode 100644 index be116e5..0000000 --- a/main/entry.js +++ /dev/null @@ -1,44 +0,0 @@ -import { } from './handle/main.js' -import pkgjson from '../package.json' -import cons from './utils/cons.js' -import CacheDB from '@chenyfan/cache-db' - -cons.s(`ClientWorker${pkgjson.version} Started!`) -const db = new CacheDB() -db.read('hotpatch').then(script => { - if (!!script) { - cons.s('Hotpatch Loaded!') - eval(script) - } else { - cons.w('Hotpatch Not Found!') - } -}) -db.read('config').then(config => { - config = JSON.parse(config) || {} - setInterval(() => { - cons.s(`ClientWorker@${pkgjson.version} Start to Clean Expired Cache!`) - caches.open("ClientWorker_ResponseCache").then(cache => { - cache.keys().then(keys => { - keys.forEach(key => { - cache.match(key).then(res => { - if (Number(res.headers.get('ClientWorker_ExpireTime')) <= new Date().getTime()) { - cache.delete(key) - } - }) - }) - }) - }) - }, eval(config.cleaninterval) || 60*1000); -}) -addEventListener('fetch', event => { - event.respondWith(self.clientworkerhandle(event.request)) -}) -addEventListener('install', function () { - cons.s(`ClientWorker@${pkgjson.version} Installed!`) - self.skipWaiting(); -}); -addEventListener('activate', function () { - cons.s(`ClientWorker@${pkgjson.version} Activated!`) - self.clients.claim(); -}) - diff --git a/main/entry.ts b/main/entry.ts new file mode 100644 index 0000000..00244e4 --- /dev/null +++ b/main/entry.ts @@ -0,0 +1,50 @@ +import {} from "./handle/main.js"; +import pkgjson from "../package.json"; +import cons from "./utils/cons.js"; +import CacheDB from "@chenyfan/cache-db"; + +cons.s(`ClientWorker${pkgjson.version} Started!`); +const db = new CacheDB(); +db.read("hotpatch").then((script) => { + if (!!script) { + cons.s("Hotpatch Loaded!"); + eval(script as string); + } else { + cons.w("Hotpatch Not Found!"); + } +}); + +db.read("config").then((config) => { + const cfg = JSON.parse(config) || {}; + config = cfg; + setInterval(() => { + cons.s(`ClientWorker@${pkgjson.version} Start to Clean Expired Cache!`); + caches.open("ClientWorker_ResponseCache").then((cache) => { + cache.keys().then((keys) => { + keys.forEach((key) => { + cache.match(key).then((res) => { + if ( + Number(res!.headers.get("ClientWorker_ExpireTime")) <= + new Date().getTime() + ) { + cache.delete(key); + } + }); + }); + }); + }); + }, eval(cfg.cleaninterval) || 60 * 1000); +}); +addEventListener("fetch", (event) => { + (event as FetchEvent).respondWith( + self.clientworkerhandle((event as FetchEvent).request) + ); +}); +addEventListener("install", function () { + cons.s(`ClientWorker@${pkgjson.version} Installed!`); + self.skipWaiting(); +}); +addEventListener("activate", function () { + cons.s(`ClientWorker@${pkgjson.version} Activated!`); + self.clients.claim(); +}); diff --git a/main/handle/cgi.js b/main/handle/cgi.js deleted file mode 100644 index 426cbc4..0000000 --- a/main/handle/cgi.js +++ /dev/null @@ -1,80 +0,0 @@ -import yaml from 'js-yaml' -import CacheDB from '@chenyfan/cache-db' -import FetchEngine from '../utils/engine.js' -import pkgjson from '../../package.json' -const router_cgi = async (request) => { - const db = new CacheDB() - const urlStr = request.url.toString() - const urlObj = new URL(urlStr) - const pathname = urlObj.pathname - const q = (s) => { return urlObj.searchParams.get(s) } - let config - switch (pathname.split('/')[2]) { - case 'hello': - return new Response('Hello ClientWorker!') - case 'info': - return new Response(JSON.stringify({ - version: pkgjson.version - }),{ - headers:{ - 'Content-Type':'application/json' - } - }) - case 'page': - switch (q('type')) { - case 'install': - return fetch('/404') - default: - return new Response('Error, page type not found') - } - case 'api': - - switch (q('type')) { - case 'config': - return fetch(q('url') || '/config.yaml') - .then(res => res.text()) - .then(text => yaml.load(text)) - .then(async config => { - await db.write('config', JSON.stringify(config), { type: "json" }) - return new Response('ok') - }) - .catch(async err => { - await db.write('config', '') - return new Response(err) - }) - case 'clear': - return caches.open('ClientWorker_ResponseCache').then(async cache => { - return cache.keys().then(async keys => { - await Promise.all(keys.map(key => { - cache.delete(key) - })) - return new Response('ok') - }) - }) - case 'hotpatch': - config =JSON.parse(await db.read('config')) - if(typeof config.hotpatch !== 'object') return new Response('Error, config.hotpatch not found') - const hotpatch = config.hotpatch - await FetchEngine.parallel(hotpatch) - .then(t=>t.text()) - .then(async script=>{ - await db.write('hotpatch', script, { type: "text" }) - eval(script) - }) - return new Response('ok') - case 'hotconfig': - config = JSON.parse(await db.read('config')) - if(typeof config.hotconfig !== 'object') return new Response('Error, config.hotconfig not found') - const hotconfig = config.hotconfig - const nConfig = await FetchEngine.parallel(hotconfig).then(t=>t.text()).then(t=>yaml.load(t)).then(t=>JSON.stringify(t)).catch(t=>{return ''}) - if(nConfig)await db.write('config',nConfig) - return new Response('ok') - - default: - return new Response('Error, api type not found') - } - default: - return new Response('Not Found!, Client Worker!') - } -} -export default router_cgi \ No newline at end of file diff --git a/main/handle/cgi.ts b/main/handle/cgi.ts new file mode 100644 index 0000000..4eafa6a --- /dev/null +++ b/main/handle/cgi.ts @@ -0,0 +1,99 @@ +import yaml from "js-yaml"; +import CacheDB from "@chenyfan/cache-db"; +import FetchEngine from "../utils/engine.js"; +import pkgjson from "../../package.json"; + +const router_cgi = async (request: Request) => { + const db = new CacheDB(); + const urlStr = request.url.toString(); + const urlObj = new URL(urlStr); + const pathname = urlObj.pathname; + const q = (s: string) => { + return urlObj.searchParams.get(s); + }; + let config; + switch (pathname.split("/")[2]) { + case "hello": + return new Response("Hello ClientWorker!"); + case "info": + return new Response( + JSON.stringify({ + version: pkgjson.version, + }), + { + headers: { + "Content-Type": "application/json", + }, + } + ); + case "page": + switch (q("type")) { + case "install": + return fetch("/404"); + default: + return new Response("Error, page type not found"); + } + case "api": + switch (q("type")) { + case "config": + return fetch(q("url") || "/config.yaml") + .then((res) => res.text()) + .then((text) => yaml.load(text)) + .then(async (config) => { + await db.write("config", JSON.stringify(config), { + type: "json", + }); + return new Response("ok"); + }) + .catch(async (err) => { + await db.write("config", ""); + return new Response(err); + }); + case "clear": + return caches + .open("ClientWorker_ResponseCache") + .then(async (cache) => { + return cache.keys().then(async (keys) => { + await Promise.all( + keys.map((key) => { + cache.delete(key); + }) + ); + return new Response("ok"); + }); + }); + case "hotpatch": + config = JSON.parse(await db.read("config")); + if (typeof config.hotpatch !== "object") + return new Response("Error, config.hotpatch not found"); + const hotpatch = config.hotpatch; + await FetchEngine.parallel(hotpatch) + .then((t) => t.text()) + .then(async (script) => { + await db.write("hotpatch", script, { type: "text" }); + eval(script); + }); + return new Response("ok"); + case "hotconfig": + config = JSON.parse(await db.read("config")); + if (typeof config.hotconfig !== "object") + return new Response("Error, config.hotconfig not found"); + const hotconfig = config.hotconfig; + const nConfig = await FetchEngine.parallel(hotconfig) + .then((t) => t.text()) + .then((t) => yaml.load(t)) + .then((t) => JSON.stringify(t)) + .catch((t) => { + return ""; + }); + if (nConfig) await db.write("config", nConfig); + return new Response("ok"); + + default: + return new Response("Error, api type not found"); + } + default: + return new Response("Not Found!, Client Worker!"); + } +}; +export default router_cgi; diff --git a/main/handle/main.js b/main/handle/main.js deleted file mode 100644 index 8879f81..0000000 --- a/main/handle/main.js +++ /dev/null @@ -1,283 +0,0 @@ -import router_cgi from './cgi.js' -import CacheDB from '@chenyfan/cache-db' -import cons from './../utils/cons.js' -import FetchEngine from '../utils/engine.js' -import rebuild from '../utils/rebuild.js' -self.clientworkerhandle = async (request) => { - //当前域 new Request('').url - const domain = new URL(new Request('').url).host - const db = new CacheDB() - - let tReq = request - const urlStr = tReq.url.toString() - const urlObj = new URL(urlStr) - const pathname = urlObj.pathname - if (pathname.split('/')[1] === 'cw-cgi') { - return router_cgi(request) - } - const config = await db.read('config', { type: "json" }) - if (!config) return fetch(request) - - let tFetched = false - let EngineFetch = false - let fetchConfig = {} - let EngineFetchList = [] - let tRes = new Response() - for (let catch_rule of config.catch_rules) { - if (catch_rule.rule === '_') catch_rule.rule = domain - if (!tReq.url.match(new RegExp(catch_rule.rule))) continue; - - for (let transform_rule of catch_rule.transform_rules) { - let tSearched = false - - if (transform_rule.search === '_') transform_rule.search = catch_rule.rule - switch (transform_rule.searchin || "url") { - case 'url': - if (tReq.url.match(new RegExp(transform_rule.search, transform_rule.searchflags))) tSearched = true; - break - case 'header': - if (tReq.headers.get(transform_rule.searchkey).match(new RegExp(transform_rule.search, transform_rule.searchflags))) tSearched = true; - break; - case 'status': - if (!tFetched) { cons.w(`${tReq.url} is not fetched yet,the status rule are ignored`); break } - if (String(tRes.status).match(new RegExp(transform_rule.search, transform_rule.searchflags))) tSearched = true; - break - case 'statusText': - if (!tFetched) { cons.w(`${tReq.url} is not fetched yet,the statusText rule are ignored`); break } - if (tRes.statusText.match(new RegExp(transform_rule.search, transform_rule.searchflags))) tSearched = true; - break - case 'body': - if (!tFetched) { cons.w(`${tReq.url} is not fetched yet,the body rule are ignored`); break } - if ((await tRes.clone().text()).match(new RegExp(transform_rule.search, transform_rule.searchflags))) tSearched = true; - break; - default: - cons.e(`${tReq.url} the ${transform_rule.searchin} search rule are not supported`); - break - - } - - switch (transform_rule.replacein || 'url') { - case 'url': - if (tFetched && tSearched) { cons.w(`${tReq.url} is already fetched,the url transform rule:${transform_rule.search} are ignored`); break } - if (typeof transform_rule.replace !== 'undefined' && tSearched) { - if (typeof transform_rule.replace === 'string') { - if (EngineFetch) cons.w(`EngineFetch Disabled for ${tReq.url},the request will downgrade to normal fetch`) - tReq = rebuild.request(tReq, { url: tReq.url.replace(new RegExp(transform_rule.replacekey || transform_rule.search, transform_rule.replaceflags), transform_rule.replace) }) - EngineFetch = false - } else { - if (EngineFetch) { cons.w(`Replacement cannot be used for ${tReq.url},the request is already powered by fetch-engine `); break } - transform_rule.replace.forEach(replacement => { - if (replacement === '_') { - EngineFetchList.push(tReq) - return; - } - EngineFetchList.push( - rebuild.request(tReq, { url: tReq.url.replace(new RegExp(transform_rule.replacekey || transform_rule.search, transform_rule.replaceflags), replacement) }) - ) - }); - - EngineFetch = true - } - } - break - case 'body': - if (tSearched) { - if (tFetched) { - tRes = rebuild.response(tRes, { body: (await tRes.clone().text()).replace(new RegExp(transform_rule.replacekey || transform_rule.search, transform_rule.replaceflags), transform_rule.replace) }) - - } else { - tReq = rebuild.request(tReq, { body: (await tReq.clone().text()).replace(new RegExp(transform_rule.replacekey || transform_rule.search, transform_rule.replaceflags), transform_rule.replace) }) - } - } - break; - - case 'status': - if (typeof transform_rule.replace === 'string' && tSearched) tRes = rebuild.response(tRes, { status: tRes.status.replace(new RegExp(transform_rule.replacekey || transform_rule.search, transform_rule.replaceflags), transform_rule.replace) }) - break; - case 'statusText': - if (typeof transform_rule.replace === 'string' && tSearched) tRes = rebuild.response(tRes, { statusText: tRes.statusText.replace(new RegExp(transform_rule.replacekey || transform_rule.search, transform_rule.replaceflags), transform_rule.replace) }) - break; - default: - cons.e(`${tReq.url} the ${transform_rule.replacein} replace rule are not supported`); - } - if (!tSearched) continue - if (typeof transform_rule.header === 'object') { - for (var header in transform_rule.header) { - if (tFetched) { - tRes = rebuild.response(tRes, { headers: { [header]: transform_rule.header[header] } }) - } else { - tReq = rebuild.request(tReq, { headers: { [header]: transform_rule.header[header] } }) - } - } - } - - if (typeof transform_rule.action !== 'undefined') { - switch (transform_rule.action) { - case 'skip': - return fetch(request) - case 'fetch': - if (tFetched) { cons.w(`${tReq.url} is already fetched,the fetch action are ignored`); break } - if (typeof transform_rule.fetch === 'undefined') { cons.e(`Fetch Config is not defined for ${tReq.url}`); break } - - fetchConfig = { - status: transform_rule.fetch.status, - mode: transform_rule.fetch.mode, - credentials: transform_rule.fetch.credentials, - redirect: transform_rule.fetch.redirect, - timeout: transform_rule.fetch.timeout, - threads: transform_rule.fetch.threads, - limit: transform_rule.fetch.limit - } - if (!transform_rule.fetch.preflight) { - tReq = new Request(tReq.url, { - method: ((method) => { - if (method === "GET" || method === "HEAD" || method === "POST") return method; - return "GET" - })(tReq.method), - body: ((body) => { - if (tReq.method === "POST") return body; - return null - })(tReq.body) - }) //https://segmentfault.com/a/1190000006095018 - delete fetchConfig.credentials - //fetchConfig.mode = "cors" - for (var eReq in EngineFetchList) { - EngineFetchList[eReq] = new Request(EngineFetchList[eReq].url, tReq) - } - } - - tRes = await new Promise(async (res, rej) => { - const EngineFetcher = async () => { - let cRes - return new Promise(async (resolve, reject) => { - if (!EngineFetch) { - switch (transform_rule.fetch.engine || 'fetch') { - case 'fetch': - cRes = await FetchEngine.fetch(tReq, fetchConfig) - break - case 'crazy': - cRes = await FetchEngine.crazy(tReq, fetchConfig) - break - default: - cons.e(`${tReq.url} the ${transform_rule.fetch.engine} engine are not supported`); - break - } - } else { - switch (transform_rule.fetch.engine || 'parallel') { - case 'classic': - cRes = await FetchEngine.classic(EngineFetchList, fetchConfig) - break; - case 'parallel': - cRes = await FetchEngine.parallel(EngineFetchList, fetchConfig) - break; - case 'KFCThursdayVW50': - if (new Date().getDay() === 4) cons.e(`VW50! The Best Fetch Engine in the World Said!`) - cRes = await FetchEngine.KFCThursdayVW50(EngineFetchList, fetchConfig) - break; - default: - cons.e(`Fetch Engine ${transform_rule.fetch.engine} is not supported`) - break; - } - - } - if (typeof transform_rule.fetch.cache === "object" && cRes.status === (transform_rule.fetch.status || 200)) { - cRes = rebuild.response(cRes, { headers: { "ClientWorker_ExpireTime": new Date().getTime() + Number(eval(transform_rule.fetch.cache.expire || '0')) } }) - caches.open("ClientWorker_ResponseCache").then(cache => { - cache.put(tReq, cRes.clone()) - .then(() => { resolve(cRes) }) - }) - } - else { resolve(cRes) } - }) - } - if (typeof transform_rule.fetch.cache === "object") { - caches.open("ClientWorker_ResponseCache").then(cache => { - cache.match(tReq).then(cRes => { - if (!!cRes) { - if (Number(cRes.headers.get('ClientWorker_ExpireTime')) > new Date().getTime()) { - cons.s(`${tReq.url} is fetched from cache`) - res(cRes) - return - } else { - cons.w(`${tReq.url} is expired.`) - res(Promise.any([ - EngineFetcher(), - new Promise(async (resolve, reject) => { - setTimeout(() => { - cons.e(`${tReq.url} is too late to fetch,even though the cache has expired,so return by cache`) - resolve(cRes) - return; - }, transform_rule.fetch.cache.delay || 3000); - }) - ])) - } - - } else { - cons.w(`${tReq.url} is not cached!And it is too late to fetch!`) - res(EngineFetcher()) - } - }) - }) - } else { res(EngineFetcher()) } - }) - tFetched = true - break - case 'redirect': - if (typeof transform_rule.redirect === 'undefined') { - cons.e(`Redirect Config is not defined for ${tReq.url}`); - break; - } - if (typeof transform_rule.redirect.url === 'string') return Response.redirect(transform_rule.redirect.url, transform_rule.redirect.status || 301) - return Response.redirect( - tReq.url.replace(new RegExp(transform_rule.search), transform_rule.redirect.to), - transform_rule.redirect.status || 301 - ) - case 'return': - if (typeof transform_rule.return === 'undefined') transform_rule.return = {} - return new Response(transform_rule.return.body || "Error!", { - status: transform_rule.return.status || 503, - headers: transform_rule.return.headers || {} - }) - case 'script': - if (typeof transform_rule.script === 'undefined') { - cons.e(`Script Config is not defined for ${tReq.url}`); - break; - } - if (typeof transform_rule.script.function === 'string') { - const ClientWorkerAnonymousFunctionName = `ClientWorker_AnonymousFunction_${new Date().getTime()}` - self[ClientWorkerAnonymousFunctionName] = eval(transform_rule.script.function) - transform_rule.script.name = ClientWorkerAnonymousFunctionName - } - const ScriptAns = await (Function('return (' + transform_rule.script.name + ')')())({ - fetched: tFetched, - request: tReq, - response: tRes - }) - - if (ScriptAns.fetched) { - if (transform_rule.script.skip || false) { - return ScriptAns.response - } - tFetched = true - tRes = ScriptAns.response - } else { - tReq = ScriptAns.request - } - break; - default: - cons.w(`This Action:${transform_rule.action} is not supported yet`) - break - } - } - } - - - } - if (!tFetched) { - //3.0.0 默认改为skip - return fetch(request) - } - - return tRes -} -export default {} \ No newline at end of file diff --git a/main/handle/main.ts b/main/handle/main.ts new file mode 100644 index 0000000..5821404 --- /dev/null +++ b/main/handle/main.ts @@ -0,0 +1,481 @@ +import CacheDB from "@chenyfan/cache-db"; +import FetchEngine, { FetchEngineConfig } from "../utils/engine.js"; +import rebuild from "../utils/rebuild.js"; +import cons from "../utils/cons.js"; +import router_cgi from "./cgi.js"; +import { ConfigType } from "../../types/configType.js"; + +self.clientworkerhandle = async (request) => { + //当前域 new Request('').url + const domain = new URL(new Request("").url).host; + const db = new CacheDB(); + + let tReq = request; + const urlStr = tReq.url.toString(); + const urlObj = new URL(urlStr); + const pathname = urlObj.pathname; + if (pathname.split("/")[1] === "cw-cgi") { + return router_cgi(request); + } + const config = await db.read("config", { + type: "json", + }); + if (!config) return fetch(request); + + let tFetched = false; + let EngineFetch = false; + let fetchConfig: + | (ConfigType["catch_rules"][number]["transform_rules"][number]["fetch"] & { + mode: RequestMode | undefined; + credentials: RequestCredentials | undefined; + redirect: RequestRedirect | undefined; + }) + | undefined = undefined; + let EngineFetchList: Request[] = []; + let tRes = new Response(); + for (let catch_rule of config.catch_rules) { + if (catch_rule.rule === "_") catch_rule.rule = domain; + if (!tReq.url.match(new RegExp(catch_rule.rule))) continue; + + for (let transform_rule of catch_rule.transform_rules) { + let tSearched = false; + + if (transform_rule.search === "_") + transform_rule.search = catch_rule.rule; + switch (transform_rule.searchin || "url") { + case "url": + if ( + tReq.url.match( + new RegExp(transform_rule.search, transform_rule.searchflags) + ) + ) + tSearched = true; + break; + case "header": + if ( + tReq.headers + .get(transform_rule.searchkey!)! + .match( + new RegExp(transform_rule.search, transform_rule.searchflags) + ) + ) + tSearched = true; + break; + case "status": + if (!tFetched) { + cons.w( + `${tReq.url} is not fetched yet,the status rule are ignored` + ); + break; + } + if ( + String(tRes.status).match( + new RegExp(transform_rule.search, transform_rule.searchflags) + ) + ) + tSearched = true; + break; + case "statusText": + if (!tFetched) { + cons.w( + `${tReq.url} is not fetched yet,the statusText rule are ignored` + ); + break; + } + if ( + tRes.statusText.match( + new RegExp(transform_rule.search, transform_rule.searchflags) + ) + ) + tSearched = true; + break; + case "body": + if (!tFetched) { + cons.w(`${tReq.url} is not fetched yet,the body rule are ignored`); + break; + } + if ( + (await tRes.clone().text()).match( + new RegExp(transform_rule.search, transform_rule.searchflags) + ) + ) + tSearched = true; + break; + default: + cons.e( + `${tReq.url} the ${transform_rule.searchin} search rule are not supported` + ); + break; + } + + switch (transform_rule.replacein || "url") { + case "url": + if (tFetched && tSearched) { + cons.w( + `${tReq.url} is already fetched,the url transform rule:${transform_rule.search} are ignored` + ); + break; + } + if (typeof transform_rule.replace !== "undefined" && tSearched) { + if (typeof transform_rule.replace === "string") { + if (EngineFetch) + cons.w( + `EngineFetch Disabled for ${tReq.url},the request will downgrade to normal fetch` + ); + tReq = rebuild.request(tReq, { + url: tReq.url.replace( + new RegExp( + transform_rule.replacekey || transform_rule.search, + transform_rule.replaceflags + ), + transform_rule.replace + ), + }); + EngineFetch = false; + } else { + if (EngineFetch) { + cons.w( + `Replacement cannot be used for ${tReq.url},the request is already powered by fetch-engine ` + ); + break; + } + transform_rule.replace.forEach((replacement) => { + if (replacement === "_") { + EngineFetchList.push(tReq); + return; + } + EngineFetchList.push( + rebuild.request(tReq, { + url: tReq.url.replace( + new RegExp( + transform_rule.replacekey || transform_rule.search, + transform_rule.replaceflags + ), + replacement + ), + }) + ); + }); + + EngineFetch = true; + } + } + break; + case "body": + if (tSearched) { + if (tFetched) { + tRes = rebuild.response(tRes, { + body: (await tRes.clone().text()).replace( + new RegExp( + transform_rule.replacekey || transform_rule.search, + transform_rule.replaceflags + ), + transform_rule.replace as string + ), + }); + } else { + tReq = rebuild.request(tReq, { + body: (await tReq.clone().text()).replace( + new RegExp( + transform_rule.replacekey || transform_rule.search, + transform_rule.replaceflags + ), + transform_rule.replace as string + ), + }); + } + } + break; + + case "status": + if (typeof transform_rule.replace === "string" && tSearched) + tRes = rebuild.response(tRes, { + status: Number( + tRes.status + .toString() + .replace( + new RegExp( + transform_rule.replacekey || transform_rule.search, + transform_rule.replaceflags + ), + transform_rule.replace + ) + ), + }); + break; + case "statusText": + if (typeof transform_rule.replace === "string" && tSearched) + tRes = rebuild.response(tRes, { + statusText: tRes.statusText.replace( + new RegExp( + transform_rule.replacekey || transform_rule.search, + transform_rule.replaceflags + ), + transform_rule.replace + ), + }); + break; + default: + cons.e( + `${tReq.url} the ${transform_rule.replacein} replace rule are not supported` + ); + } + if (!tSearched) continue; + if (typeof transform_rule.header === "object") { + Object.entries(transform_rule.header).forEach(([header, val]) => { + if (tFetched) { + tRes = rebuild.response(tRes, { + headers: { [header]: val }, + }); + } else { + tReq = rebuild.request(tReq, { + headers: { [header]: val }, + }); + } + }); + } + + if (typeof transform_rule.action !== "undefined") { + switch (transform_rule.action) { + case "skip": + return fetch(request); + case "fetch": + if (tFetched) { + cons.w( + `${tReq.url} is already fetched,the fetch action are ignored` + ); + break; + } + if (typeof transform_rule.fetch === "undefined") { + cons.e(`Fetch Config is not defined for ${tReq.url}`); + break; + } + + fetchConfig = { + status: transform_rule.fetch.status, + mode: transform_rule.fetch.mode as RequestMode | undefined, + credentials: transform_rule.fetch.credentials as + | RequestCredentials + | undefined, + redirect: transform_rule.fetch.redirect as + | RequestRedirect + | undefined, + timeout: transform_rule.fetch.timeout, + threads: transform_rule.fetch.threads, + trylimit: transform_rule.fetch.trylimit, + engine: transform_rule.fetch.engine, + preflight: transform_rule.fetch.preflight, + }; + if (!transform_rule.fetch.preflight) { + tReq = new Request(tReq.url, { + method: ((method) => { + if ( + method === "GET" || + method === "HEAD" || + method === "POST" + ) + return method; + return "GET"; + })(tReq.method), + body: ((body) => { + if (tReq.method === "POST") return body; + return null; + })(tReq.body), + }); //https://segmentfault.com/a/1190000006095018 + delete fetchConfig!.credentials; + //fetchConfig.mode = "cors" + for (var eReq in EngineFetchList) { + EngineFetchList[eReq] = new Request( + EngineFetchList[eReq].url, + tReq + ); + } + } + + tRes = await new Promise(async (res, rej) => { + const EngineFetcher = async (): Promise => { + let cRes: Response; + return new Promise(async (resolve, reject) => { + if (!EngineFetch) { + switch (transform_rule.fetch.engine || "fetch") { + case "fetch": + cRes = await FetchEngine.fetch(tReq, fetchConfig!); + break; + case "crazy": + cRes = await FetchEngine.crazy(tReq, fetchConfig!); + break; + default: + cons.e( + `${tReq.url} the ${transform_rule.fetch.engine} engine are not supported` + ); + break; + } + } else { + switch (transform_rule.fetch.engine || "parallel") { + case "classic": + cRes = await FetchEngine.classic( + EngineFetchList, + fetchConfig! + ); + break; + case "parallel": + cRes = await FetchEngine.parallel( + EngineFetchList, + fetchConfig! + ); + break; + case "KFCThursdayVW50": + if (new Date().getDay() === 4) + cons.e( + `VW50! The Best Fetch Engine in the World Said!` + ); + cRes = await FetchEngine.KFCThursdayVW50( + EngineFetchList, + fetchConfig! + ); + break; + default: + cons.e( + `Fetch Engine ${transform_rule.fetch.engine} is not supported` + ); + break; + } + } + if ( + typeof transform_rule.fetch.cache === "object" && + cRes.status === (transform_rule.fetch.status || 200) + ) { + cRes = rebuild.response(cRes, { + headers: { + ClientWorker_ExpireTime: ( + new Date().getTime() + + Number(eval(transform_rule.fetch.cache.expire || "0")) + ).toString(), + }, + }); + caches.open("ClientWorker_ResponseCache").then((cache) => { + cache.put(tReq, cRes.clone()).then(() => { + resolve(cRes); + }); + }); + } else { + resolve(cRes); + } + }); + }; + if (typeof transform_rule.fetch.cache === "object") { + caches.open("ClientWorker_ResponseCache").then((cache) => { + cache.match(tReq).then((cRes) => { + if (!!cRes) { + if ( + Number(cRes.headers.get("ClientWorker_ExpireTime")) > + new Date().getTime() + ) { + cons.s(`${tReq.url} is fetched from cache`); + res(cRes); + return; + } else { + cons.w(`${tReq.url} is expired.`); + res( + Promise.any([ + EngineFetcher(), + new Promise(async (resolve, reject) => { + setTimeout(() => { + cons.e( + `${tReq.url} is too late to fetch,even though the cache has expired,so return by cache` + ); + resolve(cRes); + return; + }, transform_rule.fetch.cache?.delay || 3000); + }), + ]) + ); + } + } else { + cons.w( + `${tReq.url} is not cached!And it is too late to fetch!` + ); + res(EngineFetcher()); + } + }); + }); + } else { + res(EngineFetcher()); + } + }); + tFetched = true; + break; + case "redirect": + if (typeof transform_rule.redirect === "undefined") { + cons.e(`Redirect Config is not defined for ${tReq.url}`); + break; + } + if (typeof transform_rule.redirect.url === "string") + return Response.redirect( + transform_rule.redirect.url, + transform_rule.redirect.status || 301 + ); + return Response.redirect( + tReq.url.replace( + new RegExp(transform_rule.search), + transform_rule.redirect.to! + ), + transform_rule.redirect.status || 301 + ); + case "return": + if (typeof transform_rule.return === "undefined") + transform_rule.return = { + body: "Error!", + status: 503, + header: { ServerProvide: "", "content-type": "text/plain" }, + }; + return new Response(transform_rule.return.body || "Error!", { + status: transform_rule.return.status || 503, + headers: transform_rule.return.header || {}, + }); + case "script": + if (typeof transform_rule.script === "undefined") { + cons.e(`Script Config is not defined for ${tReq.url}`); + break; + } + if (typeof transform_rule.script.function === "string") { + const ClientWorkerAnonymousFunctionName = `ClientWorker_AnonymousFunction_${new Date().getTime()}`; + // @ts-ignore + self[ClientWorkerAnonymousFunctionName] = eval( + transform_rule.script.function + ); + transform_rule.script.name = ClientWorkerAnonymousFunctionName; + } + const ScriptAns = await Function( + "return (" + transform_rule.script.name + ")" + )()({ + fetched: tFetched, + request: tReq, + response: tRes, + }); + + if (ScriptAns.fetched) { + if (transform_rule.script.skip || false) { + return ScriptAns.response; + } + tFetched = true; + tRes = ScriptAns.response; + } else { + tReq = ScriptAns.request; + } + break; + default: + cons.w(`This Action:${transform_rule.action} is not supported yet`); + break; + } + } + } + } + if (!tFetched) { + //3.0.0 默认改为skip + return fetch(request); + } + + return tRes; +}; +export default {}; diff --git a/main/utils/cons.js b/main/utils/cons.js deleted file mode 100644 index f65f11b..0000000 --- a/main/utils/cons.js +++ /dev/null @@ -1,18 +0,0 @@ -const cons = { - s: (m) => { - console.log(`%c[SUCCESS]%c ${m}`, 'color:white;background:green;', '') - }, - w: (m) => { - console.log(`%c[WARNING]%c ${m}`, 'color:brown;background:yellow;', '') - }, - i: (m) => { - console.log(`%c[INFO]%c ${m}`, 'color:white;background:blue;', '') - }, - e: (m) => { - console.log(`%c[ERROR]%c ${m}`, 'color:white;background:red;', '') - }, - d: (m) => { - console.log(`%c[DEBUG]%c ${m}`, 'color:white;background:black;', '') - } -} -export default cons \ No newline at end of file diff --git a/main/utils/cons.ts b/main/utils/cons.ts new file mode 100644 index 0000000..5a0b0b3 --- /dev/null +++ b/main/utils/cons.ts @@ -0,0 +1,18 @@ +const cons = { + s: (m: string) => { + console.log(`%c[SUCCESS]%c ${m}`, "color:white;background:green;", ""); + }, + w: (m: string) => { + console.log(`%c[WARNING]%c ${m}`, "color:brown;background:yellow;", ""); + }, + i: (m: string) => { + console.log(`%c[INFO]%c ${m}`, "color:white;background:blue;", ""); + }, + e: (m: string) => { + console.log(`%c[ERROR]%c ${m}`, "color:white;background:red;", ""); + }, + d: (m: string) => { + console.log(`%c[DEBUG]%c ${m}`, "color:white;background:black;", ""); + }, +}; +export default cons; diff --git a/main/utils/engine.js b/main/utils/engine.js deleted file mode 100644 index 7baa66b..0000000 --- a/main/utils/engine.js +++ /dev/null @@ -1,319 +0,0 @@ -import cons from './cons.js' -import rebuild from './rebuild.js' -if (!Promise.any) { - Promise.any = function (promises) { - return new Promise((resolve, reject) => { - promises = Array.isArray(promises) ? promises : [] - let len = promises.length - let errs = [] - if (len === 0) return reject(new AggregateError('All promises were rejected')) - promises.forEach((promise) => { - promise.then(value => { - resolve(value) - }, err => { - len-- - errs.push(err) - if (len === 0) { - reject(new AggregateError(errs)) - } - }) - }) - }) - } -} -const FetchEngine = { - fetch: async (req, config) => { - config = config || { status: 200 } - return new Promise((resolve, reject) => { - const reqtype = Object.prototype.toString.call(req) - if (reqtype !== '[object String]' && reqtype !== '[object Request]') { - reject(`FetchEngine.fetch: req must be a string or Request object,but got ${reqtype}`) - } - setTimeout(() => { - reject(new Response('504 All GateWays Failed,ClientWorker Show This Page,Engine Fetch', { status: 504, statusText: '504 All Gateways Timeout' })) - }, config.timeout || 5000); - fetch(req, { - mode: config.mode, - credentials: config.credential, - redirect: config.redirect || "follow" - }).then(res => { - resolve(res) - }).catch(err => { reject(err) }) - }) - }, - crazy: async (req, config) => { - config = config || { status: 200 } - config.threads = config.threads || 4 - config.trylimit = config.trylimit || 10 - const reqtype = Object.prototype.toString.call(req) - if (reqtype !== '[object String]' && reqtype !== '[object Request]') { - cons.e(`FetchEngine.fetch: req must be a string or Request object,but got ${reqtype}`) - return; - } - const controller = new AbortController(); - const PreFetch = await fetch(req, { - signal: controller.signal, - mode: config.mode, - credentials: config.credential, - redirect: config.redirect || "follow" - }) - const PreHeaders = PreFetch.headers - const AllSize = PreHeaders.get('Content-Length') - if (PreFetch.status.toString().match(config.status)) { - return (new Response('504 All GateWays Failed,ClientWorker Show This Page,Engine Crazy', { status: 504, statusText: '504 All Gateways Timeout' })) - } - controller.abort(); - if (!AllSize || AllSize < config.threads) { - cons.e(`FetchEngine.crazy: The Origin is not support Crazy Mode,or the size of the file is less than ${config.threads} bytes,downgrade to normal fetch`) - return FetchEngine.fetch(req, config) - } - return new Promise((resolve, reject) => { - const chunkSize = parseInt(AllSize / config.threads); - const chunks = []; - for (let i = 0; i < config.threads; i++) { - chunks.push( - new Promise(async (res, rej) => { - let trycount = 1 - const instance = async () => { - trycount += 1 - const nReq = rebuild.request(req, { - headers: { - Range: `bytes=${i * chunkSize}-${(i + 1) * chunkSize - 1}` - }, - url: req.url - }) - return fetch(nReq, { - mode: config.mode, - credentials: config.credential, - redirect: config.redirect || "follow" - }) - .then(res => res.arrayBuffer()) - .catch(err => { - if (trycount >= config.trylimit) { - reject() - return; - } - return instance() - }) - } - res(instance()); - }) - ) - } - Promise.all(chunks).then(responses => { - const resbodys = [] - for (let i = 0; i < responses.length; i++) { - resbodys.push(responses[i]); - } - resolve(new Response(new Blob(resbodys), { - headers: PreHeaders, - status: 200, - statusText: 'OK' - })); - - }) - setTimeout(() => { - reject(new Response('504 All GateWays Failed,ClientWorker Show This Page,Engine Crazy', { status: 504, statusText: '504 All Gateways Timeout' })) - }, config.timeout || 5000); - }) - }, - KFCThursdayVW50: async (reqs, config) => { - config = config || { status: 200 } - config.threads = config.threads || 4 - config.trylimit = config.trylimit || 10 - const reqtype = Object.prototype.toString.call(reqs) - if (reqtype === '[object String]' || reqtype === '[object Request]') { - cons.w(`FetchEngine.KFCThursdayVW50: reqs is a string or Request object,downgrade to crazy`) - return FetchEngine.crazy(reqs, config) - } else if (reqtype !== '[object Array]') { - cons.e(`FetchEngine.KFCThursdayVW50: reqs must be a string or Request object or an array,but got ${reqtype}`) - return Promise.reject(`FetchEngine.KFCThursdayVW50: reqs must be a string or Request object or an array,but got ${reqtype}`) - } else if (reqtype === '[object Array]') { - if (reqs.length === 0) { - cons.e(`FetchEngine.KFCThursdayVW50: reqs array is empty`) - reject() - } - if (reqs.length === 1) { - cons.w(`FetchEngine.KFCThursdayVW50: reqs array is only one,downgrade to crazy`) - return FetchEngine.crazy(reqs[0], config) - } - } - const controller = new AbortController(); - const PreFetch = await FetchEngine.parallel(reqs, { - signal: controller.signal, - mode: config.mode, - credentials: config.credential, - redirect: config.redirect || "follow", - timeout: config.timeout || 30000 - }) - - const PreHeaders = PreFetch.headers - const AllSize = PreHeaders.get('Content-Length') - if (PreFetch.status.toString().match(config.status)) { - reject(new Response('504 All GateWays Failed,ClientWorker Show This Page,Engine KFCThursdayVW50', { status: 504, statusText: '504 All Gateways Timeout' })) - } - controller.abort(); - if (!AllSize || AllSize < config.threads) { - cons.e(`FetchEngine.KFCThursdayVW50: The Origin is not support KFCThursdayVW50 Mode,or the size of the file is less than ${config.threads} bytes,downgrade to normal fetch`) - return FetchEngine.fetch(reqs, config) - } - return new Promise((resolve, reject) => { - const chunkSize = parseInt(AllSize / config.threads); - const chunks = []; - for (let i = 0; i < config.threads; i++) { - chunks.push( - new Promise(async (res, rej) => { - let trycount = 1 - const instance = async () => { - trycount += 1 - const nReqs = [] - reqs.forEach(req => { - nReqs.push(rebuild.request(req, { - headers: { - Range: `bytes=${i * chunkSize}-${(i + 1) * chunkSize - 1}` - }, - url: req.url - })) - }) - return FetchEngine.parallel(nReqs, { - mode: config.mode, - credentials: config.credential, - redirect: config.redirect || "follow", - timeout: config.timeout || 30000, - status: 206 - }) - .then(res => res.arrayBuffer()) - .catch(async err => { - cons.e(`FetchEngine.KFCThursdayVW50: ${await err.text()}`) - if (trycount >= config.trylimit) { - reject() - return; - } - return instance() - }) - } - res(instance()); - }) - ) - } - Promise.all(chunks).then(responses => { - const resbodys = [] - for (let i = 0; i < responses.length; i++) { - resbodys.push(responses[i]); - } - resolve(new Response(new Blob(resbodys), { - headers: PreHeaders, - status: 200, - statusText: 'OK' - })); - - }) - setTimeout(() => { - reject(new Response('504 All GateWays Failed,ClientWorker Show This Page,Engine KFCThursdayVW50', { status: 504, statusText: '504 All Gateways Timeout' })) - }, config.timeout || 30000); - }) - }, - classic: async (reqs, config) => { - return new Promise((resolve, reject) => { - config = config || { status: 200 } - const reqtype = Object.prototype.toString.call(reqs) - if (reqtype === '[object String]' || reqtype === '[object Request]') { - cons.w(`FetchEngine.classic: reqs should be an array,but got ${reqtype},this request will downgrade to normal fetch`) - resolve(FetchEngine.fetch(reqs, config)) - } else if (reqtype !== '[object Array]') { - cons.e(`FetchEngine.classic: reqs must be a string , Request or Array object,but got ${reqtype}`) - reject() - } else if (reqtype === '[object Array]') { - if (reqtype.length === 0) { - cons.e(`FetchEngine.classic: reqs array is empty`) - reject() - } - if (reqtype.length === 1) { - cons.w(`FetchEngine.classic: reqs array is only one element,this request will downgrade to normal fetch`) - resolve(FetchEngine.fetch(reqs[0], config)) - } - } - const controller = new AbortController(); - const PauseProgress = async (res) => { - return new Response(await (res).arrayBuffer(), { status: res.status, headers: res.headers, statusText: res.statusText }); - }; - - Promise.any(reqs.map(req => { - fetch(req, { - signal: controller.signal, - mode: config.mode, - credentials: config.credential, - redirect: config.redirect || "follow" - }) - .then(PauseProgress) - .then(res => { - if (res.status.toString().match(config.status)) { - controller.abort(); - resolve(res) - } - }).catch(err => { - if (err == 'DOMException: The user aborted a request.') console.log()//To disable the warning:DOMException: The user aborted a request. - }) - })) - - - setTimeout(() => { - reject(new Response('504 All GateWays Failed,ClientWorker Show This Page,Engine Classic', { status: 504, statusText: '504 All Gateways Timeout' })) - }, config.timeout || 5000); - - }) - }, - parallel: async (reqs, config) => { - return new Promise((resolve, reject) => { - config = config || { status: 200 } - const reqtype = Object.prototype.toString.call(reqs) - if (reqtype === '[object String]' || reqtype === '[object Request]') { - cons.w(`FetchEngine.parallel: reqs should be an array,but got ${reqtype},this request will downgrade to normal fetch`) - resolve(FetchEngine.fetch(reqs, config)) - } else if (reqtype !== '[object Array]') { - cons.e(`FetchEngine.parallel: reqs must be a string , Request or Array object,but got ${reqtype}`) - reject() - } else if (reqtype === '[object Array]') { - if (reqtype.length === 0) { - cons.e(`FetchEngine.parallel: reqs array is empty`) - reject() - } - if (reqtype.length === 1) { - cons.w(`FetchEngine.parallel: reqs array is only one element,this request will downgrade to normal fetch`) - resolve(FetchEngine.fetch(reqs[0], config)) - } - } - const abortEvent = new Event("abortOtherInstance") - const eventTarget = new EventTarget(); - Promise.any(reqs.map(async req => { - let controller = new AbortController(), tagged = false; - eventTarget.addEventListener(abortEvent.type, () => { - if (!tagged) controller.abort() - }) - fetch(req, { - signal: controller.signal, - mode: config.mode, - credentials: config.credential, - redirect: config.redirect || "follow" - }).then(res => { - if (res.status.toString().match(config.status)) { - tagged = true; - eventTarget.dispatchEvent(abortEvent) - resolve(rebuild.response(res,{})) - } - }).catch(err => { - if (err == 'DOMException: The user aborted a request.') console.log()//To disable the warning:DOMException: The user aborted a request. - }) - })) - - setTimeout(() => { - reject(new Response('504 All GateWays Failed,ClientWorker Show This Page,Engine Parallel', { status: 504, statusText: '504 All Gateways Timeout' })) - }, config.timeout || 5000); - - - - }) - } -} - -export default FetchEngine \ No newline at end of file diff --git a/main/utils/engine.ts b/main/utils/engine.ts new file mode 100644 index 0000000..72faea7 --- /dev/null +++ b/main/utils/engine.ts @@ -0,0 +1,439 @@ +import cons from "./cons.js"; +import rebuild from "./rebuild.js"; + +if (!Promise.any) { + Promise.any = function (promises: Promise[]) { + return new Promise((resolve, reject) => { + promises = Array.isArray(promises) ? promises : []; + let len = promises.length; + let errs: unknown[] = []; + if (len === 0) + return reject(new AggregateError("All promises were rejected")); + promises.forEach((promise) => { + promise.then( + (value) => { + resolve(value); + }, + (err) => { + len--; + errs.push(err); + if (len === 0) { + reject(new AggregateError(errs)); + } + } + ); + }); + }); + }; +} + +export type FetchEngineConfig = Partial<{ + mode: RequestMode; + credentials: RequestCredentials; + timeout: number; + redirect: RequestRedirect; + threads: number; + trylimit: number; + status: number; + signal: AbortSignal; +}>; + +type FetchEngineFunction = ( + req: Request, + config: FetchEngineConfig +) => Promise; + +const FetchEngine: Record<"fetch" | "crazy", FetchEngineFunction> & + Record< + "KFCThursdayVW50" | "parallel" | "classic", + (reqs: Request[] | Request, config: FetchEngineConfig) => Promise + > = { + fetch: async (req, config) => { + config = config || { status: 200 }; + return new Promise((resolve, reject) => { + const reqtype = Object.prototype.toString.call(req); + if (reqtype !== "[object String]" && reqtype !== "[object Request]") { + reject( + `FetchEngine.fetch: req must be a string or Request object,but got ${reqtype}` + ); + } + setTimeout(() => { + reject( + new Response( + "504 All GateWays Failed,ClientWorker Show This Page,Engine Fetch", + { status: 504, statusText: "504 All Gateways Timeout" } + ) + ); + }, config.timeout || 5000); + fetch(req, { + mode: config.mode, + credentials: config.credentials, + redirect: config.redirect || "follow", + }) + .then((res) => { + resolve(res); + }) + .catch((err) => { + reject(err); + }); + }); + }, + + crazy: async (req, config) => { + config = config || { status: 200 }; + config.threads = config.threads || 4; + config.trylimit = config.trylimit || 10; + const reqtype = Object.prototype.toString.call(req); + if (reqtype !== "[object String]" && reqtype !== "[object Request]") { + cons.e( + `FetchEngine.fetch: req must be a string or Request object,but got ${reqtype}` + ); + throw new Error( + `FetchEngine.fetch: req must be a string or Request object,but got ${reqtype}` + ); + } + const controller = new AbortController(); + const PreFetch = await fetch(req, { + signal: controller.signal, + mode: config.mode, + credentials: config.credentials, + redirect: config.redirect || "follow", + }); + const PreHeaders = PreFetch.headers; + const AllSize = PreHeaders.get("Content-Length"); + if ( + config.status && + PreFetch.status.toString().match(config.status.toString()) + ) { + return new Response( + "504 All GateWays Failed,ClientWorker Show This Page,Engine Crazy", + { status: 504, statusText: "504 All Gateways Timeout" } + ); + } + controller.abort(); + if (!AllSize || Number(AllSize) < config.threads) { + cons.e( + `FetchEngine.crazy: The Origin is not support Crazy Mode,or the size of the file is less than ${config.threads} bytes,downgrade to normal fetch` + ); + return FetchEngine.fetch(req, config); + } + return new Promise((resolve, reject) => { + const chunkSize = Math.floor(Number(AllSize) / config.threads!); + const chunks: Promise[] = []; + for (let i = 0; i < config.threads!; i++) { + chunks.push( + new Promise(async (res, rej) => { + let trycount = 1; + const instance = async (): Promise => { + trycount += 1; + const nReq = rebuild.request(req, { + headers: { + Range: `bytes=${i * chunkSize}-${(i + 1) * chunkSize - 1}`, + }, + url: req.url, + }); + return fetch(nReq, { + mode: config.mode, + credentials: config.credentials, + redirect: config.redirect || "follow", + }) + .then((res) => res.arrayBuffer()) + .catch((err) => { + if (trycount >= config.trylimit!) { + reject(); + } + return instance(); + }); + }; + res(instance()); + }) + ); + } + Promise.all(chunks).then((responses) => { + const resbodys: BlobPart[] = []; + for (let i = 0; i < responses.length; i++) { + resbodys.push(responses[i]!); + } + resolve( + new Response(new Blob(resbodys), { + headers: PreHeaders, + status: 200, + statusText: "OK", + }) + ); + }); + setTimeout(() => { + reject( + new Response( + "504 All GateWays Failed,ClientWorker Show This Page,Engine Crazy", + { status: 504, statusText: "504 All Gateways Timeout" } + ) + ); + }, config.timeout || 5000); + }); + }, + + KFCThursdayVW50: async (reqs, config) => { + config = config || { status: 200 }; + config.threads = config.threads || 4; + config.trylimit = config.trylimit || 10; + const reqtype = Object.prototype.toString.call(reqs); + if (reqtype === "[object String]" || reqtype === "[object Request]") { + cons.w( + `FetchEngine.KFCThursdayVW50: reqs is a string or Request object,downgrade to crazy` + ); + return FetchEngine.crazy(reqs as Request, config); + } else if (reqtype !== "[object Array]") { + cons.e( + `FetchEngine.KFCThursdayVW50: reqs must be a string or Request object or an array,but got ${reqtype}` + ); + return Promise.reject( + `FetchEngine.KFCThursdayVW50: reqs must be a string or Request object or an array,but got ${reqtype}` + ); + } else if (reqtype === "[object Array]") { + if ((reqs as Request[]).length === 0) { + cons.e(`FetchEngine.KFCThursdayVW50: reqs array is empty`); + throw new Error("FetchEngine.KFCThursdayVW50: reqs array is empty"); + } + if ((reqs as Request[]).length === 1) { + cons.w( + `FetchEngine.KFCThursdayVW50: reqs array is only one,downgrade to crazy` + ); + return FetchEngine.crazy((reqs as Request[])[0], config); + } + } + const controller = new AbortController(); + const PreFetch = await FetchEngine.parallel(reqs, { + signal: controller.signal, + mode: config.mode, + credentials: config.credentials, + redirect: config.redirect || "follow", + timeout: config.timeout || 30000, + }); + + const PreHeaders = PreFetch.headers; + const AllSize = PreHeaders.get("Content-Length"); + if ( + config.status && + PreFetch.status.toString().match(config.status.toString()) + ) { + return Promise.reject( + new Response( + "504 All GateWays Failed,ClientWorker Show This Page,Engine KFCThursdayVW50", + { status: 504, statusText: "504 All Gateways Timeout" } + ) + ); + } + controller.abort(); + if (!AllSize || Number(AllSize) < config.threads) { + cons.e( + `FetchEngine.KFCThursdayVW50: The Origin is not support KFCThursdayVW50 Mode,or the size of the file is less than ${config.threads} bytes,downgrade to normal fetch` + ); + return FetchEngine.fetch(reqs as Request, config); + } + return new Promise((resolve, reject) => { + const chunkSize = Math.floor(Number(AllSize) / config.threads!); + const chunks: Promise[] = []; + for (let i = 0; i < config.threads!; i++) { + chunks.push( + new Promise(async (res, rej) => { + let trycount = 1; + const instance = async (): Promise => { + trycount += 1; + const nReqs: Request[] = []; + (reqs as Request[]).forEach((req) => { + nReqs.push( + rebuild.request(req, { + headers: { + Range: `bytes=${i * chunkSize}-${ + (i + 1) * chunkSize - 1 + }`, + }, + url: req.url, + }) + ); + }); + return FetchEngine.parallel(nReqs, { + mode: config.mode, + credentials: config.credentials, + redirect: config.redirect || "follow", + timeout: config.timeout || 30000, + status: 206, + }) + .then((res) => res.arrayBuffer()) + .catch(async (err) => { + cons.e(`FetchEngine.KFCThursdayVW50: ${await err.text()}`); + if (trycount >= config.trylimit!) { + reject(); + } + return instance(); + }); + }; + res(instance()); + }) + ); + } + Promise.all(chunks).then((responses) => { + const resbodys: BlobPart[] = []; + for (let i = 0; i < responses.length; i++) { + resbodys.push(responses[i]); + } + resolve( + new Response(new Blob(resbodys), { + headers: PreHeaders, + status: 200, + statusText: "OK", + }) + ); + }); + setTimeout(() => { + reject( + new Response( + "504 All GateWays Failed,ClientWorker Show This Page,Engine KFCThursdayVW50", + { status: 504, statusText: "504 All Gateways Timeout" } + ) + ); + }, config.timeout || 30000); + }); + }, + classic: async (reqs, config) => { + return new Promise((resolve, reject) => { + config = config || { status: 200 }; + const reqtype = Object.prototype.toString.call(reqs); + if (reqtype === "[object String]" || reqtype === "[object Request]") { + cons.w( + `FetchEngine.classic: reqs should be an array,but got ${reqtype},this request will downgrade to normal fetch` + ); + resolve(FetchEngine.fetch(reqs as Request, config)); + } else if (reqtype !== "[object Array]") { + cons.e( + `FetchEngine.classic: reqs must be a string , Request or Array object,but got ${reqtype}` + ); + reject(); + } else if (reqtype === "[object Array]") { + if (reqtype.length === 0) { + cons.e(`FetchEngine.classic: reqs array is empty`); + reject(); + } + if (reqtype.length === 1) { + cons.w( + `FetchEngine.classic: reqs array is only one element,this request will downgrade to normal fetch` + ); + resolve(FetchEngine.fetch((reqs as Request[])[0], config)); + } + } + const controller = new AbortController(); + const PauseProgress = async (res: Response) => { + return new Response(await res.arrayBuffer(), { + status: res.status, + headers: res.headers, + statusText: res.statusText, + }); + }; + + Promise.any( + (reqs as Request[]).map((req) => { + fetch(req, { + signal: controller.signal, + mode: config.mode, + credentials: config.credentials, + redirect: config.redirect || "follow", + }) + .then(PauseProgress) + .then((res) => { + if ( + config.status && + res.status.toString().match(config.status.toString()) + ) { + controller.abort(); + resolve(res); + } + }) + .catch((err) => { + if (err == "DOMException: The user aborted a request.") + console.log(); //To disable the warning:DOMException: The user aborted a request. + }); + }) + ); + + setTimeout(() => { + reject( + new Response( + "504 All GateWays Failed,ClientWorker Show This Page,Engine Classic", + { status: 504, statusText: "504 All Gateways Timeout" } + ) + ); + }, config.timeout || 5000); + }); + }, + parallel: async (reqs, config) => { + return new Promise((resolve, reject) => { + config = config || { status: 200 }; + const reqtype = Object.prototype.toString.call(reqs); + if (reqtype === "[object String]" || reqtype === "[object Request]") { + cons.w( + `FetchEngine.parallel: reqs should be an array,but got ${reqtype},this request will downgrade to normal fetch` + ); + resolve(FetchEngine.fetch(reqs as Request, config)); + } else if (reqtype !== "[object Array]") { + cons.e( + `FetchEngine.parallel: reqs must be a string , Request or Array object,but got ${reqtype}` + ); + reject(); + } else if (reqtype === "[object Array]") { + if (reqtype.length === 0) { + cons.e(`FetchEngine.parallel: reqs array is empty`); + reject(); + } + if (reqtype.length === 1) { + cons.w( + `FetchEngine.parallel: reqs array is only one element,this request will downgrade to normal fetch` + ); + resolve(FetchEngine.fetch((reqs as Request[])[0], config)); + } + } + const abortEvent = new Event("abortOtherInstance"); + const eventTarget = new EventTarget(); + Promise.any( + (reqs as Request[]).map(async (req) => { + let controller = new AbortController(), + tagged = false; + eventTarget.addEventListener(abortEvent.type, () => { + if (!tagged) controller.abort(); + }); + fetch(req, { + signal: controller.signal, + mode: config.mode, + credentials: config.credentials, + redirect: config.redirect || "follow", + }) + .then((res) => { + if ( + config.status && + res.status.toString().match(config.status.toString()) + ) { + tagged = true; + eventTarget.dispatchEvent(abortEvent); + resolve(rebuild.response(res, {})); + } + }) + .catch((err) => { + if (err == "DOMException: The user aborted a request.") + console.log(); //To disable the warning:DOMException: The user aborted a request. + }); + }) + ); + + setTimeout(() => { + reject( + new Response( + "504 All GateWays Failed,ClientWorker Show This Page,Engine Parallel", + { status: 504, statusText: "504 All Gateways Timeout" } + ) + ); + }, config.timeout || 5000); + }); + }, +}; + +export default FetchEngine; diff --git a/main/utils/rebuild.js b/main/utils/rebuild.js deleted file mode 100644 index c44cafd..0000000 --- a/main/utils/rebuild.js +++ /dev/null @@ -1,46 +0,0 @@ -import cons from "./cons.js" -const rebuild = { - request:(req, init) => { - req = req.clone() - if (req.mode === 'navigate') { - cons.w(`You can't rebuild a POST method with body when it is a navigate request.ClientWorker will ignore it's body`) - } - let nReq = new Request(req, { - headers: rebuildheaders(req, init.headers), - method: init.method || req.method, - mode: req.mode === 'navigate' ? "same-origin" : (init.mode || req.mode), - credentials: init.credentials || req.credentials, - redirect: init.redirect || req.redirect - }) - if (!!init.url) nReq = new Request(init.url, nReq) - return nReq - }, - response:(res, init) => { - if(res.type === 'opaque') { - cons.e(`You can't rebuild a opaque response.ClientWorker will ignore this build`) - return res - } - let nRes = new Response(res.body, { - headers: rebuildheaders(res, init.headers), - status: init.status || res.status, - statusText: init.statusText || res.statusText - }) - return nRes - } -} - -const rebuildheaders = (re, headers) => { - if (!!headers) { - const nHeaders = new Headers(re.headers) - for (let key in headers) { - if (headers[key] !== undefined) { - nHeaders.set(key, headers[key]) - } else { - nHeaders.delete(key) - } - } - return nHeaders - } - return new Headers(re.headers) -} -export default rebuild \ No newline at end of file diff --git a/main/utils/rebuild.ts b/main/utils/rebuild.ts new file mode 100644 index 0000000..3de5c3d --- /dev/null +++ b/main/utils/rebuild.ts @@ -0,0 +1,53 @@ +import cons from "./cons.js"; + +const rebuild = { + request: (req: Request, init: Partial) => { + req = req.clone(); + if (req.mode === "navigate") { + cons.w( + `You can't rebuild a POST method with body when it is a navigate request.ClientWorker will ignore it's body` + ); + } + let nReq = new Request(req, { + headers: rebuildheaders(req, init.headers), + method: init.method || req.method, + mode: req.mode === "navigate" ? "same-origin" : init.mode || req.mode, + credentials: init.credentials || req.credentials, + redirect: init.redirect || req.redirect, + }); + if (!!init.url) nReq = new Request(init.url, nReq); + return nReq; + }, + response: (res: Response, init: Partial) => { + if (res.type === "opaque") { + cons.e( + `You can't rebuild a opaque response.ClientWorker will ignore this build` + ); + return res; + } + let nRes = new Response(res.body, { + headers: rebuildheaders(res, init.headers), + status: init.status || res.status, + statusText: init.statusText || res.statusText, + }); + return nRes; + }, +}; + +const rebuildheaders = ( + re: Request | Response, + headers: HeadersInit | undefined +) => { + if (!!headers) { + const nHeaders = new Headers(re.headers); + Object.entries(headers).forEach(([key, value]) => { + if (!value) { + nHeaders.delete(key); + } else nHeaders.set(key, value); + }); + return nHeaders; + } + return new Headers(re.headers); +}; + +export default rebuild; diff --git a/package.json b/package.json index acc6cdc..03cfad8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "A simple, globally hijacked, easily customizable, Service Worker-based front-end worker", "main": "./dist/cw.js", "scripts": { - "build": "webpack ./main/entry.js -c ./cw.config.js && cp -r static/* dist " + "build": "rimraf dist && node --loader esbuild-register/loader -r esbuild-register build.ts " }, "type": "module", "repository": { @@ -28,7 +28,16 @@ "vue": "^3.2.37" }, "devDependencies": { + "@types/js-yaml": "^4.0.5", + "esbuild": "^0.15.14", + "esbuild-copy-static-files": "^0.1.0", + "esbuild-register": "^3.4.1", + "json-schema-to-ts": "^2.6.0", + "rimraf": "^3.0.2", "terser-webpack-plugin": "^5.3.3", - "webpack-bundle-analyzer": "^4.5.0" + "typescript": "^4.9.3", + "webpack": "^5.75.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-cli": "^5.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..3d50e04 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1806 @@ +lockfileVersion: 5.4 + +importers: + + .: + specifiers: + '@chenyfan/cache-db': ^0.0.4 + '@types/js-yaml': ^4.0.5 + esbuild: ^0.15.14 + esbuild-copy-static-files: ^0.1.0 + esbuild-register: ^3.4.1 + js-yaml: ^4.1.0 + json-schema-to-ts: ^2.6.0 + rimraf: ^3.0.2 + terser-webpack-plugin: ^5.3.3 + typescript: ^4.9.3 + vitepress: ^1.0.0-alpha.4 + vue: ^3.2.37 + webpack: ^5.75.0 + webpack-bundle-analyzer: ^4.5.0 + webpack-cli: ^5.0.0 + dependencies: + '@chenyfan/cache-db': 0.0.4 + js-yaml: 4.1.0 + vitepress: 1.0.0-alpha.29 + vue: 3.2.45 + devDependencies: + '@types/js-yaml': 4.0.5 + esbuild: 0.15.14 + esbuild-copy-static-files: 0.1.0 + esbuild-register: 3.4.1_esbuild@0.15.14 + json-schema-to-ts: 2.6.0 + rimraf: 3.0.2 + terser-webpack-plugin: 5.3.6_nserppduo6sp4es5vhgxpj3zoq + typescript: 4.9.3 + webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u + webpack-bundle-analyzer: 4.7.0 + webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm + + doc: + specifiers: {} + +packages: + + /@algolia/autocomplete-core/1.7.2: + resolution: {integrity: sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==} + dependencies: + '@algolia/autocomplete-shared': 1.7.2 + dev: false + + /@algolia/autocomplete-preset-algolia/1.7.2_algoliasearch@4.14.2: + resolution: {integrity: sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/autocomplete-shared': 1.7.2 + algoliasearch: 4.14.2 + dev: false + + /@algolia/autocomplete-shared/1.7.2: + resolution: {integrity: sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==} + dev: false + + /@algolia/cache-browser-local-storage/4.14.2: + resolution: {integrity: sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==} + dependencies: + '@algolia/cache-common': 4.14.2 + dev: false + + /@algolia/cache-common/4.14.2: + resolution: {integrity: sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==} + dev: false + + /@algolia/cache-in-memory/4.14.2: + resolution: {integrity: sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==} + dependencies: + '@algolia/cache-common': 4.14.2 + dev: false + + /@algolia/client-account/4.14.2: + resolution: {integrity: sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==} + dependencies: + '@algolia/client-common': 4.14.2 + '@algolia/client-search': 4.14.2 + '@algolia/transporter': 4.14.2 + dev: false + + /@algolia/client-analytics/4.14.2: + resolution: {integrity: sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==} + dependencies: + '@algolia/client-common': 4.14.2 + '@algolia/client-search': 4.14.2 + '@algolia/requester-common': 4.14.2 + '@algolia/transporter': 4.14.2 + dev: false + + /@algolia/client-common/4.14.2: + resolution: {integrity: sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==} + dependencies: + '@algolia/requester-common': 4.14.2 + '@algolia/transporter': 4.14.2 + dev: false + + /@algolia/client-personalization/4.14.2: + resolution: {integrity: sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==} + dependencies: + '@algolia/client-common': 4.14.2 + '@algolia/requester-common': 4.14.2 + '@algolia/transporter': 4.14.2 + dev: false + + /@algolia/client-search/4.14.2: + resolution: {integrity: sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==} + dependencies: + '@algolia/client-common': 4.14.2 + '@algolia/requester-common': 4.14.2 + '@algolia/transporter': 4.14.2 + dev: false + + /@algolia/logger-common/4.14.2: + resolution: {integrity: sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==} + dev: false + + /@algolia/logger-console/4.14.2: + resolution: {integrity: sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==} + dependencies: + '@algolia/logger-common': 4.14.2 + dev: false + + /@algolia/requester-browser-xhr/4.14.2: + resolution: {integrity: sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==} + dependencies: + '@algolia/requester-common': 4.14.2 + dev: false + + /@algolia/requester-common/4.14.2: + resolution: {integrity: sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==} + dev: false + + /@algolia/requester-node-http/4.14.2: + resolution: {integrity: sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==} + dependencies: + '@algolia/requester-common': 4.14.2 + dev: false + + /@algolia/transporter/4.14.2: + resolution: {integrity: sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==} + dependencies: + '@algolia/cache-common': 4.14.2 + '@algolia/logger-common': 4.14.2 + '@algolia/requester-common': 4.14.2 + dev: false + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/parser/7.20.3: + resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.2 + dev: false + + /@babel/types/7.20.2: + resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: false + + /@chenyfan/cache-db/0.0.4: + resolution: {integrity: sha512-kDOxRQ68OlrbQhXehHxc6BjTvr0sVXhCV45uucN5Jk6qKahEtRguA/orTh43ZAwnZ34LEdyj62kRXik8vq+fNg==} + dev: false + + /@discoveryjs/json-ext/0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@docsearch/css/3.3.0: + resolution: {integrity: sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==} + dev: false + + /@docsearch/js/3.3.0: + resolution: {integrity: sha512-oFXWRPNvPxAzBhnFJ9UCFIYZiQNc3Yrv6912nZHw/UIGxsyzKpNRZgHq8HDk1niYmOSoLKtVFcxkccpQmYGFyg==} + dependencies: + '@docsearch/react': 3.3.0 + preact: 10.11.3 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + dev: false + + /@docsearch/react/3.3.0: + resolution: {integrity: sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.7.2 + '@algolia/autocomplete-preset-algolia': 1.7.2_algoliasearch@4.14.2 + '@docsearch/css': 3.3.0 + algoliasearch: 4.14.2 + transitivePeerDependencies: + - '@algolia/client-search' + dev: false + + /@esbuild/android-arm/0.15.14: + resolution: {integrity: sha512-+Rb20XXxRGisNu2WmNKk+scpanb7nL5yhuI1KR9wQFiC43ddPj/V1fmNyzlFC9bKiG4mYzxW7egtoHVcynr+OA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64/0.15.14: + resolution: {integrity: sha512-eQi9rosGNVQFJyJWV0HCA5WZae/qWIQME7s8/j8DMvnylfBv62Pbu+zJ2eUDqNf2O4u3WB+OEXyfkpBoe194sg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map/0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@polka/url/1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + + /@types/eslint-scope/3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.4.10 + '@types/estree': 0.0.51 + dev: true + + /@types/eslint/8.4.10: + resolution: {integrity: sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==} + dependencies: + '@types/estree': 0.0.51 + '@types/json-schema': 7.0.11 + dev: true + + /@types/estree/0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: true + + /@types/js-yaml/4.0.5: + resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/node/18.11.9: + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + dev: true + + /@types/web-bluetooth/0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + dev: false + + /@vitejs/plugin-vue/3.2.0_vite@3.2.4+vue@3.2.45: + resolution: {integrity: sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.2.25 + dependencies: + vite: 3.2.4 + vue: 3.2.45 + dev: false + + /@vue/compiler-core/3.2.45: + resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} + dependencies: + '@babel/parser': 7.20.3 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: false + + /@vue/compiler-dom/3.2.45: + resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==} + dependencies: + '@vue/compiler-core': 3.2.45 + '@vue/shared': 3.2.45 + dev: false + + /@vue/compiler-sfc/3.2.45: + resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==} + dependencies: + '@babel/parser': 7.20.3 + '@vue/compiler-core': 3.2.45 + '@vue/compiler-dom': 3.2.45 + '@vue/compiler-ssr': 3.2.45 + '@vue/reactivity-transform': 3.2.45 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.19 + source-map: 0.6.1 + dev: false + + /@vue/compiler-ssr/3.2.45: + resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} + dependencies: + '@vue/compiler-dom': 3.2.45 + '@vue/shared': 3.2.45 + dev: false + + /@vue/devtools-api/6.4.5: + resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} + dev: false + + /@vue/reactivity-transform/3.2.45: + resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} + dependencies: + '@babel/parser': 7.20.3 + '@vue/compiler-core': 3.2.45 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 + magic-string: 0.25.9 + dev: false + + /@vue/reactivity/3.2.45: + resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} + dependencies: + '@vue/shared': 3.2.45 + dev: false + + /@vue/runtime-core/3.2.45: + resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==} + dependencies: + '@vue/reactivity': 3.2.45 + '@vue/shared': 3.2.45 + dev: false + + /@vue/runtime-dom/3.2.45: + resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==} + dependencies: + '@vue/runtime-core': 3.2.45 + '@vue/shared': 3.2.45 + csstype: 2.6.21 + dev: false + + /@vue/server-renderer/3.2.45_vue@3.2.45: + resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==} + peerDependencies: + vue: 3.2.45 + dependencies: + '@vue/compiler-ssr': 3.2.45 + '@vue/shared': 3.2.45 + vue: 3.2.45 + dev: false + + /@vue/shared/3.2.45: + resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} + dev: false + + /@vueuse/core/9.5.0_vue@3.2.45: + resolution: {integrity: sha512-6GsWBsJHEb3sYw15mbLrcbslAVY45pkzjJYTKYKCXv88z7srAF0VEW0q+oXKsl58tCbqooplInahXFg8Yo1m4w==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.5.0 + '@vueuse/shared': 9.5.0_vue@3.2.45 + vue-demi: 0.13.11_vue@3.2.45 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata/9.5.0: + resolution: {integrity: sha512-4M1AyPZmIv41pym+K5+4wup3bKuYebbH8w8BROY1hmT7rIwcyS4tEL+UsGz0Hiu1FCOxcoBrwtAizc0YmBJjyQ==} + dev: false + + /@vueuse/shared/9.5.0_vue@3.2.45: + resolution: {integrity: sha512-HnnCWU1Vg9CVWRCcI8ohDKDRB2Sc4bTgT1XAIaoLSfVHHn+TKbrox6pd3klCSw4UDxkhDfOk8cAdcK+Z5KleCA==} + dependencies: + vue-demi: 0.13.11_vue@3.2.45 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@webassemblyjs/ast/1.11.1: + resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + dev: true + + /@webassemblyjs/floating-point-hex-parser/1.11.1: + resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + dev: true + + /@webassemblyjs/helper-api-error/1.11.1: + resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + dev: true + + /@webassemblyjs/helper-buffer/1.11.1: + resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + dev: true + + /@webassemblyjs/helper-numbers/1.11.1: + resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode/1.11.1: + resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + dev: true + + /@webassemblyjs/helper-wasm-section/1.11.1: + resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + dev: true + + /@webassemblyjs/ieee754/1.11.1: + resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128/1.11.1: + resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8/1.11.1: + resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + dev: true + + /@webassemblyjs/wasm-edit/1.11.1: + resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/helper-wasm-section': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-opt': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/wast-printer': 1.11.1 + dev: true + + /@webassemblyjs/wasm-gen/1.11.1: + resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + + /@webassemblyjs/wasm-opt/1.11.1: + resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + dev: true + + /@webassemblyjs/wasm-parser/1.11.1: + resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + + /@webassemblyjs/wast-printer/1.11.1: + resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + + /@webpack-cli/configtest/2.0.0_5mhpyft47fxnqdave7meqiud7i: + resolution: {integrity: sha512-war4OU8NGjBqU3DP3bx6ciODXIh7dSXcpQq+P4K2Tqyd8L5OjZ7COx9QXx/QdCIwL2qoX09Wr4Cwf7uS4qdEng==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u + webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm + dev: true + + /@webpack-cli/info/2.0.0_5mhpyft47fxnqdave7meqiud7i: + resolution: {integrity: sha512-NNxDgbo4VOkNhOlTgY0Elhz3vKpOJq4/PKeKg7r8cmYM+GQA9vDofLYyup8jS6EpUvhNmR30cHTCEIyvXpskwA==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u + webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm + dev: true + + /@webpack-cli/serve/2.0.0_5mhpyft47fxnqdave7meqiud7i: + resolution: {integrity: sha512-Rumq5mHvGXamnOh3O8yLk1sjx8dB30qF1OeR6VC00DIR6SLJ4bwwUGKC4pE7qBFoQyyh0H9sAg3fikYgAqVR0w==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u + webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm + dev: true + + /@xtuc/ieee754/1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long/4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /acorn-import-assertions/1.8.0_acorn@8.8.1: + resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.8.1 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv-keywords/3.5.2_ajv@6.12.6: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /algoliasearch/4.14.2: + resolution: {integrity: sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==} + dependencies: + '@algolia/cache-browser-local-storage': 4.14.2 + '@algolia/cache-common': 4.14.2 + '@algolia/cache-in-memory': 4.14.2 + '@algolia/client-account': 4.14.2 + '@algolia/client-analytics': 4.14.2 + '@algolia/client-common': 4.14.2 + '@algolia/client-personalization': 4.14.2 + '@algolia/client-search': 4.14.2 + '@algolia/logger-common': 4.14.2 + '@algolia/logger-console': 4.14.2 + '@algolia/requester-browser-xhr': 4.14.2 + '@algolia/requester-common': 4.14.2 + '@algolia/requester-node-http': 4.14.2 + '@algolia/transporter': 4.14.2 + dev: false + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /body-scroll-lock/4.0.0-beta.0: + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} + dev: false + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001431 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /caniuse-lite/1.0.30001431: + resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chrome-trace-event/1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /clone-deep/4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette/2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander/9.4.1: + resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype/2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + dev: false + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /duplexer/0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /enhanced-resolve/5.10.0: + resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.10 + tapable: 2.2.1 + dev: true + + /envinfo/7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /es-module-lexer/0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + + /esbuild-android-64/0.15.14: + resolution: {integrity: sha512-HuilVIb4rk9abT4U6bcFdU35UHOzcWVGLSjEmC58OVr96q5UiRqzDtWjPlCMugjhgUGKEs8Zf4ueIvYbOStbIg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /esbuild-android-arm64/0.15.14: + resolution: {integrity: sha512-/QnxRVxsR2Vtf3XottAHj7hENAMW2wCs6S+OZcAbc/8nlhbAL/bCQRCVD78VtI5mdwqWkVi3wMqM94kScQCgqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /esbuild-copy-static-files/0.1.0: + resolution: {integrity: sha512-KlpmYqANA1t2nZavEdItfcOjJC6wbHA21v35HJWN32DddGTWKNNGDKljUzbCPojmpD+wAw8/DXr5abJ4jFCE0w==} + dev: true + + /esbuild-darwin-64/0.15.14: + resolution: {integrity: sha512-ToNuf1uifu8hhwWvoZJGCdLIX/1zpo8cOGnT0XAhDQXiKOKYaotVNx7pOVB1f+wHoWwTLInrOmh3EmA7Fd+8Vg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /esbuild-darwin-arm64/0.15.14: + resolution: {integrity: sha512-KgGP+y77GszfYJgceO0Wi/PiRtYo5y2Xo9rhBUpxTPaBgWDJ14gqYN0+NMbu+qC2fykxXaipHxN4Scaj9tUS1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /esbuild-freebsd-64/0.15.14: + resolution: {integrity: sha512-xr0E2n5lyWw3uFSwwUXHc0EcaBDtsal/iIfLioflHdhAe10KSctV978Te7YsfnsMKzcoGeS366+tqbCXdqDHQA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /esbuild-freebsd-arm64/0.15.14: + resolution: {integrity: sha512-8XH96sOQ4b1LhMlO10eEWOjEngmZ2oyw3pW4o8kvBcpF6pULr56eeYVP5radtgw54g3T8nKHDHYEI5AItvskZg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /esbuild-linux-32/0.15.14: + resolution: {integrity: sha512-6ssnvwaTAi8AzKN8By2V0nS+WF5jTP7SfuK6sStGnDP7MCJo/4zHgM9oE1eQTS2jPmo3D673rckuCzRlig+HMA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-64/0.15.14: + resolution: {integrity: sha512-ONySx3U0wAJOJuxGUlXBWxVKFVpWv88JEv0NZ6NlHknmDd1yCbf4AEdClSgLrqKQDXYywmw4gYDvdLsS6z0hcw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-arm/0.15.14: + resolution: {integrity: sha512-D2LImAIV3QzL7lHURyCHBkycVFbKwkDb1XEUWan+2fb4qfW7qAeUtul7ZIcIwFKZgPcl+6gKZmvLgPSj26RQ2Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-arm64/0.15.14: + resolution: {integrity: sha512-kle2Ov6a1e5AjlHlMQl1e+c4myGTeggrRzArQFmWp6O6JoqqB9hT+B28EW4tjFWgV/NxUq46pWYpgaWXsXRPAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-mips64le/0.15.14: + resolution: {integrity: sha512-FVdMYIzOLXUq+OE7XYKesuEAqZhmAIV6qOoYahvUp93oXy0MOVTP370ECbPfGXXUdlvc0TNgkJa3YhEwyZ6MRA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-ppc64le/0.15.14: + resolution: {integrity: sha512-2NzH+iuzMDA+jjtPjuIz/OhRDf8tzbQ1tRZJI//aT25o1HKc0reMMXxKIYq/8nSHXiJSnYV4ODzTiv45s+h73w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-riscv64/0.15.14: + resolution: {integrity: sha512-VqxvutZNlQxmUNS7Ac+aczttLEoHBJ9e3OYGqnULrfipRvG97qLrAv9EUY9iSrRKBqeEbSvS9bSfstZqwz0T4Q==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-linux-s390x/0.15.14: + resolution: {integrity: sha512-+KVHEUshX5n6VP6Vp/AKv9fZIl5kr2ph8EUFmQUJnDpHwcfTSn2AQgYYm0HTBR2Mr4d0Wlr0FxF/Cs5pbFgiOw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /esbuild-netbsd-64/0.15.14: + resolution: {integrity: sha512-6D/dr17piEgevIm1xJfZP2SjB9Z+g8ERhNnBdlZPBWZl+KSPUKLGF13AbvC+nzGh8IxOH2TyTIdRMvKMP0nEzQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /esbuild-openbsd-64/0.15.14: + resolution: {integrity: sha512-rREQBIlMibBetgr2E9Lywt2Qxv2ZdpmYahR4IUlAQ1Efv/A5gYdO0/VIN3iowDbCNTLxp0bb57Vf0LFcffD6kA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /esbuild-register/3.4.1_esbuild@0.15.14: + resolution: {integrity: sha512-iCgs88/1wA5dIRx4i65eSjbkgrQQQJGpY6Z1eD2XPlzrSjbgNtfkw2/rfSMzJ4dTtlOD8EZTxrIA3fyYp0FsMA==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4 + esbuild: 0.15.14 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild-sunos-64/0.15.14: + resolution: {integrity: sha512-DNVjSp/BY4IfwtdUAvWGIDaIjJXY5KI4uD82+15v6k/w7px9dnaDaJJ2R6Mu+KCgr5oklmFc0KjBjh311Gxl9Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /esbuild-windows-32/0.15.14: + resolution: {integrity: sha512-pHBWrcA+/oLgvViuG9FO3kNPO635gkoVrRQwe6ZY1S0jdET07xe2toUvQoJQ8KT3/OkxqUasIty5hpuKFLD+eg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /esbuild-windows-64/0.15.14: + resolution: {integrity: sha512-CszIGQVk/P8FOS5UgAH4hKc9zOaFo69fe+k1rqgBHx3CSK3Opyk5lwYriIamaWOVjBt7IwEP6NALz+tkVWdFog==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /esbuild-windows-arm64/0.15.14: + resolution: {integrity: sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /esbuild/0.15.14: + resolution: {integrity: sha512-pJN8j42fvWLFWwSMG4luuupl2Me7mxciUOsMegKvwCmhEbJ2covUdFnihxm0FMIBV+cbwbtMoHgMCCI+pj1btQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.14 + '@esbuild/linux-loong64': 0.15.14 + esbuild-android-64: 0.15.14 + esbuild-android-arm64: 0.15.14 + esbuild-darwin-64: 0.15.14 + esbuild-darwin-arm64: 0.15.14 + esbuild-freebsd-64: 0.15.14 + esbuild-freebsd-arm64: 0.15.14 + esbuild-linux-32: 0.15.14 + esbuild-linux-64: 0.15.14 + esbuild-linux-arm: 0.15.14 + esbuild-linux-arm64: 0.15.14 + esbuild-linux-mips64le: 0.15.14 + esbuild-linux-ppc64le: 0.15.14 + esbuild-linux-riscv64: 0.15.14 + esbuild-linux-s390x: 0.15.14 + esbuild-netbsd-64: 0.15.14 + esbuild-openbsd-64: 0.15.14 + esbuild-sunos-64: 0.15.14 + esbuild-windows-32: 0.15.14 + esbuild-windows-64: 0.15.14 + esbuild-windows-arm64: 0.15.14 + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /events/3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fastest-levenshtein/1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /glob-to-regexp/0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /gzip-size/6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /interpret/3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.11.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-to-ts/2.6.0: + resolution: {integrity: sha512-j6x2ZFCN3exmGAaGusxZYB2mvgpy8I8UkkNmN1H6zlq+3mdBwSQMIsB5iAltGlBLWG4aPTYqeIkit4okTI0s7g==} + dependencies: + '@types/json-schema': 7.0.11 + ts-algebra: 1.1.1 + ts-toolbelt: 9.6.0 + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /loader-runner/4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mrmime/1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /opener/1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /postcss/8.4.19: + resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /preact/10.11.3: + resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + dev: false + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rechoir/0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.1 + dev: true + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup/2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /schema-utils/3.1.1: + resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.11 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + dev: true + + /serialize-javascript/6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true + + /shallow-clone/3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shiki/0.11.1: + resolution: {integrity: sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.6.2 + vscode-textmate: 6.0.0 + dev: false + + /sirv/1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.1 + totalist: 1.1.0 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: false + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /terser-webpack-plugin/5.3.6_nserppduo6sp4es5vhgxpj3zoq: + resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + esbuild: 0.15.14 + jest-worker: 27.5.1 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + terser: 5.15.1 + webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u + dev: true + + /terser/5.15.1: + resolution: {integrity: sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.1 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /totalist/1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + + /ts-algebra/1.1.1: + resolution: {integrity: sha512-W43a3/BN0Tp4SgRNERQF/QPVuY1rnHkgCr/fISLY0Ycu05P0NWPYRuViU8JFn+pFZuY6/zp9TgET1fxMzppR/Q==} + dependencies: + ts-toolbelt: 9.6.0 + dev: true + + /ts-toolbelt/9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + dev: true + + /typescript/4.9.3: + resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /vite/3.2.4: + resolution: {integrity: sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.14 + postcss: 8.4.19 + resolve: 1.22.1 + rollup: 2.79.1 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /vitepress/1.0.0-alpha.29: + resolution: {integrity: sha512-oaRaeMLcN9M3Bxz97fFVF6Gzm3Aqtb0CijTt5TOW0XPzNPuKA0YpFnsmS97gdKmA+VztM6itRJ8K7JJuU0VS3g==} + hasBin: true + dependencies: + '@docsearch/css': 3.3.0 + '@docsearch/js': 3.3.0 + '@vitejs/plugin-vue': 3.2.0_vite@3.2.4+vue@3.2.45 + '@vue/devtools-api': 6.4.5 + '@vueuse/core': 9.5.0_vue@3.2.45 + body-scroll-lock: 4.0.0-beta.0 + shiki: 0.11.1 + vite: 3.2.4 + vue: 3.2.45 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - '@vue/composition-api' + - less + - react + - react-dom + - sass + - stylus + - sugarss + - terser + dev: false + + /vscode-oniguruma/1.6.2: + resolution: {integrity: sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==} + dev: false + + /vscode-textmate/6.0.0: + resolution: {integrity: sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==} + dev: false + + /vue-demi/0.13.11_vue@3.2.45: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.45 + dev: false + + /vue/3.2.45: + resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==} + dependencies: + '@vue/compiler-dom': 3.2.45 + '@vue/compiler-sfc': 3.2.45 + '@vue/runtime-dom': 3.2.45 + '@vue/server-renderer': 3.2.45_vue@3.2.45 + '@vue/shared': 3.2.45 + dev: false + + /watchpack/2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + dev: true + + /webpack-bundle-analyzer/4.7.0: + resolution: {integrity: sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + acorn: 8.8.1 + acorn-walk: 8.2.0 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /webpack-cli/5.0.0_zfjer5eiwvoit4zaxwbfe5plkm: + resolution: {integrity: sha512-AACDTo20yG+xn6HPW5xjbn2Be4KUzQPebWXsDMHwPPyKh9OnTOJgZN2Nc+g/FZKV3ObRTYsGvibAvc+5jAUrVA==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.0.0_5mhpyft47fxnqdave7meqiud7i + '@webpack-cli/info': 2.0.0_5mhpyft47fxnqdave7meqiud7i + '@webpack-cli/serve': 2.0.0_5mhpyft47fxnqdave7meqiud7i + colorette: 2.0.19 + commander: 9.4.1 + cross-spawn: 7.0.3 + envinfo: 7.8.1 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u + webpack-bundle-analyzer: 4.7.0 + webpack-merge: 5.8.0 + dev: true + + /webpack-merge/5.8.0: + resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.0 + dev: true + + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack/5.75.0_3yspk5gilc3yrxqbmqkdigh33u: + resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 0.0.51 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.8.1 + acorn-import-assertions: 1.8.0_acorn@8.8.1 + browserslist: 4.21.4 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.10.0 + es-module-lexer: 0.9.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.1.1 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.6_nserppduo6sp4es5vhgxpj3zoq + watchpack: 2.4.0 + webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wildcard/2.0.0: + resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true diff --git a/static/autoupdate.js b/static/autoupdate.js index c3810a4..1160b8a 100644 --- a/static/autoupdate.js +++ b/static/autoupdate.js @@ -1,53 +1,63 @@ -;(async (updateSWDelay, updateConfigDelay) => { - const LSDB = { - read: (key) => { - return localStorage.getItem(key); - }, - write: (key, value) => { - localStorage.setItem(key, value); - } - } - async function updateSW() { - if (navigator.serviceWorker) { - navigator.serviceWorker.getRegistrations().then(async registrations => { - for (let registration of registrations) { - await registration.unregister(); - } - console.log(`Unregistered service workers`); - }).then(() => { - //register new service worker in /cw.js - navigator.serviceWorker.register('/cw.js').then(async registration => { - console.log(`Registered service worker`); - await registration.update(); - LSDB.write('cw_time_sw', new Date().getTime()); - }) - }) - } - }; - async function updateConfig() { - await fetch('/cw-cgi/api?type=config').then(res => res.text()).then(res => { - if (res === 'ok') { - console.log(`Config updated`); - LSDB.write('cw_time_config', new Date().getTime()); - } else { - console.log(`Config update failed`); - } +(async (updateSWDelay, updateConfigDelay) => { + const LSDB = { + read: (key) => { + return localStorage.getItem(key); + }, + write: (key, value) => { + localStorage.setItem(key, value); + }, + }; + async function updateSW() { + if (navigator.serviceWorker) { + navigator.serviceWorker + .getRegistrations() + .then(async (registrations) => { + for (let registration of registrations) { + await registration.unregister(); + } + console.log(`Unregistered service workers`); }) + .then(() => { + //register new service worker in /cw.js + navigator.serviceWorker + .register("/cw.js") + .then(async (registration) => { + console.log(`Registered service worker`); + await registration.update(); + LSDB.write("cw_time_sw", new Date().getTime()); + }); + }); } + } + async function updateConfig() { + await fetch("/cw-cgi/api?type=config") + .then((res) => res.text()) + .then((res) => { + if (res === "ok") { + console.log(`Config updated`); + LSDB.write("cw_time_config", new Date().getTime()); + } else { + console.log(`Config update failed`); + } + }); + } - if (Number(LSDB.read('cw_time_sw')) < new Date().getTime() - updateSWDelay) { - await updateSW(); - await updateConfig(); - } - if (Number(LSDB.read('cw_time_config')) < new Date().getTime() - updateConfigDelay) { - await updateConfig(); - } + if (Number(LSDB.read("cw_time_sw")) < new Date().getTime() - updateSWDelay) { + await updateSW(); + await updateConfig(); + } + if ( + Number(LSDB.read("cw_time_config")) < + new Date().getTime() - updateConfigDelay + ) { + await updateConfig(); + } - setInterval(async () => { - await updateSW(); - await updateConfig(); - }, updateSWDelay); - setInterval(async () => { - await updateConfig() - }, updateConfigDelay); -})(1000 * 60 * 60 * 12, 1000 * 60); \ No newline at end of file + setInterval(async () => { + await updateSW(); + await updateConfig(); + }, updateSWDelay); + setInterval(async () => { + await updateConfig(); + }, updateConfigDelay); +})(1000 * 60 * 60 * 12, 1000 * 60); diff --git a/static/config.schema.json b/static/config.schema.json index bc9f3c1..498e8b9 100644 --- a/static/config.schema.json +++ b/static/config.schema.json @@ -6,20 +6,14 @@ "type": "object", "additionalProperties": false, "properties": { - "name": { - "type": "string" - }, + "name": { "type": "string" }, "hotpatch": { "type": "array", "items": { "type": "string", "format": "uri", - "qt-uri-protocols": [ - "https" - ], - "qt-uri-extensions": [ - ".js" - ] + "qt-uri-protocols": ["https"], + "qt-uri-extensions": [".js"] } }, "hotconfig": { @@ -27,200 +21,111 @@ "items": { "type": "string", "format": "uri", - "qt-uri-protocols": [ - "https" - ], - "qt-uri-extensions": [ - ".yaml" - ] + "qt-uri-protocols": ["https"], + "qt-uri-extensions": [".yaml"] } }, - "cleaninterval": { - "type": "string" - }, + "cleaninterval": { "type": "string" }, "catch_rules": { "type": "array", - "items": { - "$ref": "#/definitions/CatchRule" - } + "items": { "$ref": "#/definitions/CatchRule" } } }, - "required": [ - "catch_rules", - "name" - ], + "required": ["catch_rules", "name"], "title": "Clientworker" }, "CatchRule": { "type": "object", "additionalProperties": false, "properties": { - "rule": { - "type": "string" - }, + "rule": { "type": "string" }, "transform_rules": { "type": "array", - "items": { - "$ref": "#/definitions/TransformRule" - } + "items": { "$ref": "#/definitions/TransformRule" } } }, - "required": [ - "rule", - "transform_rules" - ], + "required": ["rule", "transform_rules"], "title": "CatchRule" }, "TransformRule": { "type": "object", "additionalProperties": false, "properties": { - "search": { - "type": "string" - }, - "searchin": { - "type": "string" - }, - "replace": { - "$ref": "#/definitions/Replace" - }, + "search": { "type": "string" }, + "searchin": { "type": "string" }, + "replace": { "$ref": "#/definitions/Replace" }, "action": { "type": "string", - "enum": [ - "redirect", - "return", - "fetch", - "script" - ] - }, - "redirect": { - "$ref": "#/definitions/Redirect" - }, - "script": { - "$ref": "#/definitions/Script" - }, - "fetch": { - "$ref": "#/definitions/Fetch" - }, - "header": { - "$ref": "#/definitions/Header" - }, - "searchkey": { - "type": "string" - }, - "replacein": { - "type": "string" - }, - "replacekey": { - "type": "string" - }, - "searchflags": { - "type": "string" - }, - "replaceflags": { - "type": "string" - }, - "return": { - "$ref": "#/definitions/Return" - } + "enum": ["redirect", "return", "fetch", "script", "skip"] + }, + "redirect": { "$ref": "#/definitions/Redirect" }, + "script": { "$ref": "#/definitions/Script" }, + "fetch": { "$ref": "#/definitions/Fetch" }, + "header": { "$ref": "#/definitions/Header" }, + "searchkey": { "type": "string" }, + "replacein": { "type": "string" }, + "replacekey": { "type": "string" }, + "searchflags": { "type": "string" }, + "replaceflags": { "type": "string" }, + "return": { "$ref": "#/definitions/Return" } }, - "required": [ - "search" - ], + "required": ["search", "fetch", "return"], "title": "TransformRule" }, "Fetch": { "type": "object", "additionalProperties": false, "properties": { - "status": { - "type": "integer" - }, + "status": { "type": "integer" }, "engine": { "type": "string", - "enum": [ - "fetch", - "Crazy", - "Classic", - "Parallel", - "KFCThursdayVW50" - ] - }, - "preflight": { - "type": "boolean" - }, - "timeout": { - "type": "integer" - }, - "cache": { - "$ref": "#/definitions/Cache" - }, - "threads": { - "type": "integer" - }, - "enable": { - "type": "boolean" - } + "enum": ["fetch", "crazy", "classic", "parallel", "KFCThursdayVW50"] + }, + "preflight": { "type": "boolean" }, + "credentials": { "type": "string" }, + "trylimit": { "type": "number" }, + "redirect": { "type": "string" }, + "mode": { "type": "string" }, + "timeout": { "type": "integer" }, + "cache": { "$ref": "#/definitions/Cache" }, + "threads": { "type": "integer" }, + "enable": { "type": "boolean" } }, - "required": [ - "engine", - "preflight" - ], + "required": ["engine", "preflight"], "title": "Fetch" }, "Cache": { "type": "object", "additionalProperties": false, "properties": { - "expire": { - "type": "string" - }, - "delay": { - "type": "integer" - }, - "enable": { - "type": "boolean" - } + "expire": { "type": "string" }, + "delay": { "type": "integer" }, + "enable": { "type": "boolean" } }, - "required": [ - "expire" - ], + "required": ["expire"], "title": "Cache" }, "Header": { "type": "object", "additionalProperties": false, "properties": { - "content-type": { - "type": "string" - }, - "ServerProvide": { - "type": "string" - } + "content-type": { "type": "string" }, + "ServerProvide": { "type": "string" } }, - "required": [ - "ServerProvide", - "content-type" - ], + "required": ["ServerProvide", "content-type"], "title": "Header" }, "Redirect": { "type": "object", "additionalProperties": false, "properties": { - "to": { - "type": "string" - }, + "to": { "type": "string" }, "url": { "type": "string", "format": "uri", - "qt-uri-protocols": [ - "https" - ] + "qt-uri-protocols": ["https"] }, - "status": { - "type": "integer" - } + "status": { "type": "integer" } }, "required": [], "title": "Redirect" @@ -229,40 +134,22 @@ "type": "object", "additionalProperties": false, "properties": { - "body": { - "type": "string" - }, - "header": { - "$ref": "#/definitions/Header" - }, - "status": { - "type": "integer" - } + "body": { "type": "string" }, + "header": { "$ref": "#/definitions/Header" }, + "status": { "type": "integer" } }, - "required": [ - "body", - "header", - "status" - ], + "required": ["body", "header", "status"], "title": "Return" }, "Script": { "type": "object", "additionalProperties": false, "properties": { - "name": { - "type": "string" - }, - "skip": { - "type": "boolean" - }, - "function": { - "type": "string" - } + "name": { "type": "string" }, + "skip": { "type": "boolean" }, + "function": { "type": "string" } }, - "required": [ - "skip" - ], + "required": ["skip"], "title": "Script" }, "Replace": { @@ -272,14 +159,10 @@ "items": { "type": "string", "format": "uri", - "qt-uri-protocols": [ - "https" - ] + "qt-uri-protocols": ["https"] } }, - { - "type": "string" - } + { "type": "string" } ], "title": "Replace" } diff --git a/static/config.yaml b/static/config.yaml index 0b194c4..410f272 100644 --- a/static/config.yaml +++ b/static/config.yaml @@ -1,107 +1,99 @@ name: ClientWorker Docs Config hotpatch: - - https://raw.githubusercontent.com/ChenYFan/ClientWorker/gh-pages/cw.js + - https://raw.githubusercontent.com/ChenYFan/ClientWorker/gh-pages/cw.js hotconfig: - - https://raw.githubusercontent.com/ChenYFan/ClientWorker/gh-pages/config.yaml + - https://raw.githubusercontent.com/ChenYFan/ClientWorker/gh-pages/config.yaml cleaninterval: 1000*20 -catch_rules: - - rule: _ - transform_rules: - - search: \#.* - searchin: url - replace: '' - - search: \?.* - replace: '' - - search: ([^\/.]+)\/index(|\.html)$ - action: redirect - redirect: - to: $1/ - - search: \/google$ - action: redirect - redirect: - url: https://google.com - status: 301 +catch_rules: + - rule: _ + transform_rules: + - search: \#.* + searchin: url + replace: "" + - search: \?.* + replace: "" + - search: ([^\/.]+)\/index(|\.html)$ + action: redirect + redirect: + to: $1/ + - search: \/google$ + action: redirect + redirect: + url: https://google.com + status: 301 - - search: \/time$ - action: script - script: - name: gettime - skip: true - - search: \/timefunction$ - action: script - script: - function: ()=>{return {fetched:true,response:new Response(new Date().toString())}} - skip: true - - - search: \/([^\/.]+)$ - action: redirect - redirect: - to: /$1.html - status: 301 - - - search: ([^\/.]+)\/$ - replace: $1/index.html - - - - - - search: _ - replace: docroot/clientworker@3.0.0-beta-4/doc/docs/.vitepress/dist + - search: \/time$ + action: script + script: + name: gettime + skip: true + - search: \/timefunction$ + action: script + script: + function: ()=>{return {fetched:true,response:new Response(new Date().toString())}} + skip: true + - search: \/([^\/.]+)$ + action: redirect + redirect: + to: /$1.html + status: 301 - - search: ^https\:\/\/docroot - replace: - - https://cdn.jsdelivr.net/npm - - https://cdn1.tianli0.top/npm - - https://jsd.onmicrosoft.cn/npm - - https://unpkg.onmicrosoft.cn - - https://unpkg.com - - https://npm.sourcegcdn.com - action: fetch - fetch: - status: 200 - engine: parallel - preflight: false - timeout: 5000 - cache: - expire: 1000*10 - delay: 3000 - - - search: \.html$ - header: - content-type: text/html;charset=utf-8 - ServerProvide: ClientWorker - - - rule: ^https\:\/\/npmm\/chenyfan\-os\@0\.0\.0\-r24\/(.*)\.jpg$ - transform_rules: - - search: image\/webp - searchin: header - searchkey: Accept - replace: .webp - replacein: url - replacekey: .jpg - - rule: ^https\:\/\/cdn\.jsdelivr\.net\/npm\/chenyfan\-happypic\@0\.0\.33\/1\.jpg$ - transform_rules: - - search: _ - action: fetch - fetch: - status: 200 - engine: crazy - preflight: false - threads: 5 - timeout: 30000 - cache: - enable: true - expire: 1000*60 + - search: ([^\/.]+)\/$ + replace: $1/index.html + - search: _ + replace: docroot/clientworker@3.0.0-beta-4/doc/docs/.vitepress/dist + - search: ^https\:\/\/docroot + replace: + - https://cdn.jsdelivr.net/npm + - https://cdn1.tianli0.top/npm + - https://jsd.onmicrosoft.cn/npm + - https://unpkg.onmicrosoft.cn + - https://unpkg.com + - https://npm.sourcegcdn.com + action: fetch + fetch: + status: 200 + engine: parallel + preflight: false + timeout: 5000 + cache: + expire: 1000*10 + delay: 3000 + - search: \.html$ + header: + content-type: text/html;charset=utf-8 + ServerProvide: ClientWorker + - rule: ^https\:\/\/npmm\/chenyfan\-os\@0\.0\.0\-r24\/(.*)\.jpg$ + transform_rules: + - search: image\/webp + searchin: header + searchkey: Accept + replace: .webp + replacein: url + replacekey: .jpg + - rule: ^https\:\/\/cdn\.jsdelivr\.net\/npm\/chenyfan\-happypic\@0\.0\.33\/1\.jpg$ + transform_rules: + - search: _ + action: fetch + fetch: + status: 200 + engine: crazy + preflight: false + threads: 5 + timeout: 30000 + cache: + enable: true + expire: 1000*60 - - rule: ^https\:\/\/npmm\/ - transform_rules: - - search: _ - replace: + - rule: ^https\:\/\/npmm\/ + transform_rules: + - search: _ + replace: - https://npm.elemecdn.com/ - https://cdn.jsdelivr.net/npm/ - https://unpkg.com/ @@ -109,43 +101,42 @@ catch_rules: - https://jsd.onmicrosoft.cn/npm/ - https://unpkg.onmicrosoft.cn/ - https://npm.sourcegcdn.com/ - - search: _ - action: fetch - fetch: - status: 200 - engine: parallel - preflight: false - timeout: 5000 - cache: - enable: true - expire: 1000*60*60*24*7 - delay: 150 - - - rule: ^https\:\/\/npmm\/jquery\@3\.6\.0\/package\.json$ - transform_rules: - - search: jquery - searchin: body - searchflags: g - replace: fakejquery - replacein: body - replaceflags: g - - - - rule: .* - transform_rules: - - search: .* - action: fetch - fetch: + - search: _ + action: fetch + fetch: + status: 200 + engine: parallel + preflight: false + timeout: 5000 + cache: enable: true - engine: fetch - preflight: false - - - search: (^4|^5) - searchin: status - action: return - return: - body: Error! - header: - content-type: text/plain;charset=utf-8 - ServerProvide: ClientWorker - status: 503 + expire: 1000*60*60*24*7 + delay: 150 + + - rule: ^https\:\/\/npmm\/jquery\@3\.6\.0\/package\.json$ + transform_rules: + - search: jquery + searchin: body + searchflags: g + replace: fakejquery + replacein: body + replaceflags: g + + - rule: .* + transform_rules: + - search: .* + action: fetch + fetch: + enable: true + engine: fetch + preflight: false + + - search: (^4|^5) + searchin: status + action: return + return: + body: Error! + header: + content-type: text/plain;charset=utf-8 + ServerProvide: ClientWorker + status: 503 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e4d0a58 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "NodeNext", + "allowSyntheticDefaultImports": true, + "strict": true, + "lib": ["esnext", "WebWorker", "WebWorker.ImportScripts"], + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "noEmit": true, + "isolatedModules": true, + "plugins": [], + "allowJs": true, + "resolveJsonModule": true + } +} diff --git a/types/cacheDB.d.ts b/types/cacheDB.d.ts new file mode 100644 index 0000000..f332fe7 --- /dev/null +++ b/types/cacheDB.d.ts @@ -0,0 +1,42 @@ +// Type definitions for @chenyfan/cache-db 0.0 +// Project: https://www.npmjs.com/package/@chenyfan/cache-db +// Definitions by: AHdark +// lixiang810 +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +declare module "@chenyfan/cache-db" { + namespace CacheDB { + interface Config { + type: "json" | "arrayBuffer" | "blob" | "text" | string; + } + type ReadMethodData = object | ArrayBuffer | Blob | string | null; + type WriteValue = + | ReadableStream + | Blob + | ArrayBufferView + | ArrayBuffer + | FormData + | URLSearchParams + | string; + } + + class CacheDB { + constructor(namespace?: string, prefix?: string); + + namespace: string; + prefix: string; + + read( + key: string, + config?: CacheDB.Config + ): Promise; + write( + key: string | number | boolean, + value: CacheDB.WriteValue, + config?: CacheDB.Config + ): Promise; + delete(key: string): Promise; + } + + export default CacheDB; +} diff --git a/types/configType.ts b/types/configType.ts new file mode 100644 index 0000000..5fe1ca3 --- /dev/null +++ b/types/configType.ts @@ -0,0 +1,250 @@ +import { FromSchema } from "json-schema-to-ts"; + +const configSchema = { + $schema: "http://json-schema.org/draft-06/schema#", + $ref: "#/definitions/ClientWorker", + definitions: { + ClientWorker: { + type: "object", + additionalProperties: false, + properties: { + name: { + type: "string", + }, + hotpatch: { + type: "array", + items: { + type: "string", + format: "uri", + "qt-uri-protocols": ["https"], + "qt-uri-extensions": [".js"], + }, + }, + hotconfig: { + type: "array", + items: { + type: "string", + format: "uri", + "qt-uri-protocols": ["https"], + "qt-uri-extensions": [".yaml"], + }, + }, + cleaninterval: { + type: "string", + }, + catch_rules: { + type: "array", + items: { + $ref: "#/definitions/CatchRule", + }, + }, + }, + required: ["catch_rules", "name"], + title: "Clientworker", + }, + CatchRule: { + type: "object", + additionalProperties: false, + properties: { + rule: { + type: "string", + }, + transform_rules: { + type: "array", + items: { + $ref: "#/definitions/TransformRule", + }, + }, + }, + required: ["rule", "transform_rules"], + title: "CatchRule", + }, + TransformRule: { + type: "object", + additionalProperties: false, + properties: { + search: { + type: "string", + }, + searchin: { + type: "string", + }, + replace: { + $ref: "#/definitions/Replace", + }, + action: { + type: "string", + enum: ["redirect", "return", "fetch", "script", "skip"], + }, + redirect: { + $ref: "#/definitions/Redirect", + }, + script: { + $ref: "#/definitions/Script", + }, + fetch: { + $ref: "#/definitions/Fetch", + }, + header: { + $ref: "#/definitions/Header", + }, + searchkey: { + type: "string", + }, + replacein: { + type: "string", + }, + replacekey: { + type: "string", + }, + searchflags: { + type: "string", + }, + replaceflags: { + type: "string", + }, + return: { + $ref: "#/definitions/Return", + }, + }, + required: ["search", "fetch", "return"], + title: "TransformRule", + }, + Fetch: { + type: "object", + additionalProperties: false, + properties: { + status: { + type: "integer", + }, + engine: { + type: "string", + enum: ["fetch", "crazy", "classic", "parallel", "KFCThursdayVW50"], + }, + preflight: { + type: "boolean", + }, + credentials: { type: "string" }, + trylimit: { type: "number" }, + redirect: { type: "string" }, + mode: { type: "string" }, + timeout: { + type: "integer", + }, + cache: { + $ref: "#/definitions/Cache", + }, + threads: { + type: "integer", + }, + enable: { + type: "boolean", + }, + }, + required: ["engine", "preflight"], + title: "Fetch", + }, + Cache: { + type: "object", + additionalProperties: false, + properties: { + expire: { + type: "string", + }, + delay: { + type: "integer", + }, + enable: { + type: "boolean", + }, + }, + required: ["expire"], + title: "Cache", + }, + Header: { + type: "object", + additionalProperties: false, + properties: { + "content-type": { + type: "string", + }, + ServerProvide: { + type: "string", + }, + }, + required: ["ServerProvide", "content-type"], + title: "Header", + }, + Redirect: { + type: "object", + additionalProperties: false, + properties: { + to: { + type: "string", + }, + url: { + type: "string", + format: "uri", + "qt-uri-protocols": ["https"], + }, + status: { + type: "integer", + }, + }, + required: [], + title: "Redirect", + }, + Return: { + type: "object", + additionalProperties: false, + properties: { + body: { + type: "string", + }, + header: { + $ref: "#/definitions/Header", + }, + status: { + type: "integer", + }, + }, + required: ["body", "header", "status"], + title: "Return", + }, + Script: { + type: "object", + additionalProperties: false, + properties: { + name: { + type: "string", + }, + skip: { + type: "boolean", + }, + function: { + type: "string", + }, + }, + required: ["skip"], + title: "Script", + }, + Replace: { + anyOf: [ + { + type: "array", + items: { + type: "string", + format: "uri", + "qt-uri-protocols": ["https"], + }, + }, + { + type: "string", + }, + ], + title: "Replace", + }, + }, +} as const; + +export type ConfigType = FromSchema; diff --git a/types/esbuild-copy-static-files.d.ts b/types/esbuild-copy-static-files.d.ts new file mode 100644 index 0000000..5a002aa --- /dev/null +++ b/types/esbuild-copy-static-files.d.ts @@ -0,0 +1,12 @@ +declare module "esbuild-copy-static-files" { + export default function copyStaticFiles(param: { + src: string; + dest: string; + dereference?: boolean; + errorOnExist?: boolean; + filter?: (...param: any) => boolean; + force?: boolean; + preserveTimestamps?: boolean; + recursive?: boolean; + }): import("esbuild").Plugin; +} diff --git a/types/globalThis.d.ts b/types/globalThis.d.ts new file mode 100644 index 0000000..2c14f2e --- /dev/null +++ b/types/globalThis.d.ts @@ -0,0 +1,7 @@ +declare global { + var clientworkerhandle: (req: Request) => Response | PromiseLike; + var clients: { claim(): Promise }; + var skipWaiting: () => Promise | void; +} + +export {}; From 49c073ccb8b0cd3b75f8e6c8c5edb553355bc2d8 Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:21:40 +0800 Subject: [PATCH 02/11] Modernize all --- .github/workflows/build.yml | 33 +- doc/package.json | 6 +- package.json | 12 +- pnpm-lock.yaml | 723 +----------------------------------- pnpm-workspace.yaml | 2 + 5 files changed, 41 insertions(+), 735 deletions(-) create mode 100644 pnpm-workspace.yaml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ed3f4f5..e5b8156 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,28 +6,25 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 - - name: Setup node - uses: actions/setup-node@v1 + uses: actions/checkout@v3 with: - node-version: 16.x - - name: Cache node modules - uses: actions/cache@v1 + fetch-depth: 0 + - name: Setup pnpm + uses: pnpm/action-setup@v2 with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + version: 7.16.1 + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: "18" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --prefer-offline - name: Install & Build run: > - rm -rf .gitignore - echo "node_modules" >> .gitignore - echo "doc/node_modules" >> .gitignore - npm i -D - npm install -D webpack-cli webpack - npm run build + pnpm run build echo "clientworker.js.org" > ./dist/CNAME - cd doc - npm add --dev vitepress vue - npm run "docs:build" + pnpm docs:build - name: Deploy to GithubPage uses: peaceiris/actions-gh-pages@v3 with: @@ -37,4 +34,4 @@ jobs: - name: Publish to NPM uses: JS-DevTools/npm-publish@v1 with: - token: ${{ secrets.NPM }} \ No newline at end of file + token: ${{ secrets.NPM }} diff --git a/doc/package.json b/doc/package.json index 870735c..1c972a5 100644 --- a/doc/package.json +++ b/doc/package.json @@ -14,5 +14,9 @@ }, "author": "", "license": "ISC", - "description": "" + "description": "", + "dependencies": { + "vitepress": "^1.0.0-alpha.4", + "vue": "^3.2.37" + } } diff --git a/package.json b/package.json index 03cfad8..54ccbcd 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "A simple, globally hijacked, easily customizable, Service Worker-based front-end worker", "main": "./dist/cw.js", "scripts": { - "build": "rimraf dist && node --loader esbuild-register/loader -r esbuild-register build.ts " + "build": "rimraf dist && node --loader esbuild-register/loader -r esbuild-register build.ts", + "docs:build": "pnpm --filter clientworker-doc docs:build" }, "type": "module", "repository": { @@ -23,9 +24,7 @@ "homepage": "https://github.com/ChenYFan/ClientWorker#readme", "dependencies": { "@chenyfan/cache-db": "^0.0.4", - "js-yaml": "^4.1.0", - "vitepress": "^1.0.0-alpha.4", - "vue": "^3.2.37" + "js-yaml": "^4.1.0" }, "devDependencies": { "@types/js-yaml": "^4.0.5", @@ -35,9 +34,6 @@ "json-schema-to-ts": "^2.6.0", "rimraf": "^3.0.2", "terser-webpack-plugin": "^5.3.3", - "typescript": "^4.9.3", - "webpack": "^5.75.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-cli": "^5.0.0" + "typescript": "^4.9.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d50e04..f659d1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,16 +14,9 @@ importers: rimraf: ^3.0.2 terser-webpack-plugin: ^5.3.3 typescript: ^4.9.3 - vitepress: ^1.0.0-alpha.4 - vue: ^3.2.37 - webpack: ^5.75.0 - webpack-bundle-analyzer: ^4.5.0 - webpack-cli: ^5.0.0 dependencies: '@chenyfan/cache-db': 0.0.4 js-yaml: 4.1.0 - vitepress: 1.0.0-alpha.29 - vue: 3.2.45 devDependencies: '@types/js-yaml': 4.0.5 esbuild: 0.15.14 @@ -31,14 +24,16 @@ importers: esbuild-register: 3.4.1_esbuild@0.15.14 json-schema-to-ts: 2.6.0 rimraf: 3.0.2 - terser-webpack-plugin: 5.3.6_nserppduo6sp4es5vhgxpj3zoq + terser-webpack-plugin: 5.3.6_esbuild@0.15.14 typescript: 4.9.3 - webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u - webpack-bundle-analyzer: 4.7.0 - webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm doc: - specifiers: {} + specifiers: + vitepress: ^1.0.0-alpha.4 + vue: ^3.2.37 + dependencies: + vitepress: 1.0.0-alpha.29 + vue: 3.2.45 packages: @@ -183,11 +178,6 @@ packages: resolution: {integrity: sha512-kDOxRQ68OlrbQhXehHxc6BjTvr0sVXhCV45uucN5Jk6qKahEtRguA/orTh43ZAwnZ34LEdyj62kRXik8vq+fNg==} dev: false - /@discoveryjs/json-ext/0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true - /@docsearch/css/3.3.0: resolution: {integrity: sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==} dev: false @@ -279,28 +269,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@polka/url/1.0.0-next.21: - resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - dev: true - - /@types/eslint-scope/3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.4.10 - '@types/estree': 0.0.51 - dev: true - - /@types/eslint/8.4.10: - resolution: {integrity: sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==} - dependencies: - '@types/estree': 0.0.51 - '@types/json-schema': 7.0.11 - dev: true - - /@types/estree/0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - dev: true - /@types/js-yaml/4.0.5: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} dev: true @@ -440,170 +408,6 @@ packages: - vue dev: false - /@webassemblyjs/ast/1.11.1: - resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - dev: true - - /@webassemblyjs/floating-point-hex-parser/1.11.1: - resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} - dev: true - - /@webassemblyjs/helper-api-error/1.11.1: - resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} - dev: true - - /@webassemblyjs/helper-buffer/1.11.1: - resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} - dev: true - - /@webassemblyjs/helper-numbers/1.11.1: - resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode/1.11.1: - resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} - dev: true - - /@webassemblyjs/helper-wasm-section/1.11.1: - resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - dev: true - - /@webassemblyjs/ieee754/1.11.1: - resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128/1.11.1: - resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8/1.11.1: - resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} - dev: true - - /@webassemblyjs/wasm-edit/1.11.1: - resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/helper-wasm-section': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-opt': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - '@webassemblyjs/wast-printer': 1.11.1 - dev: true - - /@webassemblyjs/wasm-gen/1.11.1: - resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 - dev: true - - /@webassemblyjs/wasm-opt/1.11.1: - resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - dev: true - - /@webassemblyjs/wasm-parser/1.11.1: - resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 - dev: true - - /@webassemblyjs/wast-printer/1.11.1: - resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@xtuc/long': 4.2.2 - dev: true - - /@webpack-cli/configtest/2.0.0_5mhpyft47fxnqdave7meqiud7i: - resolution: {integrity: sha512-war4OU8NGjBqU3DP3bx6ciODXIh7dSXcpQq+P4K2Tqyd8L5OjZ7COx9QXx/QdCIwL2qoX09Wr4Cwf7uS4qdEng==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u - webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm - dev: true - - /@webpack-cli/info/2.0.0_5mhpyft47fxnqdave7meqiud7i: - resolution: {integrity: sha512-NNxDgbo4VOkNhOlTgY0Elhz3vKpOJq4/PKeKg7r8cmYM+GQA9vDofLYyup8jS6EpUvhNmR30cHTCEIyvXpskwA==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u - webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm - dev: true - - /@webpack-cli/serve/2.0.0_5mhpyft47fxnqdave7meqiud7i: - resolution: {integrity: sha512-Rumq5mHvGXamnOh3O8yLk1sjx8dB30qF1OeR6VC00DIR6SLJ4bwwUGKC4pE7qBFoQyyh0H9sAg3fikYgAqVR0w==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - dependencies: - webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u - webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm - dev: true - - /@xtuc/ieee754/1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long/4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /acorn-import-assertions/1.8.0_acorn@8.8.1: - resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.8.1 - dev: true - - /acorn-walk/8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - /acorn/8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} @@ -646,13 +450,6 @@ packages: '@algolia/transporter': 4.14.2 dev: false - /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: false @@ -672,89 +469,18 @@ packages: concat-map: 0.0.1 dev: true - /browserslist/4.21.4: - resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001431 - electron-to-chromium: 1.4.284 - node-releases: 2.0.6 - update-browserslist-db: 1.0.10_browserslist@4.21.4 - dev: true - /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /caniuse-lite/1.0.30001431: - resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==} - dev: true - - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chrome-trace-event/1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /clone-deep/4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colorette/2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: true - /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander/7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - - /commander/9.4.1: - resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} - engines: {node: ^12.20.0 || >=14} - dev: true - /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true - /cross-spawn/7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /csstype/2.6.21: resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} dev: false @@ -771,32 +497,6 @@ packages: ms: 2.1.2 dev: true - /duplexer/0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - - /electron-to-chromium/1.4.284: - resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} - dev: true - - /enhanced-resolve/5.10.0: - resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.10 - tapable: 2.2.1 - dev: true - - /envinfo/7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /es-module-lexer/0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - dev: true - /esbuild-android-64/0.15.14: resolution: {integrity: sha512-HuilVIb4rk9abT4U6bcFdU35UHOzcWVGLSjEmC58OVr96q5UiRqzDtWjPlCMugjhgUGKEs8Zf4ueIvYbOStbIg==} engines: {node: '>=12'} @@ -1001,45 +701,10 @@ packages: esbuild-windows-64: 0.15.14 esbuild-windows-arm64: 0.15.14 - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /eslint-scope/5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /esrecurse/4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse/4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse/5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - /estree-walker/2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: false - /events/3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -1048,19 +713,6 @@ packages: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fastest-levenshtein/1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - dev: true - - /find-up/4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -1075,10 +727,7 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - /glob-to-regexp/0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + dev: false /glob/7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -1091,17 +740,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true - - /gzip-size/6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - dependencies: - duplexer: 0.1.2 - dev: true - /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1112,15 +750,7 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - - /import-local/3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true + dev: false /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -1133,31 +763,11 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /interpret/3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - dev: true - /is-core-module/2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 - - /is-plain-object/2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isobject/3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true + dev: false /jest-worker/27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} @@ -1175,10 +785,6 @@ packages: argparse: 2.0.1 dev: false - /json-parse-even-better-errors/2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - /json-schema-to-ts/2.6.0: resolution: {integrity: sha512-j6x2ZFCN3exmGAaGusxZYB2mvgpy8I8UkkNmN1H6zlq+3mdBwSQMIsB5iAltGlBLWG4aPTYqeIkit4okTI0s7g==} dependencies: @@ -1195,27 +801,6 @@ packages: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: false - /kind-of/6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /loader-runner/4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - - /locate-path/5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /lodash/4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - /magic-string/0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: @@ -1226,29 +811,12 @@ packages: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /mime-db/1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types/2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /mrmime/1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} - dev: true - /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -1259,71 +827,24 @@ packages: hasBin: true dev: false - /neo-async/2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /node-releases/2.0.6: - resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} - dev: true - /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /opener/1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - dev: true - - /p-limit/2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-locate/4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-try/2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - /path-is-absolute/1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key/3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - /pkg-dir/4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true + dev: false /postcss/8.4.19: resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} @@ -1349,25 +870,6 @@ packages: safe-buffer: 5.2.1 dev: true - /rechoir/0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - dependencies: - resolve: 1.22.1 - dev: true - - /resolve-cwd/3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from/5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - /resolve/1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -1375,6 +877,7 @@ packages: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: false /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} @@ -1410,25 +913,6 @@ packages: randombytes: 2.1.0 dev: true - /shallow-clone/3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: true - - /shebang-command/2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex/3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - /shiki/0.11.1: resolution: {integrity: sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==} dependencies: @@ -1437,15 +921,6 @@ packages: vscode-textmate: 6.0.0 dev: false - /sirv/1.0.19: - resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} - engines: {node: '>= 10'} - dependencies: - '@polka/url': 1.0.0-next.21 - mrmime: 1.0.1 - totalist: 1.1.0 - dev: true - /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -1466,13 +941,6 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: false - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - /supports-color/8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -1483,13 +951,9 @@ packages: /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + dev: false - /tapable/2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /terser-webpack-plugin/5.3.6_nserppduo6sp4es5vhgxpj3zoq: + /terser-webpack-plugin/5.3.6_esbuild@0.15.14: resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -1511,7 +975,6 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.0 terser: 5.15.1 - webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u dev: true /terser/5.15.1: @@ -1530,11 +993,6 @@ packages: engines: {node: '>=4'} dev: false - /totalist/1.1.0: - resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} - engines: {node: '>=6'} - dev: true - /ts-algebra/1.1.1: resolution: {integrity: sha512-W43a3/BN0Tp4SgRNERQF/QPVuY1rnHkgCr/fISLY0Ycu05P0NWPYRuViU8JFn+pFZuY6/zp9TgET1fxMzppR/Q==} dependencies: @@ -1551,17 +1009,6 @@ packages: hasBin: true dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.4: - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.4 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -1661,146 +1108,6 @@ packages: '@vue/shared': 3.2.45 dev: false - /watchpack/2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - dev: true - - /webpack-bundle-analyzer/4.7.0: - resolution: {integrity: sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==} - engines: {node: '>= 10.13.0'} - hasBin: true - dependencies: - acorn: 8.8.1 - acorn-walk: 8.2.0 - chalk: 4.1.2 - commander: 7.2.0 - gzip-size: 6.0.0 - lodash: 4.17.21 - opener: 1.5.2 - sirv: 1.0.19 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /webpack-cli/5.0.0_zfjer5eiwvoit4zaxwbfe5plkm: - resolution: {integrity: sha512-AACDTo20yG+xn6HPW5xjbn2Be4KUzQPebWXsDMHwPPyKh9OnTOJgZN2Nc+g/FZKV3ObRTYsGvibAvc+5jAUrVA==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.0.0_5mhpyft47fxnqdave7meqiud7i - '@webpack-cli/info': 2.0.0_5mhpyft47fxnqdave7meqiud7i - '@webpack-cli/serve': 2.0.0_5mhpyft47fxnqdave7meqiud7i - colorette: 2.0.19 - commander: 9.4.1 - cross-spawn: 7.0.3 - envinfo: 7.8.1 - fastest-levenshtein: 1.0.16 - import-local: 3.1.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.75.0_3yspk5gilc3yrxqbmqkdigh33u - webpack-bundle-analyzer: 4.7.0 - webpack-merge: 5.8.0 - dev: true - - /webpack-merge/5.8.0: - resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} - engines: {node: '>=10.0.0'} - dependencies: - clone-deep: 4.0.1 - wildcard: 2.0.0 - dev: true - - /webpack-sources/3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack/5.75.0_3yspk5gilc3yrxqbmqkdigh33u: - resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.1 - acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.10.0 - es-module-lexer: 0.9.3 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.1.1 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.6_nserppduo6sp4es5vhgxpj3zoq - watchpack: 2.4.0 - webpack-cli: 5.0.0_zfjer5eiwvoit4zaxwbfe5plkm - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /which/2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wildcard/2.0.0: - resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} - dev: true - /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - - /ws/7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..38d3f0b --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - doc From 135af02a42ba408ac54c6ad5cd992ab6e50e030a Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:33:42 +0800 Subject: [PATCH 03/11] ci --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e5b8156..de260a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,22 +9,27 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 + - name: Setup pnpm uses: pnpm/action-setup@v2 with: version: 7.16.1 + - name: Setup Node uses: actions/setup-node@v3 with: node-version: "18" cache: "pnpm" + - name: Install dependencies run: pnpm install --prefer-offline + - name: Install & Build run: > pnpm run build echo "clientworker.js.org" > ./dist/CNAME pnpm docs:build + - name: Deploy to GithubPage uses: peaceiris/actions-gh-pages@v3 with: From f4e8c19f5ab27d43250787b0e245fe6d47b0d6c7 Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:34:51 +0800 Subject: [PATCH 04/11] fix ci --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de260a4..7c6aaab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: run: pnpm install --prefer-offline - name: Install & Build - run: > + run: | pnpm run build echo "clientworker.js.org" > ./dist/CNAME pnpm docs:build From b5a34ef37e3dfd497a56de4a1f9c6db1d4d58de5 Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:47:18 +0800 Subject: [PATCH 05/11] Modify gitignore --- .gitignore | 4 +--- doc/.gitignore | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 doc/.gitignore diff --git a/.gitignore b/.gitignore index 2f43ada..f06235c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ node_modules -package-lock.json -doc/node_modules -dist/ \ No newline at end of file +dist diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100644 index b512c09..0000000 --- a/doc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file From 4e49ee956bbbcdde452354d24e790c229d185302 Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Mon, 21 Nov 2022 11:11:45 +0800 Subject: [PATCH 06/11] Fix bug and make it work --- main/entry.ts | 6 +++++- main/handle/cgi.ts | 13 ++++++++++--- main/handle/main.ts | 4 ++-- static/config.yaml | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/main/entry.ts b/main/entry.ts index 00244e4..d5e0b14 100644 --- a/main/entry.ts +++ b/main/entry.ts @@ -1,8 +1,12 @@ -import {} from "./handle/main.js"; +import clientworkerhandle from "./handle/main.js"; import pkgjson from "../package.json"; import cons from "./utils/cons.js"; import CacheDB from "@chenyfan/cache-db"; +// For compatibility + +self.clientworkerhandle = clientworkerhandle; + cons.s(`ClientWorker${pkgjson.version} Started!`); const db = new CacheDB(); db.read("hotpatch").then((script) => { diff --git a/main/handle/cgi.ts b/main/handle/cgi.ts index 4eafa6a..5b94656 100644 --- a/main/handle/cgi.ts +++ b/main/handle/cgi.ts @@ -2,6 +2,7 @@ import yaml from "js-yaml"; import CacheDB from "@chenyfan/cache-db"; import FetchEngine from "../utils/engine.js"; import pkgjson from "../../package.json"; +import { ConfigType } from "../../types/configType.js"; const router_cgi = async (request: Request) => { const db = new CacheDB(); @@ -11,7 +12,7 @@ const router_cgi = async (request: Request) => { const q = (s: string) => { return urlObj.searchParams.get(s); }; - let config; + let config: ConfigType; switch (pathname.split("/")[2]) { case "hello": return new Response("Hello ClientWorker!"); @@ -67,7 +68,10 @@ const router_cgi = async (request: Request) => { if (typeof config.hotpatch !== "object") return new Response("Error, config.hotpatch not found"); const hotpatch = config.hotpatch; - await FetchEngine.parallel(hotpatch) + await FetchEngine.parallel( + hotpatch.map((hpc) => new Request(hpc)), + {} + ) .then((t) => t.text()) .then(async (script) => { await db.write("hotpatch", script, { type: "text" }); @@ -79,7 +83,10 @@ const router_cgi = async (request: Request) => { if (typeof config.hotconfig !== "object") return new Response("Error, config.hotconfig not found"); const hotconfig = config.hotconfig; - const nConfig = await FetchEngine.parallel(hotconfig) + const nConfig = await FetchEngine.parallel( + hotconfig.map((cfg) => new Request(cfg)), + {} + ) .then((t) => t.text()) .then((t) => yaml.load(t)) .then((t) => JSON.stringify(t)) diff --git a/main/handle/main.ts b/main/handle/main.ts index 5821404..9fcbc23 100644 --- a/main/handle/main.ts +++ b/main/handle/main.ts @@ -5,7 +5,7 @@ import cons from "../utils/cons.js"; import router_cgi from "./cgi.js"; import { ConfigType } from "../../types/configType.js"; -self.clientworkerhandle = async (request) => { +const clientworkerhandle = async (request: Request) => { //当前域 new Request('').url const domain = new URL(new Request("").url).host; const db = new CacheDB(); @@ -478,4 +478,4 @@ self.clientworkerhandle = async (request) => { return tRes; }; -export default {}; +export default clientworkerhandle; diff --git a/static/config.yaml b/static/config.yaml index 410f272..74fb6b0 100644 --- a/static/config.yaml +++ b/static/config.yaml @@ -45,7 +45,7 @@ catch_rules: - search: _ replace: docroot/clientworker@3.0.0-beta-4/doc/docs/.vitepress/dist - - search: ^https\:\/\/docroot + - search: ^https?\:\/\/docroot replace: - https://cdn.jsdelivr.net/npm - https://cdn1.tianli0.top/npm From 1fc93fb07e9bca094575097f51cbb54f46f5fe7f Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Mon, 21 Nov 2022 11:21:35 +0800 Subject: [PATCH 07/11] Write out config schema in build --- build.ts | 6 ++ package.json | 1 + pnpm-lock.yaml | 2 + static/config.schema.json | 170 -------------------------------------- types/configType.ts | 2 +- 5 files changed, 10 insertions(+), 171 deletions(-) delete mode 100644 static/config.schema.json diff --git a/build.ts b/build.ts index 9b4df95..974bbe0 100644 --- a/build.ts +++ b/build.ts @@ -1,5 +1,7 @@ import { build } from "esbuild"; import copyStaticFiles from "esbuild-copy-static-files"; +import { writeFile } from "fs/promises"; +import { configSchema } from "./types/configType"; (async () => { await build({ @@ -12,6 +14,10 @@ import copyStaticFiles from "esbuild-copy-static-files"; target: ["es2015"], plugins: [copyStaticFiles({ src: "static", dest: "dist" })], }); + await writeFile( + "dist/config.schema.json", + JSON.stringify(configSchema, null, 2) + ); })(); export {}; diff --git a/package.json b/package.json index 54ccbcd..93759fb 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "devDependencies": { "@types/js-yaml": "^4.0.5", + "@types/node": "^18.11.9", "esbuild": "^0.15.14", "esbuild-copy-static-files": "^0.1.0", "esbuild-register": "^3.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f659d1f..816ee28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,7 @@ importers: specifiers: '@chenyfan/cache-db': ^0.0.4 '@types/js-yaml': ^4.0.5 + '@types/node': ^18.11.9 esbuild: ^0.15.14 esbuild-copy-static-files: ^0.1.0 esbuild-register: ^3.4.1 @@ -19,6 +20,7 @@ importers: js-yaml: 4.1.0 devDependencies: '@types/js-yaml': 4.0.5 + '@types/node': 18.11.9 esbuild: 0.15.14 esbuild-copy-static-files: 0.1.0 esbuild-register: 3.4.1_esbuild@0.15.14 diff --git a/static/config.schema.json b/static/config.schema.json deleted file mode 100644 index 498e8b9..0000000 --- a/static/config.schema.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "$ref": "#/definitions/ClientWorker", - "definitions": { - "ClientWorker": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { "type": "string" }, - "hotpatch": { - "type": "array", - "items": { - "type": "string", - "format": "uri", - "qt-uri-protocols": ["https"], - "qt-uri-extensions": [".js"] - } - }, - "hotconfig": { - "type": "array", - "items": { - "type": "string", - "format": "uri", - "qt-uri-protocols": ["https"], - "qt-uri-extensions": [".yaml"] - } - }, - "cleaninterval": { "type": "string" }, - "catch_rules": { - "type": "array", - "items": { "$ref": "#/definitions/CatchRule" } - } - }, - "required": ["catch_rules", "name"], - "title": "Clientworker" - }, - "CatchRule": { - "type": "object", - "additionalProperties": false, - "properties": { - "rule": { "type": "string" }, - "transform_rules": { - "type": "array", - "items": { "$ref": "#/definitions/TransformRule" } - } - }, - "required": ["rule", "transform_rules"], - "title": "CatchRule" - }, - "TransformRule": { - "type": "object", - "additionalProperties": false, - "properties": { - "search": { "type": "string" }, - "searchin": { "type": "string" }, - "replace": { "$ref": "#/definitions/Replace" }, - "action": { - "type": "string", - "enum": ["redirect", "return", "fetch", "script", "skip"] - }, - "redirect": { "$ref": "#/definitions/Redirect" }, - "script": { "$ref": "#/definitions/Script" }, - "fetch": { "$ref": "#/definitions/Fetch" }, - "header": { "$ref": "#/definitions/Header" }, - "searchkey": { "type": "string" }, - "replacein": { "type": "string" }, - "replacekey": { "type": "string" }, - "searchflags": { "type": "string" }, - "replaceflags": { "type": "string" }, - "return": { "$ref": "#/definitions/Return" } - }, - "required": ["search", "fetch", "return"], - "title": "TransformRule" - }, - "Fetch": { - "type": "object", - "additionalProperties": false, - "properties": { - "status": { "type": "integer" }, - "engine": { - "type": "string", - "enum": ["fetch", "crazy", "classic", "parallel", "KFCThursdayVW50"] - }, - "preflight": { "type": "boolean" }, - "credentials": { "type": "string" }, - "trylimit": { "type": "number" }, - "redirect": { "type": "string" }, - "mode": { "type": "string" }, - "timeout": { "type": "integer" }, - "cache": { "$ref": "#/definitions/Cache" }, - "threads": { "type": "integer" }, - "enable": { "type": "boolean" } - }, - "required": ["engine", "preflight"], - "title": "Fetch" - }, - "Cache": { - "type": "object", - "additionalProperties": false, - "properties": { - "expire": { "type": "string" }, - "delay": { "type": "integer" }, - "enable": { "type": "boolean" } - }, - "required": ["expire"], - "title": "Cache" - }, - "Header": { - "type": "object", - "additionalProperties": false, - "properties": { - "content-type": { "type": "string" }, - "ServerProvide": { "type": "string" } - }, - "required": ["ServerProvide", "content-type"], - "title": "Header" - }, - "Redirect": { - "type": "object", - "additionalProperties": false, - "properties": { - "to": { "type": "string" }, - "url": { - "type": "string", - "format": "uri", - "qt-uri-protocols": ["https"] - }, - "status": { "type": "integer" } - }, - "required": [], - "title": "Redirect" - }, - "Return": { - "type": "object", - "additionalProperties": false, - "properties": { - "body": { "type": "string" }, - "header": { "$ref": "#/definitions/Header" }, - "status": { "type": "integer" } - }, - "required": ["body", "header", "status"], - "title": "Return" - }, - "Script": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { "type": "string" }, - "skip": { "type": "boolean" }, - "function": { "type": "string" } - }, - "required": ["skip"], - "title": "Script" - }, - "Replace": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string", - "format": "uri", - "qt-uri-protocols": ["https"] - } - }, - { "type": "string" } - ], - "title": "Replace" - } - } -} diff --git a/types/configType.ts b/types/configType.ts index 5fe1ca3..6fbda18 100644 --- a/types/configType.ts +++ b/types/configType.ts @@ -1,6 +1,6 @@ import { FromSchema } from "json-schema-to-ts"; -const configSchema = { +export const configSchema = { $schema: "http://json-schema.org/draft-06/schema#", $ref: "#/definitions/ClientWorker", definitions: { From cb9d4e1924cd0c9c881bedd4729a51c269ddd6ac Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Mon, 21 Nov 2022 11:21:43 +0800 Subject: [PATCH 08/11] Change module type --- main/entry.ts | 6 +++--- main/handle/cgi.ts | 4 ++-- main/handle/main.ts | 10 +++++----- main/utils/engine.ts | 4 ++-- main/utils/rebuild.ts | 2 +- tsconfig.json | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/main/entry.ts b/main/entry.ts index d5e0b14..85738ca 100644 --- a/main/entry.ts +++ b/main/entry.ts @@ -1,7 +1,7 @@ -import clientworkerhandle from "./handle/main.js"; -import pkgjson from "../package.json"; -import cons from "./utils/cons.js"; import CacheDB from "@chenyfan/cache-db"; +import pkgjson from "../package.json"; +import clientworkerhandle from "./handle/main"; +import cons from "./utils/cons"; // For compatibility diff --git a/main/handle/cgi.ts b/main/handle/cgi.ts index 5b94656..a695633 100644 --- a/main/handle/cgi.ts +++ b/main/handle/cgi.ts @@ -1,8 +1,8 @@ import yaml from "js-yaml"; import CacheDB from "@chenyfan/cache-db"; -import FetchEngine from "../utils/engine.js"; +import FetchEngine from "../utils/engine"; import pkgjson from "../../package.json"; -import { ConfigType } from "../../types/configType.js"; +import { ConfigType } from "../../types/configType"; const router_cgi = async (request: Request) => { const db = new CacheDB(); diff --git a/main/handle/main.ts b/main/handle/main.ts index 9fcbc23..e09e076 100644 --- a/main/handle/main.ts +++ b/main/handle/main.ts @@ -1,9 +1,9 @@ import CacheDB from "@chenyfan/cache-db"; -import FetchEngine, { FetchEngineConfig } from "../utils/engine.js"; -import rebuild from "../utils/rebuild.js"; -import cons from "../utils/cons.js"; -import router_cgi from "./cgi.js"; -import { ConfigType } from "../../types/configType.js"; +import { ConfigType } from "../../types/configType"; +import cons from "../utils/cons"; +import FetchEngine from "../utils/engine"; +import rebuild from "../utils/rebuild"; +import router_cgi from "./cgi"; const clientworkerhandle = async (request: Request) => { //当前域 new Request('').url diff --git a/main/utils/engine.ts b/main/utils/engine.ts index 72faea7..62b2bed 100644 --- a/main/utils/engine.ts +++ b/main/utils/engine.ts @@ -1,5 +1,5 @@ -import cons from "./cons.js"; -import rebuild from "./rebuild.js"; +import cons from "./cons"; +import rebuild from "./rebuild"; if (!Promise.any) { Promise.any = function (promises: Promise[]) { diff --git a/main/utils/rebuild.ts b/main/utils/rebuild.ts index 3de5c3d..7685e4e 100644 --- a/main/utils/rebuild.ts +++ b/main/utils/rebuild.ts @@ -1,4 +1,4 @@ -import cons from "./cons.js"; +import cons from "./cons"; const rebuild = { request: (req: Request, init: Partial) => { diff --git a/tsconfig.json b/tsconfig.json index e4d0a58..7e76b38 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ESNext", "module": "ESNext", - "moduleResolution": "NodeNext", + "moduleResolution": "Node", "allowSyntheticDefaultImports": true, "strict": true, "lib": ["esnext", "WebWorker", "WebWorker.ImportScripts"], From 5204fa49dbc273515dd4f74386f2bb2d7a3ec4ae Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Mon, 21 Nov 2022 12:05:33 +0800 Subject: [PATCH 09/11] Update schema --- main/handle/main.ts | 6 +----- types/configType.ts | 12 +++++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/main/handle/main.ts b/main/handle/main.ts index e09e076..98536ae 100644 --- a/main/handle/main.ts +++ b/main/handle/main.ts @@ -25,11 +25,7 @@ const clientworkerhandle = async (request: Request) => { let tFetched = false; let EngineFetch = false; let fetchConfig: - | (ConfigType["catch_rules"][number]["transform_rules"][number]["fetch"] & { - mode: RequestMode | undefined; - credentials: RequestCredentials | undefined; - redirect: RequestRedirect | undefined; - }) + | ConfigType["catch_rules"][number]["transform_rules"][number]["fetch"] | undefined = undefined; let EngineFetchList: Request[] = []; let tRes = new Response(); diff --git a/types/configType.ts b/types/configType.ts index 6fbda18..74b2186 100644 --- a/types/configType.ts +++ b/types/configType.ts @@ -124,10 +124,16 @@ export const configSchema = { preflight: { type: "boolean", }, - credentials: { type: "string" }, + credentials: { + type: "string", + enum: ["same-origin", "include", "omit"], + }, trylimit: { type: "number" }, - redirect: { type: "string" }, - mode: { type: "string" }, + redirect: { type: "string", enum: ["error", "follow", "manual"] }, + mode: { + type: "string", + enum: ["same-origin", "cors", "navigate", "no-cors"], + }, timeout: { type: "integer", }, From 7672a4cc29b9cd9ac1dea73617dae2f990a4256d Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Mon, 21 Nov 2022 12:18:33 +0800 Subject: [PATCH 10/11] YAML Schema --- build.ts | 8 +- main/handle/main.ts | 16 +- static/config.schema.json | 316 ++++++++++++++++++++++++++++++++++++++ static/config.yaml | 1 + types/configType.ts | 2 +- 5 files changed, 330 insertions(+), 13 deletions(-) create mode 100644 static/config.schema.json diff --git a/build.ts b/build.ts index 974bbe0..69eebb8 100644 --- a/build.ts +++ b/build.ts @@ -4,6 +4,10 @@ import { writeFile } from "fs/promises"; import { configSchema } from "./types/configType"; (async () => { + await writeFile( + "static/config.schema.json", + JSON.stringify(configSchema, null, 2) + ); await build({ entryPoints: ["./main/entry.js"], entryNames: "[dir]/cw", @@ -14,10 +18,6 @@ import { configSchema } from "./types/configType"; target: ["es2015"], plugins: [copyStaticFiles({ src: "static", dest: "dist" })], }); - await writeFile( - "dist/config.schema.json", - JSON.stringify(configSchema, null, 2) - ); })(); export {}; diff --git a/main/handle/main.ts b/main/handle/main.ts index 98536ae..57c2873 100644 --- a/main/handle/main.ts +++ b/main/handle/main.ts @@ -293,7 +293,7 @@ const clientworkerhandle = async (request: Request) => { let cRes: Response; return new Promise(async (resolve, reject) => { if (!EngineFetch) { - switch (transform_rule.fetch.engine || "fetch") { + switch (transform_rule.fetch?.engine || "fetch") { case "fetch": cRes = await FetchEngine.fetch(tReq, fetchConfig!); break; @@ -302,12 +302,12 @@ const clientworkerhandle = async (request: Request) => { break; default: cons.e( - `${tReq.url} the ${transform_rule.fetch.engine} engine are not supported` + `${tReq.url} the ${transform_rule.fetch?.engine} engine are not supported` ); break; } } else { - switch (transform_rule.fetch.engine || "parallel") { + switch (transform_rule.fetch?.engine || "parallel") { case "classic": cRes = await FetchEngine.classic( EngineFetchList, @@ -332,14 +332,14 @@ const clientworkerhandle = async (request: Request) => { break; default: cons.e( - `Fetch Engine ${transform_rule.fetch.engine} is not supported` + `Fetch Engine ${transform_rule.fetch?.engine} is not supported` ); break; } } if ( - typeof transform_rule.fetch.cache === "object" && - cRes.status === (transform_rule.fetch.status || 200) + typeof transform_rule.fetch?.cache === "object" && + cRes.status === (transform_rule.fetch?.status || 200) ) { cRes = rebuild.response(cRes, { headers: { @@ -359,7 +359,7 @@ const clientworkerhandle = async (request: Request) => { } }); }; - if (typeof transform_rule.fetch.cache === "object") { + if (typeof transform_rule.fetch?.cache === "object") { caches.open("ClientWorker_ResponseCache").then((cache) => { cache.match(tReq).then((cRes) => { if (!!cRes) { @@ -382,7 +382,7 @@ const clientworkerhandle = async (request: Request) => { ); resolve(cRes); return; - }, transform_rule.fetch.cache?.delay || 3000); + }, transform_rule.fetch?.cache?.delay || 3000); }), ]) ); diff --git a/static/config.schema.json b/static/config.schema.json new file mode 100644 index 0000000..7cde937 --- /dev/null +++ b/static/config.schema.json @@ -0,0 +1,316 @@ +{ + "$schema": "http://json-schema.org/draft-06/schema#", + "$ref": "#/definitions/ClientWorker", + "definitions": { + "ClientWorker": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "hotpatch": { + "type": "array", + "items": { + "type": "string", + "format": "uri", + "qt-uri-protocols": [ + "https" + ], + "qt-uri-extensions": [ + ".js" + ] + } + }, + "hotconfig": { + "type": "array", + "items": { + "type": "string", + "format": "uri", + "qt-uri-protocols": [ + "https" + ], + "qt-uri-extensions": [ + ".yaml" + ] + } + }, + "cleaninterval": { + "type": "string" + }, + "catch_rules": { + "type": "array", + "items": { + "$ref": "#/definitions/CatchRule" + } + } + }, + "required": [ + "catch_rules", + "name" + ], + "title": "Clientworker" + }, + "CatchRule": { + "type": "object", + "additionalProperties": false, + "properties": { + "rule": { + "type": "string" + }, + "transform_rules": { + "type": "array", + "items": { + "$ref": "#/definitions/TransformRule" + } + } + }, + "required": [ + "rule", + "transform_rules" + ], + "title": "CatchRule" + }, + "TransformRule": { + "type": "object", + "additionalProperties": false, + "properties": { + "search": { + "type": "string" + }, + "searchin": { + "type": "string" + }, + "replace": { + "$ref": "#/definitions/Replace" + }, + "action": { + "type": "string", + "enum": [ + "redirect", + "return", + "fetch", + "script", + "skip" + ] + }, + "redirect": { + "$ref": "#/definitions/Redirect" + }, + "script": { + "$ref": "#/definitions/Script" + }, + "fetch": { + "$ref": "#/definitions/Fetch" + }, + "header": { + "$ref": "#/definitions/Header" + }, + "searchkey": { + "type": "string" + }, + "replacein": { + "type": "string" + }, + "replacekey": { + "type": "string" + }, + "searchflags": { + "type": "string" + }, + "replaceflags": { + "type": "string" + }, + "return": { + "$ref": "#/definitions/Return" + } + }, + "required": [ + "search" + ], + "title": "TransformRule" + }, + "Fetch": { + "type": "object", + "additionalProperties": false, + "properties": { + "status": { + "type": "integer" + }, + "engine": { + "type": "string", + "enum": [ + "fetch", + "crazy", + "classic", + "parallel", + "KFCThursdayVW50" + ] + }, + "preflight": { + "type": "boolean" + }, + "credentials": { + "type": "string", + "enum": [ + "same-origin", + "include", + "omit" + ] + }, + "trylimit": { + "type": "number" + }, + "redirect": { + "type": "string", + "enum": [ + "error", + "follow", + "manual" + ] + }, + "mode": { + "type": "string", + "enum": [ + "same-origin", + "cors", + "navigate", + "no-cors" + ] + }, + "timeout": { + "type": "integer" + }, + "cache": { + "$ref": "#/definitions/Cache" + }, + "threads": { + "type": "integer" + }, + "enable": { + "type": "boolean" + } + }, + "required": [ + "engine", + "preflight" + ], + "title": "Fetch" + }, + "Cache": { + "type": "object", + "additionalProperties": false, + "properties": { + "expire": { + "type": "string" + }, + "delay": { + "type": "integer" + }, + "enable": { + "type": "boolean" + } + }, + "required": [ + "expire" + ], + "title": "Cache" + }, + "Header": { + "type": "object", + "additionalProperties": false, + "properties": { + "content-type": { + "type": "string" + }, + "ServerProvide": { + "type": "string" + } + }, + "required": [ + "ServerProvide", + "content-type" + ], + "title": "Header" + }, + "Redirect": { + "type": "object", + "additionalProperties": false, + "properties": { + "to": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri", + "qt-uri-protocols": [ + "https" + ] + }, + "status": { + "type": "integer" + } + }, + "required": [], + "title": "Redirect" + }, + "Return": { + "type": "object", + "additionalProperties": false, + "properties": { + "body": { + "type": "string" + }, + "header": { + "$ref": "#/definitions/Header" + }, + "status": { + "type": "integer" + } + }, + "required": [ + "body", + "header", + "status" + ], + "title": "Return" + }, + "Script": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "skip": { + "type": "boolean" + }, + "function": { + "type": "string" + } + }, + "required": [ + "skip" + ], + "title": "Script" + }, + "Replace": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string", + "format": "uri", + "qt-uri-protocols": [ + "https" + ] + } + }, + { + "type": "string" + } + ], + "title": "Replace" + } + } +} \ No newline at end of file diff --git a/static/config.yaml b/static/config.yaml index 74fb6b0..83459ba 100644 --- a/static/config.yaml +++ b/static/config.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=./config.schema.json name: ClientWorker Docs Config hotpatch: - https://raw.githubusercontent.com/ChenYFan/ClientWorker/gh-pages/cw.js diff --git a/types/configType.ts b/types/configType.ts index 74b2186..9d7bbab 100644 --- a/types/configType.ts +++ b/types/configType.ts @@ -107,7 +107,7 @@ export const configSchema = { $ref: "#/definitions/Return", }, }, - required: ["search", "fetch", "return"], + required: ["search"], title: "TransformRule", }, Fetch: { From 22013bef616a350e3e1f67c320ab8e8c7709e54c Mon Sep 17 00:00:00 2001 From: lixiang810 <14120445+lixiang810@users.noreply.github.com> Date: Mon, 21 Nov 2022 12:31:56 +0800 Subject: [PATCH 11/11] Write schema to dist instead of static --- build.ts | 8 +- package.json | 2 +- pnpm-lock.yaml | 21 ++- static/config.schema.json | 316 -------------------------------------- static/config.yaml | 2 +- types/configType.ts | 5 + 6 files changed, 28 insertions(+), 326 deletions(-) delete mode 100644 static/config.schema.json diff --git a/build.ts b/build.ts index 69eebb8..974bbe0 100644 --- a/build.ts +++ b/build.ts @@ -4,10 +4,6 @@ import { writeFile } from "fs/promises"; import { configSchema } from "./types/configType"; (async () => { - await writeFile( - "static/config.schema.json", - JSON.stringify(configSchema, null, 2) - ); await build({ entryPoints: ["./main/entry.js"], entryNames: "[dir]/cw", @@ -18,6 +14,10 @@ import { configSchema } from "./types/configType"; target: ["es2015"], plugins: [copyStaticFiles({ src: "static", dest: "dist" })], }); + await writeFile( + "dist/config.schema.json", + JSON.stringify(configSchema, null, 2) + ); })(); export {}; diff --git a/package.json b/package.json index 93759fb..cd5b5f8 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "esbuild": "^0.15.14", "esbuild-copy-static-files": "^0.1.0", "esbuild-register": "^3.4.1", - "json-schema-to-ts": "^2.6.0", + "json-schema-to-ts": "^2.6.1", "rimraf": "^3.0.2", "terser-webpack-plugin": "^5.3.3", "typescript": "^4.9.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 816ee28..24cd2ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,7 +11,7 @@ importers: esbuild-copy-static-files: ^0.1.0 esbuild-register: ^3.4.1 js-yaml: ^4.1.0 - json-schema-to-ts: ^2.6.0 + json-schema-to-ts: ^2.6.1 rimraf: ^3.0.2 terser-webpack-plugin: ^5.3.3 typescript: ^4.9.3 @@ -24,7 +24,7 @@ importers: esbuild: 0.15.14 esbuild-copy-static-files: 0.1.0 esbuild-register: 3.4.1_esbuild@0.15.14 - json-schema-to-ts: 2.6.0 + json-schema-to-ts: 2.6.1 rimraf: 3.0.2 terser-webpack-plugin: 5.3.6_esbuild@0.15.14 typescript: 4.9.3 @@ -167,6 +167,13 @@ packages: '@babel/types': 7.20.2 dev: false + /@babel/runtime/7.20.1: + resolution: {integrity: sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + /@babel/types/7.20.2: resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} engines: {node: '>=6.9.0'} @@ -787,9 +794,11 @@ packages: argparse: 2.0.1 dev: false - /json-schema-to-ts/2.6.0: - resolution: {integrity: sha512-j6x2ZFCN3exmGAaGusxZYB2mvgpy8I8UkkNmN1H6zlq+3mdBwSQMIsB5iAltGlBLWG4aPTYqeIkit4okTI0s7g==} + /json-schema-to-ts/2.6.1: + resolution: {integrity: sha512-SQ/L0BBDxYzd7AiF7WK5oKTF/3Y007XRH6Ss4ZQUfnBEtsbLmtG0GDiPw831eNzcF5WYqdUtbxS1NSb8hBu6Tg==} + engines: {node: ^16.10.0} dependencies: + '@babel/runtime': 7.20.1 '@types/json-schema': 7.0.11 ts-algebra: 1.1.1 ts-toolbelt: 9.6.0 @@ -872,6 +881,10 @@ packages: safe-buffer: 5.2.1 dev: true + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + /resolve/1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true diff --git a/static/config.schema.json b/static/config.schema.json deleted file mode 100644 index 7cde937..0000000 --- a/static/config.schema.json +++ /dev/null @@ -1,316 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-06/schema#", - "$ref": "#/definitions/ClientWorker", - "definitions": { - "ClientWorker": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "hotpatch": { - "type": "array", - "items": { - "type": "string", - "format": "uri", - "qt-uri-protocols": [ - "https" - ], - "qt-uri-extensions": [ - ".js" - ] - } - }, - "hotconfig": { - "type": "array", - "items": { - "type": "string", - "format": "uri", - "qt-uri-protocols": [ - "https" - ], - "qt-uri-extensions": [ - ".yaml" - ] - } - }, - "cleaninterval": { - "type": "string" - }, - "catch_rules": { - "type": "array", - "items": { - "$ref": "#/definitions/CatchRule" - } - } - }, - "required": [ - "catch_rules", - "name" - ], - "title": "Clientworker" - }, - "CatchRule": { - "type": "object", - "additionalProperties": false, - "properties": { - "rule": { - "type": "string" - }, - "transform_rules": { - "type": "array", - "items": { - "$ref": "#/definitions/TransformRule" - } - } - }, - "required": [ - "rule", - "transform_rules" - ], - "title": "CatchRule" - }, - "TransformRule": { - "type": "object", - "additionalProperties": false, - "properties": { - "search": { - "type": "string" - }, - "searchin": { - "type": "string" - }, - "replace": { - "$ref": "#/definitions/Replace" - }, - "action": { - "type": "string", - "enum": [ - "redirect", - "return", - "fetch", - "script", - "skip" - ] - }, - "redirect": { - "$ref": "#/definitions/Redirect" - }, - "script": { - "$ref": "#/definitions/Script" - }, - "fetch": { - "$ref": "#/definitions/Fetch" - }, - "header": { - "$ref": "#/definitions/Header" - }, - "searchkey": { - "type": "string" - }, - "replacein": { - "type": "string" - }, - "replacekey": { - "type": "string" - }, - "searchflags": { - "type": "string" - }, - "replaceflags": { - "type": "string" - }, - "return": { - "$ref": "#/definitions/Return" - } - }, - "required": [ - "search" - ], - "title": "TransformRule" - }, - "Fetch": { - "type": "object", - "additionalProperties": false, - "properties": { - "status": { - "type": "integer" - }, - "engine": { - "type": "string", - "enum": [ - "fetch", - "crazy", - "classic", - "parallel", - "KFCThursdayVW50" - ] - }, - "preflight": { - "type": "boolean" - }, - "credentials": { - "type": "string", - "enum": [ - "same-origin", - "include", - "omit" - ] - }, - "trylimit": { - "type": "number" - }, - "redirect": { - "type": "string", - "enum": [ - "error", - "follow", - "manual" - ] - }, - "mode": { - "type": "string", - "enum": [ - "same-origin", - "cors", - "navigate", - "no-cors" - ] - }, - "timeout": { - "type": "integer" - }, - "cache": { - "$ref": "#/definitions/Cache" - }, - "threads": { - "type": "integer" - }, - "enable": { - "type": "boolean" - } - }, - "required": [ - "engine", - "preflight" - ], - "title": "Fetch" - }, - "Cache": { - "type": "object", - "additionalProperties": false, - "properties": { - "expire": { - "type": "string" - }, - "delay": { - "type": "integer" - }, - "enable": { - "type": "boolean" - } - }, - "required": [ - "expire" - ], - "title": "Cache" - }, - "Header": { - "type": "object", - "additionalProperties": false, - "properties": { - "content-type": { - "type": "string" - }, - "ServerProvide": { - "type": "string" - } - }, - "required": [ - "ServerProvide", - "content-type" - ], - "title": "Header" - }, - "Redirect": { - "type": "object", - "additionalProperties": false, - "properties": { - "to": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri", - "qt-uri-protocols": [ - "https" - ] - }, - "status": { - "type": "integer" - } - }, - "required": [], - "title": "Redirect" - }, - "Return": { - "type": "object", - "additionalProperties": false, - "properties": { - "body": { - "type": "string" - }, - "header": { - "$ref": "#/definitions/Header" - }, - "status": { - "type": "integer" - } - }, - "required": [ - "body", - "header", - "status" - ], - "title": "Return" - }, - "Script": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "skip": { - "type": "boolean" - }, - "function": { - "type": "string" - } - }, - "required": [ - "skip" - ], - "title": "Script" - }, - "Replace": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string", - "format": "uri", - "qt-uri-protocols": [ - "https" - ] - } - }, - { - "type": "string" - } - ], - "title": "Replace" - } - } -} \ No newline at end of file diff --git a/static/config.yaml b/static/config.yaml index 83459ba..ffaafc2 100644 --- a/static/config.yaml +++ b/static/config.yaml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=./config.schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/ChenYFan/ClientWorker/gh-pages/config.schema.json name: ClientWorker Docs Config hotpatch: - https://raw.githubusercontent.com/ChenYFan/ClientWorker/gh-pages/cw.js diff --git a/types/configType.ts b/types/configType.ts index 9d7bbab..230f451 100644 --- a/types/configType.ts +++ b/types/configType.ts @@ -182,18 +182,23 @@ export const configSchema = { title: "Header", }, Redirect: { + description: + "你要找的是在外部观察 url 不跳转的 URL 重写吗?redirect 可以直接返回一个跳转,无视 fetch 状态,对接下来的规则也将不执行。", type: "object", additionalProperties: false, properties: { to: { + description: "表示重定向的替换规则", type: "string", }, url: { + description: "表示重定向的目标url", type: "string", format: "uri", "qt-uri-protocols": ["https"], }, status: { + description: "你可以选择 301/302,不过这其实没有太大用处。", type: "integer", }, },