├── .github ├── ISSUE_TEMPLATE │ └── bug_report.md ├── dependabot.yml └── workflows │ └── build.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── index.html ├── index.js ├── lib ├── bangumi.js ├── common.js ├── douban.js ├── epic.js ├── error.js ├── imdb.js ├── indienova.js └── steam.js ├── package-lock.json ├── package.json ├── webpack.config.js └── wrangler.toml.sample /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: Rhilip 7 | 8 | --- 9 | 10 | 11 | 12 | # 复现步骤 13 | 14 | 1. 请指出是哪个域名能够复现该问题? 15 | 16 | - [ ] https://ptgen.rhilip.info/ 17 | - [ ] https://ptgen.rhilip.workers.dev/ 18 | - [ ] 其他非官方API Point: (请修改成对应域名) 19 | 20 | 2. 如果是非官方域名出现的问题,在上面的官方API Point中能否复现?(使用官方域名请跳过) 21 | 22 | - [ ] 在 https://ptgen.rhilip.info/ 域名中能复现。 23 | - [ ] 在 https://ptgen.rhilip.workers.dev/ 域名中能复现。 24 | - [ ] 均不能复现。 25 | 26 | 3. 错误链接? 27 | 28 | 29 | 30 | # 其他信息 31 | 32 | 33 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "21:00" 8 | open-pull-requests-limit: 10 9 | ignore: 10 | - dependency-name: cheerio 11 | versions: 12 | - 1.0.0-rc.5 13 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | name: Deploy 12 | steps: 13 | - uses: actions/checkout@v2 14 | 15 | - name: Install dependencies 16 | run: npm install 17 | 18 | - name: Install Wrangler 19 | run: npm i @cloudflare/wrangler -g 20 | 21 | - name: Publish to Cloudflare 22 | run: | 23 | echo '${{ secrets.WRANGLER }}' > wrangler.toml 24 | wrangler publish 25 | env: 26 | CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }} 27 | 28 | - name: Release Build Script 29 | run: | 30 | cd worker 31 | git init 32 | git add * 33 | git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" 34 | git config --local user.name "github-actions[bot]" 35 | git commit -m "Auto build" -a 36 | git push --force --quiet "https://${GITHUB_ACTOR}:${{ github.token }}@github.com/${GITHUB_REPOSITORY}.git" master:build 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | Cargo.lock 4 | bin/ 5 | pkg/ 6 | wasm-pack.log 7 | worker/ 8 | dist/ 9 | node_modules/ 10 | .cargo-ok 11 | .idea 12 | wrangler.toml -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at ag_dubs@cloudflare.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Rhilip 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PT-Gen on Cloudflare Worker 2 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FRhilip%2Fpt-gen-cfworker.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2FRhilip%2Fpt-gen-cfworker?ref=badge_shield) 3 | [![Build Status](https://github.com/Rhilip/pt-gen-cfworker/actions/workflows/build.yml/badge.svg)](https://github.com/Rhilip/pt-gen-cfworker/actions/workflows/build.yml) 4 | 5 | 基于 [BFDZ/Pt-Gen v0.4.7](https://github.com/BFDZ/PT-Gen/commit/950b85de16d9532e847a0756f165d1b29f09dd31) 改写, 6 | 使之可以直接在Cloudflare Worker上使用。 7 | 8 | 如果你没有构造环境,请直接复制使用 [build分支](https://github.com/Rhilip/pt-gen-cfworker/tree/build) 下的 9 | [script.js](https://github.com/Rhilip/pt-gen-cfworker/blob/build/script.js) 文件。 10 | 11 | 否则请参照 `.Travis.yml` 文件构造方法,直接使用`wrangler`搭建Cloudflare-Worker。 12 | 13 | ## 本项目请求方法 14 | 15 | API Point: 16 | - https://ptgen.rhilip.info/ 17 | - **!!!大批量请求时,请勿使用测试DEMO站点,请自己搭建cf-worker!!!** 18 | 19 | `资源搜索` 请求字段: 20 | - search: 搜索字符串 21 | - source: 见下表 `资源来源站点`,不填时默认为 `douban` 22 | 23 | `简介生成` 请求字段(方法1,推荐): 24 | - url:见下表 `链接格式(Regexp)` 25 | 26 | `简介生成` 请求字段(方法2): 27 | - site: 见下表 `资源来源站点` 28 | - sid: 资源在对应站点的唯一id 29 | 30 | ## 支持资源链接 31 | 32 | | 资源来源站点 | 搜索支持 | 链接格式(Regexp) | 33 | | :---: | :---: | :------| 34 | | douban | √ | `/(?:https?:\/\/)?(?:(?:movie\|www)\.)?douban\.com\/(?:subject\|movie)\/(\d+)\/?/` | 35 | | imdb | √ | `/(?:https?:\/\/)?(?:www\.)?imdb\.com\/title\/(tt\d+)\/?/` | 36 | | bangumi | √ | `/(?:https?:\/\/)?(?:bgm\.tv\|bangumi\.tv\|chii\.in)\/subject\/(\d+)\/?/` | 37 | | steam | × | `/(?:https?:\/\/)?(?:store\.)?steam(?:powered\|community)\.com\/app\/(\d+)\/?/` | 38 | | indienova | × | `/(?:https?:\/\/)?indienova\.com\/game\/(\S+)/` | 39 | | epic | × | `/(?:https?:\/\/)?www\.epicgames\.com\/store\/[a-zA-Z-]+\/product\/(\S+)\/\S?/` | 40 | 41 | > update 2020.11.23 : 由于 steam 服务器对于 cf-worker 访问进行限制 ( 见[#10](https://github.com/Rhilip/pt-gen-cfworker/issues/10) ), 目前服务的 steam 相关资源生成均无法使用。 42 | 43 | ## 环境变量及 KV 命名空间 44 | 45 | 通过设置环境变量可以使得 pt-gen-cfworker 能够实现一些额外的功能,当前有以下 环境变量: 46 | 47 | | 变量 | 说明 | 48 | |:---:|:--| 49 | | `AUTHOR` | 用于重写api返回的作者信息 | 50 | | `APIKEY` | 只允许带有 `&apikey={APIKEY}` 的请求访问资源 | 51 | | `DISABLE_SEARCH` | 存在该值且非空时,禁止使用搜索功能 | 52 | | `PT_GEN_STORE` | *KV Storage*,请在 `KV 命名空间绑定` 面板而不是环境变量面板设置!!! | 53 | | `DOUBAN_COOKIE` | 豆瓣Cookie,使得能访问部分登录可见的资源 | 54 | | `INDIENOVA_COOKIE` | indienova 的 Cookie,见 [#15](https://github.com/Rhilip/pt-gen-cfworker/issues/15) | 55 | 56 | ## License 57 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FRhilip%2Fpt-gen-cfworker.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FRhilip%2Fpt-gen-cfworker?ref=badge_large) 58 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | PT Gen 12 | 13 | 14 | 15 | 16 | 28 | 29 | 33 | 34 | 35 | 36 | 56 |
57 |
58 |
59 |
60 |
61 |
62 | 63 | 67 |
68 | 76 | 77 |
78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 | 86 |
87 |
88 |
89 |

相关替代

90 | 此处列出可以替代本平台的其他应用,以便在 Pt-Gen 失效或返回数据陈旧时使用 91 | 97 |
98 | 99 |
100 |
101 |
102 | 103 | 104 | 105 | 106 | 218 | 219 | 220 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import {AUTHOR, makeJsonResponse, makeJsonRawResponse, restoreFromKV} from "./lib/common"; 2 | import debug_get_err from "./lib/error"; 3 | 4 | import {search_douban, gen_douban} from "./lib/douban"; 5 | import {search_imdb, gen_imdb} from "./lib/imdb"; 6 | import {search_bangumi, gen_bangumi} from "./lib/bangumi"; 7 | import {gen_steam} from "./lib/steam"; 8 | import {gen_indienova} from "./lib/indienova"; 9 | import {gen_epic} from "./lib/epic"; 10 | import page from './index.html'; 11 | 12 | /** 13 | * Cloudflare Worker entrypoint 14 | */ 15 | addEventListener("fetch", event => { 16 | event.respondWith(handle(event)); 17 | }); 18 | 19 | const support_list = { 20 | // 注意value值中正则的分组只能有一个,而且必须是sid信息,其他分组必须设置不捕获属性 21 | "douban": /(?:https?:\/\/)?(?:(?:movie|www)\.)?douban\.com\/(?:subject|movie)\/(\d+)\/?/, 22 | "imdb": /(?:https?:\/\/)?(?:www\.)?imdb\.com\/title\/(tt\d+)\/?/, 23 | "bangumi": /(?:https?:\/\/)?(?:bgm\.tv|bangumi\.tv|chii\.in)\/subject\/(\d+)\/?/, 24 | "steam": /(?:https?:\/\/)?(?:store\.)?steam(?:powered|community)\.com\/app\/(\d+)\/?/, 25 | "indienova": /(?:https?:\/\/)?indienova\.com\/game\/(\S+)/, 26 | "epic": /(?:https?:\/\/)?www\.epicgames\.com\/store\/[a-zA-Z-]+\/product\/(\S+)\/\S?/ 27 | }; 28 | 29 | const support_site_list = Object.keys(support_list); 30 | 31 | /** 32 | * Fetch and log a request 33 | * @param {Event} event 34 | */ 35 | async function handle(event) { 36 | const request = event.request; // 获取请求 37 | 38 | // 处理OPTIONS 39 | if (request.method === "OPTIONS") { 40 | return handleOptions(request); 41 | } 42 | 43 | // 检查缓存,命中则直接返回 44 | const cache = caches.default; // 定义缓存 45 | let response = await cache.match(request); 46 | 47 | if (!response) { // 未命中缓存 48 | // 使用URI() 解析request.url 49 | let uri = new URL(request.url); 50 | 51 | try { 52 | let cache_key; 53 | // 不存在任何请求字段,且在根目录,返回默认页面(HTML) 54 | if (uri.pathname === '/' && uri.search === '') { 55 | response = await makeIndexResponse(); 56 | } 57 | // 其他的请求均应视为ajax请求,返回JSON 58 | else { 59 | // 如果设置有 APIKEY 环境变量,则进行检查 60 | if (globalThis['APIKEY'] && uri.searchParams.get('apikey') !== globalThis['APIKEY']) { 61 | return makeJsonRawResponse({ 62 | 'error': 'apikey required.' 63 | }, {status: 403}) 64 | } 65 | 66 | let response_data; 67 | if (uri.searchParams.get('search')) { 68 | if (globalThis['DISABLE_SEARCH']) { 69 | response_data = {error: "this ptgen disallow search"}; 70 | } else { 71 | // 搜索类(通过PT-Gen代理) 72 | let keywords = uri.searchParams.get('search'); 73 | let source = uri.searchParams.get('source') || 'douban'; 74 | cache_key = `search-${source}-${keywords}` 75 | 76 | const cache_data = await restoreFromKV(cache_key) 77 | if (cache_data) { 78 | response_data = cache_data 79 | } else if (support_site_list.includes(source)) { 80 | if (source === 'douban') { 81 | response_data = await search_douban(keywords) 82 | } else if (source === 'imdb') { 83 | response_data = await search_imdb(keywords) 84 | } else if (source === 'bangumi') { 85 | response_data = await search_bangumi(keywords) 86 | } else { 87 | // 没有对应方法搜索的资源站点 88 | response_data = {error: "Miss search function for `source`: " + source + "."} 89 | } 90 | } else { 91 | response_data = {error: "Unknown value of key `source`."}; 92 | } 93 | } 94 | } else { 95 | // 内容生成类 96 | let site, sid; 97 | 98 | // 请求字段 `&url=` 存在 99 | if (uri.searchParams.get("url")) { 100 | let url_ = uri.searchParams.get("url"); 101 | for (let site_ in support_list) { 102 | let pattern = support_list[site_]; 103 | if (url_.match(pattern)) { 104 | site = site_; 105 | sid = url_.match(pattern)[1]; 106 | break; 107 | } 108 | } 109 | } else { 110 | site = uri.searchParams.get("site"); 111 | sid = uri.searchParams.get("sid"); 112 | } 113 | 114 | // 如果site和sid不存在的话,提前返回 115 | if (site == null || sid == null) { 116 | response_data = {error: "Miss key of `site` or `sid` , or input unsupported resource `url`."}; 117 | } else { 118 | cache_key = `info-${site}-${sid}` 119 | 120 | const cache_data = await restoreFromKV(cache_key) 121 | if (cache_data) { 122 | response_data = cache_data 123 | } else if (support_site_list.includes(site)) { 124 | // 进入对应资源站点处理流程 125 | if (site === "douban") { 126 | response_data = await gen_douban(sid); 127 | } else if (site === "imdb") { 128 | response_data = await gen_imdb(sid); 129 | } else if (site === "bangumi") { 130 | response_data = await gen_bangumi(sid); 131 | } else if (site === "steam") { 132 | response_data = await gen_steam(sid); 133 | } else if (site === "indienova") { 134 | response_data = await gen_indienova(sid); 135 | } else if (site === "epic") { 136 | response_data = await gen_epic(sid); 137 | } else { 138 | // 没有对应方法的资源站点,(真的会有这种情况吗? 139 | response_data = {error: "Miss generate function for `site`: " + site + "."}; 140 | } 141 | } else { 142 | response_data = {error: "Unknown value of key `site`."}; 143 | } 144 | } 145 | } 146 | 147 | if (response_data) { 148 | response = makeJsonResponse(response_data) 149 | if (globalThis['PT_GEN_STORE'] && typeof response_data.error === 'undefined') { 150 | await globalThis['PT_GEN_STORE'].put(cache_key, JSON.stringify(response_data), {expirationTtl: 86400 * 2}) 151 | } 152 | } 153 | } 154 | 155 | 156 | // 添加缓存,此处如果response如果为undefined的话会抛出错误 157 | event.waitUntil(cache.put(request, response.clone())); 158 | } catch (e) { 159 | let err_return = { 160 | error: `Internal Error, Please contact @${AUTHOR}. Exception: ${e.message}` 161 | }; 162 | 163 | if (uri.searchParams.get("debug") === '1') { 164 | err_return['debug'] = debug_get_err(e, request); 165 | } 166 | 167 | response = makeJsonResponse(err_return); 168 | // 当发生Internal Error的时候不应该进行cache 169 | } 170 | } 171 | 172 | return response; 173 | } 174 | 175 | //- 辅助方法 -// 176 | function handleOptions(request) { 177 | if (request.headers.get("Origin") !== null && 178 | request.headers.get("Access-Control-Request-Method") !== null && 179 | request.headers.get("Access-Control-Request-Headers") !== null) { 180 | // Handle CORS pre-flight request. 181 | return new Response(null, { 182 | headers: { 183 | "Access-Control-Allow-Origin": "*", 184 | "Access-Control-Allow-Credentials": "true", 185 | "Access-Control-Allow-Methods": "GET,HEAD,OPTIONS", 186 | "Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers" 187 | } 188 | }) 189 | } else { 190 | // Handle standard OPTIONS request. 191 | return new Response(null, { 192 | headers: { 193 | "Allow": "GET, HEAD, OPTIONS", 194 | } 195 | }) 196 | } 197 | } 198 | 199 | async function makeIndexResponse() { 200 | return new Response(page, { 201 | headers: { 202 | 'Content-Type': 'text/html' 203 | }, 204 | }); 205 | } 206 | -------------------------------------------------------------------------------- /lib/bangumi.js: -------------------------------------------------------------------------------- 1 | import { page_parser, NONE_EXIST_ERROR } from "./common"; 2 | 3 | export async function search_bangumi(query) { 4 | const tp_dict = {1: "漫画/小说", 2: "动画/二次元番", 3: "音乐", 4: "游戏", 6: "三次元番"}; 5 | let bgm_search = await fetch(`http://api.bgm.tv/search/subject/${query}?responseGroup=large`) 6 | let bgm_search_json = await bgm_search.json(); 7 | return { 8 | data: bgm_search_json.list.map(d => { 9 | return { 10 | year: d['air_date'].slice(0, 4), 11 | subtype: tp_dict[d['type']], 12 | title: d['name_cn'] !== '' ? d['name_cn'] : d['name'], 13 | subtitle: d['name'], 14 | link: d['url'] 15 | } 16 | }) 17 | } 18 | } 19 | 20 | export async function gen_bangumi(sid) { 21 | let data = { 22 | site: "bangumi", 23 | sid: sid 24 | }; 25 | 26 | // 请求页面 27 | let bangumi_link = `https://bgm.tv/subject/${sid}`; 28 | let bangumi_page_resp = await fetch(bangumi_link); 29 | let bangumi_page_raw = await bangumi_page_resp.text(); 30 | if (bangumi_page_raw.match(/呜咕,出错了/)) { 31 | return Object.assign(data, { 32 | error: NONE_EXIST_ERROR 33 | }); 34 | } 35 | 36 | data["alt"] = bangumi_link; 37 | 38 | // 立即请求附加资源 39 | let bangumi_characters_req = fetch(`${bangumi_link}/characters`) 40 | 41 | let $ = page_parser(bangumi_page_raw); 42 | 43 | // 对页面进行划区 44 | let cover_staff_another = $("div#bangumiInfo"); 45 | let cover_another = cover_staff_another.find("a.thickbox.cover"); 46 | let info_another = cover_staff_another.find("ul#infobox"); 47 | let story_another = $("div#subject_summary"); 48 | // let cast_another = $('div#browserItemList'); 49 | 50 | /* data['cover'] 为向前兼容项,之后均用 poster 表示海报 51 | * 这里有个问题,就是仍按 img.attr('src') 会取不到值因为 cf-worker中fetch 返回的html片段如下 : https://pastebin.com/0wPLAf8t 52 | * 暂时不明白是因为 cf-worker 的问题还是 cf-CDN 的问题,因为直接源代码审查未发现该片段。 53 | */ 54 | data["cover"] = data["poster"] = cover_another ? ("https:" + cover_another.attr("href")).replace(/\/cover\/[lcmsg]\//, "/cover/l/") : ""; 55 | data["story"] = story_another ? story_another.text().trim() : ""; 56 | 57 | // 中文名、话数、放送开始、放送星期等信息 不视为staff列表项,将其转存进info项中 58 | let info = info_another.find("li").map(function () { 59 | return $(this).text(); 60 | }).get(); 61 | data["staff"] = info.filter(d => { 62 | return !/^(中文名|话数|放送开始|放送星期|别名|官方网站|播放电视台|其他电视台|Copyright)/.test(d) 63 | }); 64 | data["info"] = info.filter(d => !(data["staff"].includes(d))); 65 | 66 | // ---其他页面信息,但是暂未放入format中 67 | 68 | // 评分信息 69 | data["bangumi_votes"] = $('span[property="v:votes"]').text(); 70 | data["bangumi_rating_average"] = $('div.global_score > span[property="v:average"]').text(); 71 | 72 | // 标签 73 | data["tags"] = $('#subject_detail > div.subject_tag_section > div > a > span').map(function () { 74 | return $(this).text() 75 | }).get() 76 | 77 | // ---其他暂未放入format的页面信息结束 78 | 79 | // 角色信息 80 | let bangumi_characters_resp = await bangumi_characters_req; 81 | let bangumi_characters_page_raw = await bangumi_characters_resp.text(); 82 | let bangumi_characters_page = page_parser(bangumi_characters_page_raw); 83 | let cast_actors = bangumi_characters_page("div#columnInSubjectA > div.light_odd > div.clearit"); 84 | 85 | data["cast"] = cast_actors.map(function () { 86 | let tag = bangumi_characters_page(this); 87 | let h2 = tag.find("h2"); 88 | let char = (h2.find("span.tip").text() || h2.find("a").text()).replace(/\//, "").trim(); 89 | let cv = tag.find("div.clearit > p").map(function () { 90 | let p = bangumi_characters_page(this); 91 | return (p.find("small") || p.find("a")).text().trim(); 92 | }).get().join(","); 93 | return `${char}: ${cv}`; 94 | }).get(); 95 | 96 | // 生成format 97 | let descr = (data["poster"] && data["poster"].length > 0) ? `[img]${data["poster"]}[/img]\n\n` : ""; 98 | descr += (data["story"] && data["story"].length > 0) ? `[b]Story: [/b]\n\n${data["story"]}\n\n` : ""; 99 | // 读取前15项staff信息 100 | descr += (data["staff"] && data["staff"].length > 0) ? `[b]Staff: [/b]\n\n${data["staff"].slice(0, 15).join("\n")}\n\n` : ""; 101 | // 读取前9项cast信息 102 | descr += (data["cast"] && data["cast"].length > 0) ? `[b]Cast: [/b]\n\n${data["cast"].slice(0, 9).join("\n")}\n\n` : ""; 103 | descr += (data["alt"] && data["alt"].length > 0) ? `(来源于 ${data["alt"]} )\n` : ""; 104 | 105 | data["format"] = descr.trim(); 106 | data["success"] = true; // 更新状态为成功 107 | return data; 108 | } 109 | -------------------------------------------------------------------------------- /lib/common.js: -------------------------------------------------------------------------------- 1 | const cheerio = require("cheerio"); // HTML页面解析 2 | const HTML2BBCode = require("html2bbcode").HTML2BBCode; 3 | 4 | // 常量定义 5 | export const AUTHOR = globalThis['AUTHOR'] ? globalThis['AUTHOR'] : "Rhilip"; 6 | const VERSION = "0.6.4"; 7 | 8 | /** 公有的JSON字段,其他字段为不同生成模块的信息 9 | * 考虑到历史兼容的问题,应该把所有字段都放在顶层字典 10 | * (虽然说最好的实践是放在 root.data 里面 11 | */ 12 | const default_body = { 13 | "success": false, // 请求是否成功,客户端应该首先检查该字段 14 | "error": null, // 如果请求失败,此处为失败原因 15 | "format": "", // 使用BBCode格式整理的简介 16 | "copyright": `Powered by @${AUTHOR}`, // 版权信息 17 | "version": VERSION, // 版本 18 | "generate_at": 0 // 生成时间(毫秒级时间戳),可以通过这个值与当前时间戳比较判断缓存是否应该过期 19 | }; 20 | 21 | export const NONE_EXIST_ERROR = "The corresponding resource does not exist."; 22 | 23 | // 解析HTML页面 24 | export function page_parser(responseText) { 25 | return cheerio.load(responseText, { 26 | decodeEntities: false 27 | }); 28 | } 29 | 30 | // 解析JSONP返回 31 | export function jsonp_parser(responseText) { 32 | try { 33 | responseText = responseText.replace(/\n/ig, '').match(/[^(]+\((.+)\)/)[1]; 34 | return JSON.parse(responseText); 35 | } catch (e) { 36 | return {} 37 | } 38 | } 39 | 40 | // Html2bbcode 41 | export function html2bbcode(html) { 42 | let converter = new HTML2BBCode(); 43 | let bbcode = converter.feed(html); 44 | return bbcode.toString(); 45 | } 46 | 47 | export async function restoreFromKV(cache_key) { 48 | /* global PT_GEN_STORE */ 49 | if (globalThis['PT_GEN_STORE']) { 50 | const cache_data = await PT_GEN_STORE.get(cache_key) 51 | if (cache_data !== null) { 52 | return JSON.parse(cache_data) 53 | } 54 | } 55 | } 56 | 57 | // 返回Json请求 58 | export function makeJsonRawResponse(body, headers) { 59 | headers = { 60 | status: 200, 61 | headers: { 62 | "Content-Type": "application/json", 63 | "Access-Control-Allow-Origin": "*" // CORS 64 | }, 65 | ...(headers || {}) 66 | } 67 | return new Response(JSON.stringify(body || {}, null, 2), headers) 68 | } 69 | 70 | export function makeJsonResponse(body_update) { 71 | const body = Object.assign( 72 | default_body, 73 | body_update, { 74 | generate_at: (new Date()).valueOf() 75 | } 76 | ); 77 | return makeJsonRawResponse(body) 78 | } 79 | -------------------------------------------------------------------------------- /lib/douban.js: -------------------------------------------------------------------------------- 1 | import {jsonp_parser, NONE_EXIST_ERROR, page_parser} from "./common"; 2 | 3 | /* global DOUBAN_COOKIE */ 4 | 5 | let fetch_init = {} 6 | if (globalThis['DOUBAN_COOKIE']) { 7 | fetch_init = {headers: {"Cookie": DOUBAN_COOKIE}} 8 | } 9 | 10 | export async function search_douban(query) { 11 | let douban_search = await fetch(`https://movie.douban.com/j/subject_suggest?q=${query}`, fetch_init); 12 | let douban_search_json = await douban_search.json(); 13 | 14 | return { 15 | data: douban_search_json.map(d => { 16 | return { 17 | year: d.year, 18 | subtype: d.type, 19 | title: d.title, 20 | subtitle: d.sub_title, 21 | link: `https://movie.douban.com/subject/${d.id}/` 22 | } 23 | }) 24 | } 25 | } 26 | 27 | export async function gen_douban(sid) { 28 | let data = { 29 | site: "douban", 30 | sid: sid 31 | }; 32 | 33 | // 下面开始正常的豆瓣处理流程 34 | let douban_link = `https://movie.douban.com/subject/${sid}/`; // 构造链接 35 | let db_page_resp = await fetch(douban_link, fetch_init); // 请求豆瓣对应项目主页面 36 | let douban_page_raw = await db_page_resp.text(); 37 | 38 | // 对异常进行处理 39 | if (douban_page_raw.match(/你想访问的页面不存在/)) { 40 | return Object.assign(data, { 41 | error: NONE_EXIST_ERROR 42 | }); 43 | } else if (douban_page_raw.match(/检测到有异常请求/)) { // 真的会有这种可能吗? 44 | return Object.assign(data, { 45 | error: "GenHelp was temporary banned by Douban, Please wait...." 46 | }); 47 | } else { 48 | let awards_page_req = fetch(`${douban_link}awards`, fetch_init) // 马上请求豆瓣获奖界面 49 | 50 | // 解析主页面 51 | let $ = page_parser(douban_page_raw); 52 | 53 | let title = $("title").text().replace("(豆瓣)", "").trim(); 54 | 55 | // 从ld+json中获取原来API返回的部分信息 56 | let ld_json = JSON.parse($('head > script[type="application/ld+json"]').html().replace(/(\r\n|\n|\r|\t)/gm, '')); 57 | 58 | // 元素获取方法 59 | let fetch_anchor = function (anchor) { 60 | return anchor[0].nextSibling.nodeValue.trim(); 61 | }; 62 | 63 | // 所有需要的元素 64 | let poster; 65 | let this_title, trans_title, aka; 66 | let year, region, genre, language, playdate; 67 | let imdb_link, imdb_id, imdb_average_rating, imdb_votes, imdb_rating; 68 | let douban_average_rating, douban_votes, douban_rating; 69 | let episodes, duration; 70 | let director, writer, cast; 71 | let tags, introduction, awards; 72 | 73 | // 提前imdb相关请求 74 | let imdb_api_req; 75 | let imdb_anchor = $('#info span.pl:contains("IMDb")'); 76 | if (imdb_anchor.length > 0) { 77 | data["imdb_id"] = imdb_id = fetch_anchor(imdb_anchor); 78 | data["imdb_link"] = imdb_link = `https://www.imdb.com/title/${imdb_id}/` 79 | imdb_api_req = fetch(`https://p.media-imdb.com/static-content/documents/v1/title/${imdb_id}/ratings%3Fjsonp=imdb.rating.run:imdb.api.title.ratings/data.json`); 80 | } 81 | 82 | let chinese_title = data["chinese_title"] = title; 83 | let foreign_title = data["foreign_title"] = $('span[property="v:itemreviewed"]').text().replace(data["chinese_title"], "").trim(); 84 | 85 | let aka_anchor = $('#info span.pl:contains("又名")'); 86 | if (aka_anchor.length > 0) { 87 | aka = fetch_anchor(aka_anchor).split(" / ").sort(function (a, b) { //首字(母)排序 88 | return a.localeCompare(b); 89 | }).join("/"); 90 | data["aka"] = aka.split("/"); 91 | } 92 | 93 | if (foreign_title) { 94 | trans_title = chinese_title + (aka ? ("/" + aka) : ""); 95 | this_title = foreign_title; 96 | } else { 97 | trans_title = aka ? aka : ""; 98 | this_title = chinese_title; 99 | } 100 | 101 | data["trans_title"] = trans_title.split("/"); 102 | data["this_title"] = this_title.split("/"); 103 | 104 | let regions_anchor = $('#info span.pl:contains("制片国家/地区")'); //产地 105 | let language_anchor = $('#info span.pl:contains("语言")'); //语言 106 | let episodes_anchor = $('#info span.pl:contains("集数")'); //集数 107 | let duration_anchor = $('#info span.pl:contains("单集片长")'); //片长 108 | 109 | data["year"] = year = " " + $("#content > h1 > span.year").text().substr(1, 4); 110 | data["region"] = region = regions_anchor[0] ? fetch_anchor(regions_anchor).split(" / ") : ""; 111 | 112 | data["genre"] = genre = $("#info span[property=\"v:genre\"]").map(function () { //类别 113 | return $(this).text().trim(); 114 | }).toArray(); 115 | 116 | data["language"] = language = language_anchor[0] ? fetch_anchor(language_anchor).split(" / ") : ""; 117 | 118 | data["playdate"] = playdate = $("#info span[property=\"v:initialReleaseDate\"]").map(function () { //上映日期 119 | return $(this).text().trim(); 120 | }).toArray().sort(function (a, b) { //按上映日期升序排列 121 | return new Date(a) - new Date(b); 122 | }); 123 | 124 | data["episodes"] = episodes = episodes_anchor[0] ? fetch_anchor(episodes_anchor) : ""; 125 | data["duration"] = duration = duration_anchor[0] ? fetch_anchor(duration_anchor) : $("#info span[property=\"v:runtime\"]").text().trim(); 126 | 127 | // 简介 首先检查是不是有隐藏的,如果有,则直接使用隐藏span的内容作为简介,不然则用 span[property="v:summary"] 的内容 128 | // 20221201 issue#34 豆瓣将上一层div的id从 link-report 变为 link-report-intra 129 | let introduction_another = $('#link-report-intra > span.all.hidden, #link-report-intra > [property="v:summary"], #link-report > span.all.hidden, #link-report > [property="v:summary"]') 130 | data["introduction"] = introduction = ( 131 | introduction_another.length > 0 ? introduction_another.text() : '暂无相关剧情介绍' 132 | ).split('\n').map(a => a.trim()).filter(a => a.length > 0).join('\n'); // 处理简介缩进 133 | 134 | // 从ld_json中获取信息 135 | data["douban_rating_average"] = douban_average_rating = ld_json['aggregateRating'] ? ld_json['aggregateRating']['ratingValue'] : 0; 136 | data["douban_votes"] = douban_votes = ld_json['aggregateRating'] ? ld_json['aggregateRating']['ratingCount'] : 0; 137 | data["douban_rating"] = douban_rating = `${douban_average_rating}/10 from ${douban_votes} users`; 138 | 139 | data["poster"] = poster = ld_json['image'] 140 | .replace(/s(_ratio_poster|pic)/g, "l$1") 141 | .replace("img3", "img1"); 142 | 143 | data["director"] = director = ld_json['director'] ? ld_json['director'] : []; 144 | data["writer"] = writer = ld_json['author'] ? ld_json['author'] : []; 145 | data["cast"] = cast = ld_json['actor'] ? ld_json['actor'] : []; 146 | 147 | let tag_another = $('div.tags-body > a[href^="/tag"]'); 148 | if (tag_another.length > 0) { 149 | data["tags"] = tags = tag_another.map(function () { 150 | return $(this).text() 151 | }).get(); 152 | } 153 | 154 | let awards_page_resp = await awards_page_req; 155 | let awards_page_raw = await awards_page_resp.text(); 156 | let awards_page = page_parser(awards_page_raw); 157 | data["awards"] = awards = awards_page("#content > div > div.article").html() 158 | .replace(/[ \n]/g, "") 159 | .replace(/<\/li>
  • /g, "
  • ") 160 | .replace(/<\/a> ]*>/g, "\n") 162 | .replace(/<[^>]+>/g, "") 163 | .replace(/ /g, " ") 164 | .replace(/ +\n/g, "\n") 165 | .trim(); 166 | 167 | if (imdb_api_req) { 168 | let imdb_api_resp = await imdb_api_req; 169 | let imdb_api_raw = await imdb_api_resp.text(); 170 | let imdb_json = jsonp_parser(imdb_api_raw); 171 | 172 | if (imdb_json["resource"]) { 173 | data["imdb_rating_average"] = imdb_average_rating = imdb_json["resource"]["rating"] || 0; 174 | data["imdb_votes"] = imdb_votes = imdb_json["resource"]["ratingCount"] || 0; 175 | data["imdb_rating"] = imdb_rating = `${imdb_average_rating}/10 from ${imdb_votes} users`; 176 | } 177 | } 178 | 179 | // 生成format 180 | let descr = poster ? `[img]${poster}[/img]\n\n` : ""; 181 | descr += trans_title ? `◎译  名 ${trans_title}\n` : ""; 182 | descr += this_title ? `◎片  名 ${this_title}\n` : ""; 183 | descr += year ? `◎年  代 ${year.trim()}\n` : ""; 184 | descr += region ? `◎产  地 ${region}\n` : ""; 185 | descr += genre ? `◎类  别 ${genre.join(" / ")}\n` : ""; 186 | descr += language ? `◎语  言 ${language}\n` : ""; 187 | descr += playdate ? `◎上映日期 ${playdate.join(" / ")}\n` : ""; 188 | descr += imdb_rating ? `◎IMDb评分 ${imdb_rating}\n` : ""; 189 | descr += imdb_link ? `◎IMDb链接 ${imdb_link}\n` : ""; 190 | descr += douban_rating ? `◎豆瓣评分 ${douban_rating}\n` : ""; 191 | descr += douban_link ? `◎豆瓣链接 ${douban_link}\n` : ""; 192 | descr += episodes ? `◎集  数 ${episodes}\n` : ""; 193 | descr += duration ? `◎片  长 ${duration}\n` : ""; 194 | descr += director && director.length > 0 ? `◎导  演 ${director.map(x => x['name']).join(" / ")}\n` : ""; 195 | descr += writer && writer.length > 0 ? `◎编  剧 ${writer.map(x => x['name']).join(" / ")}\n` : ""; 196 | descr += cast && cast.length > 0 ? `◎主  演 ${cast.map(x => x['name']).join("\n" + " ".repeat(4) + "  ").trim()}\n` : ""; 197 | descr += tags && tags.length > 0 ? `\n◎标  签 ${tags.join(" | ")}\n` : ""; 198 | descr += introduction ? `\n◎简  介\n\n  ${introduction.replace(/\n/g, "\n" + " ".repeat(2))}\n` : ""; 199 | descr += awards ? `\n◎获奖情况\n\n  ${awards.replace(/\n/g, "\n" + " ".repeat(2))}\n` : ""; 200 | 201 | data["format"] = descr.trim(); 202 | data["success"] = true; // 更新状态为成功 203 | return data; 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /lib/epic.js: -------------------------------------------------------------------------------- 1 | import {NONE_EXIST_ERROR} from "./common"; 2 | 3 | export async function gen_epic(sid) { 4 | let data = { 5 | site: "epic", 6 | sid: sid 7 | }; 8 | 9 | let epic_api_resp = await fetch(`https://store-content.ak.epicgames.com/api/zh-CN/content/products/${sid}`); 10 | if (epic_api_resp.status === 404) { // 当接口返回404时内容不存在,200则继续解析 11 | return Object.assign(data, { 12 | error: NONE_EXIST_ERROR 13 | }); 14 | } 15 | 16 | let epic_api_json = await epic_api_resp.json(); 17 | 18 | // 从顶层字典中获得page 19 | let page = epic_api_json["pages"][0]; 20 | 21 | data["name"] = page["productName"]; // 游戏名称 22 | data["epic_link"] = `https://www.epicgames.com/store/zh-CN/product/${sid}/home`; // 商店链接 23 | 24 | data["desc"] = page["data"]["about"]["description"]; // 游戏简介 25 | data["poster"] = data["logo"] = page["data"]["hero"]["logoImage"]["src"]; // 游戏logo 26 | data["screenshot"] = (page["data"]["gallery"]["galleryImages"] || []).map(x => x["src"]); // 游戏截图 27 | 28 | let requirements = page["data"]["requirements"] || []; 29 | 30 | // 语言 31 | let languages = []; 32 | for (let i = 0; i < requirements["languages"].length; i++) { 33 | let lang = requirements["languages"][i]; 34 | if (lang.search(':') === -1 && lang.search(":") === -1 && languages.length) { 35 | // ['语音:英语', '法语', '德语', ..., '文本:繁体中文、简体中文', ' 2020 年 1 月 30 日即将上线:日语'] 36 | let last = languages.length - 1; 37 | languages[last] += `、${lang}`; 38 | } else if (lang.search('-') > -1) { 39 | // ['语音:英语、法语、意大利语、德语、西班牙语、日语、韩语、简体中文 - 文本:俄语、葡萄牙语(巴西)'] 40 | let l = lang.split('-'); 41 | for (let j = 0; j < l.length; j++) { 42 | languages.push(l[j].trim()); 43 | } 44 | } else { 45 | // 正常情况 46 | languages.push(lang); 47 | } 48 | } 49 | data["language"] = languages; 50 | 51 | // 最低配置 推荐配置 评级 52 | data["min_req"] = {}; 53 | data["max_req"] = {}; 54 | requirements["systems"].forEach(function (i) { 55 | let systemType = i["systemType"]; 56 | let details = i["details"]; 57 | data["min_req"][systemType] = details.map(x => `${x["title"]}: ${x["minimum"] || ''}`); 58 | data["max_req"][systemType] = details.map(x => `${x["title"]}: ${x["recommended"] || ''}`); 59 | }); 60 | data["level"] = requirements["legalTags"].map(x => x["src"]); 61 | 62 | // 生成format 63 | let descr = (data["logo"] && data["logo"].length > 0) ? `[img]${data["logo"]}[/img]\n\n` : ""; 64 | descr += "【基本信息】\n\n"; // 基本信息为原来的baseinfo块 65 | descr += (data["name"] && data["name"].length > 0) ? `游戏名称:${data["name"]}\n` : ""; 66 | descr += (data["epic_link"] && data["epic_link"].length > 0) ? `商店链接:${data["epic_link"]}\n` : ""; 67 | descr += "\n"; 68 | descr += (data["language"] && data["language"].length > 0) ? `【支持语言】\n\n${data["language"].join("\n")}\n\n` : ""; 69 | descr += (data["desc"] && data["desc"].length > 0) ? `【游戏简介】\n\n${data["desc"]}\n\n` : ""; 70 | 71 | let req_list = { 72 | "min_req": "【最低配置】", 73 | "max_req": "【推荐配置】" 74 | }; 75 | for (let req in req_list) { 76 | if (Object.entries(data[req]).length === 0 && data[req].constructor === Object) continue; 77 | descr += `${req_list[req]}\n\n`; 78 | for (let system in data[req]) { 79 | // noinspection JSUnfilteredForInLoop 80 | descr += `${system}\n${data[req][system].join("\n")}\n`; 81 | } 82 | descr += "\n\n"; 83 | } 84 | descr += (data["screenshot"] && data["screenshot"].length > 0) ? `【游戏截图】\n\n${data["screenshot"].map(x => `[img]${x}[/img]`).join("\n")}\n\n` : ""; 85 | descr += (data["level"] && data["level"].length > 0) ? `【游戏评级】\n\n${data["level"].map(x => `[img]${x}[/img]`).join("\n")}\n\n` : ""; 86 | 87 | data["format"] = descr.trim(); 88 | data["success"] = true; // 更新状态为成功 89 | return data; 90 | } 91 | -------------------------------------------------------------------------------- /lib/error.js: -------------------------------------------------------------------------------- 1 | export default function debug_get_err(err, request) { 2 | const errType = err.name || (err.contructor || {}).name; 3 | const frames = parse_err(err); 4 | const extraKeys = Object.keys(err).filter(key => !['name', 'message', 'stack'].includes(key)); 5 | return { 6 | message: errType + ': ' + (err.message || ''), 7 | exception: { 8 | values: [ 9 | { 10 | type: errType, 11 | value: err.message, 12 | stacktrace: frames.length ? { frames: frames.reverse() } : undefined, 13 | }, 14 | ], 15 | }, 16 | extra: extraKeys.length 17 | ? { 18 | [errType]: extraKeys.reduce((obj, key) => ({ ...obj, [key]: err[key] }), {}), 19 | } 20 | : undefined, 21 | timestamp: Date.now() / 1000, 22 | request: 23 | request && request.url 24 | ? { 25 | method: request.method, 26 | url: request.url, 27 | query_string: request.query, 28 | headers: request.headers, 29 | data: request.body, 30 | } 31 | : undefined, 32 | } 33 | } 34 | 35 | function parse_err(err) { 36 | return (err.stack || '') 37 | .split('\n') 38 | .slice(1) 39 | .map(line => { 40 | if (line.match(/^\s*[-]{4,}$/)) { 41 | return { filename: line } 42 | } 43 | 44 | // From https://github.com/felixge/node-stack-trace/blob/1ec9ba43eece124526c273c917104b4226898932/lib/stack-trace.js#L42 45 | const lineMatch = line.match(/at (?:(.+)\s+\()?(?:(.+?):(\d+)(?::(\d+))?|([^)]+))\)?/); 46 | if (!lineMatch) { 47 | return 48 | } 49 | 50 | return { 51 | function: lineMatch[1] || undefined, 52 | filename: lineMatch[2] || undefined, 53 | lineno: +lineMatch[3] || undefined, 54 | colno: +lineMatch[4] || undefined, 55 | in_app: lineMatch[5] !== 'native' || undefined, 56 | } 57 | }) 58 | .filter(Boolean) 59 | } -------------------------------------------------------------------------------- /lib/imdb.js: -------------------------------------------------------------------------------- 1 | import {NONE_EXIST_ERROR, page_parser} from "./common"; 2 | 3 | function getNumberFromString(raw) { 4 | return (raw.match(/[\d,]+/) || [0])[0].replace(/,/g, ""); 5 | } 6 | 7 | export async function search_imdb(query) { 8 | query = query.toLowerCase() // 大写字母须转成小写 9 | let imdb_search = await fetch(`https://v2.sg.media-imdb.com/suggestion/${query.slice(0, 1)}/${query}.json`) 10 | let imdb_search_json = await imdb_search.json(); 11 | return { 12 | data: (imdb_search_json.d || []).filter(d => { 13 | return /^tt/.test(d.id) 14 | }).map(d => { 15 | return { 16 | year: d.y, 17 | subtype: d.q, 18 | title: d.l, 19 | link: `https://www.imdb.com/title/${d.id}` 20 | } 21 | }) 22 | } 23 | } 24 | 25 | export async function gen_imdb(sid) { 26 | let data = { 27 | site: "imdb", 28 | sid: sid 29 | }; 30 | // 处理imdb_id tt\d{7,8} 或者 \d{0,8} 31 | if (sid.startsWith("tt")) { 32 | sid = sid.slice(2); 33 | } 34 | 35 | // 不足7位补齐到7位,如果是7、8位则直接使用 36 | let imdb_id = "tt" + sid.padStart(7, "0"); 37 | let imdb_url = `https://www.imdb.com/title/${imdb_id}/`; 38 | 39 | let imdb_page_resp = await fetch(imdb_url); 40 | let imdb_page_raw = await imdb_page_resp.text(); 41 | 42 | if (imdb_page_raw.match(/404 Error - IMDb/)) { 43 | return Object.assign(data, { 44 | error: NONE_EXIST_ERROR 45 | }); 46 | } 47 | 48 | let imdb_release_info_page_req = fetch(`${imdb_url}releaseinfo`) 49 | 50 | let $ = page_parser(imdb_page_raw); 51 | 52 | // 首先解析页面中的json信息,并从中获取数据 `` 53 | let page_json = JSON.parse($('script[type="application/ld+json"]').html().replace(/\n/ig, '')); 54 | 55 | data["imdb_id"] = imdb_id; 56 | data["imdb_link"] = imdb_url; 57 | 58 | // 处理可以直接从page_json中复制过来的信息 59 | let copy_items = ["@type", "name", "genre", "contentRating", "datePublished", "description", "duration"]; 60 | for (let i = 0; i < copy_items.length; i++) { 61 | let copy_item = copy_items[i]; 62 | data[copy_item] = page_json[copy_item]; 63 | } 64 | 65 | data["poster"] = page_json["image"]; 66 | 67 | if (data["datePublished"]) { 68 | data["year"] = data["datePublished"].slice(0, 4); 69 | } 70 | 71 | let person_items = ["actor", "director", "creator"]; 72 | for (let i = 0; i < person_items.length; i++) { 73 | let person_item = person_items[i]; 74 | let raw = page_json[person_item]; 75 | 76 | if (!raw) continue; // 没有对应直接直接进入下一轮 77 | 78 | // 有时候这个可能为一个dict而不是dict array 79 | if (!Array.isArray(raw)) { 80 | raw = [raw]; 81 | } 82 | 83 | // 只要人的(Person),不要组织的(Organization) 84 | let item_persons = raw.filter((d) => { 85 | return d["@type"] === "Person"; 86 | }); 87 | 88 | if (item_persons.length > 0) { 89 | data[person_item + "s"] = item_persons.map((d) => { 90 | delete d["@type"]; 91 | return d; 92 | }); 93 | } 94 | } 95 | 96 | data["keywords"] = "keywords" in page_json ? page_json["keywords"].split(",") : []; 97 | let aggregate_rating = page_json["aggregateRating"] || {}; 98 | 99 | data["imdb_votes"] = aggregate_rating["ratingCount"] || 0; 100 | data["imdb_rating_average"] = aggregate_rating["ratingValue"] || 0; 101 | data["imdb_rating"] = `${data["imdb_rating_average"]}/10 from ${data["imdb_votes"]} users`; 102 | 103 | // 解析页面元素 104 | // 第一部分: Metascore,Reviews,Popularity 105 | let next_data_json = JSON.parse($('script#__NEXT_DATA__').html().replace(/\n/ig, '')); 106 | let total_data = {}; 107 | if ("props" in next_data_json && "urqlState" in next_data_json["props"]) { 108 | for (const [_, value] of Object.entries(next_data_json["props"]["urqlState"])) { 109 | if ("data" in value && "title" in value["data"] && value["data"]["title"]["id"] === imdb_id) { 110 | total_data = {...total_data, ...value["data"]["title"]}; 111 | } 112 | } 113 | } 114 | total_data = Object.fromEntries(Object.entries(total_data).filter(([_, value]) => value !== null)); 115 | if ("metacritic" in total_data && "metascore" in total_data["metacritic"] && "score" in total_data["metacritic"]["metascore"]) 116 | data["metascore"] = total_data["metacritic"]["metascore"]["score"]; 117 | if ("reviews" in total_data && "total" in total_data["reviews"]) 118 | data["reviews"] = total_data["reviews"]["total"]; 119 | if ("criticReviewsTotal" in total_data && "total" in total_data["criticReviewsTotal"]) 120 | data["critic"] = total_data["criticReviewsTotal"]["total"]; 121 | if ("meterRanking" in total_data && "currentRank" in total_data["meterRanking"]) 122 | data["popularity"] = total_data["meterRanking"]["currentRank"]; 123 | 124 | // 第二部分: Details 125 | let details_another = $("section[cel_widget_id='StaticFeature_Details']"); 126 | let title_anothers = details_another.find("li.ipc-metadata-list__item"); 127 | let details_dict = {}; 128 | title_anothers.each(function () { 129 | let label_tag = $(this).find(".ipc-metadata-list-item__label"); 130 | let values = $(this).find(".ipc-metadata-list-item__list-content-item"); 131 | 132 | if (values.length > 0) { 133 | let extracted_values = []; 134 | values.each(function () { 135 | const current_element = $(this); 136 | 137 | if (current_element.attr("href") && current_element.attr("href").startsWith("http")) { 138 | extracted_values.push(`${current_element.text()} - ${current_element.attr("href")}`); 139 | } else { 140 | extracted_values.push(current_element.text()); 141 | } 142 | }); 143 | details_dict[label_tag.text()] = extracted_values; 144 | } 145 | }); 146 | data["details"] = details_dict; 147 | 148 | // 请求附属信息 149 | // 第一部分: releaseinfo 150 | let imdb_release_info_page_resp = await imdb_release_info_page_req; 151 | let imdb_release_info_raw = await imdb_release_info_page_resp.text(); 152 | let imdb_release_info = page_parser(imdb_release_info_raw); 153 | 154 | let release_date_items = imdb_release_info("tr.release-date-item"); 155 | let release_date = [], 156 | aka = []; 157 | release_date_items.each(function () { 158 | let that = imdb_release_info(this); // $(this) ? 159 | let country = that.find("td.release-date-item__country-name"); 160 | let date = that.find("td.release-date-item__date"); 161 | 162 | if (country && date) { 163 | release_date.push({ 164 | country: country.text().trim(), 165 | date: date.text().trim() 166 | }); 167 | } 168 | }); 169 | data["release_date"] = release_date; 170 | 171 | let aka_items = imdb_release_info("tr.aka-item"); 172 | aka_items.each(function () { 173 | let that = imdb_release_info(this); 174 | let country = that.find("td.aka-item__name"); 175 | let title = that.find("td.aka-item__title"); 176 | 177 | if (country && title) { 178 | aka.push({ 179 | country: country.text().trim(), 180 | title: title.text().trim() 181 | }); 182 | } 183 | }); 184 | data["aka"] = aka; 185 | 186 | // 生成format 187 | let descr = (data["poster"] && data["poster"].length > 0) ? `[img]${data["poster"]}[/img]\n\n` : ""; 188 | descr += (data["name"] && data["name"].length > 0) ? `Title: ${data["name"]}\n` : ""; 189 | descr += (data["keywords"] && data["keywords"].length > 0) ? `Keywords: ${data["keywords"].join(", ")}\n` : ""; 190 | descr += (data["datePublished"] && data["datePublished"].length > 0) ? `Date Published: ${data["datePublished"]}\n` : ""; 191 | descr += (data["imdb_rating"] && data["imdb_rating"].length > 0) ? `IMDb Rating: ${data["imdb_rating"]}\n` : ""; 192 | descr += (data["imdb_link"] && data["imdb_link"].length > 0) ? `IMDb Link: ${data["imdb_link"]}\n` : ""; 193 | descr += (data["directors"] && data["directors"].length > 0) ? `Directors: ${data["directors"].map(i => i["name"]).join(" / ")}\n` : ""; 194 | descr += (data["creators"] && data["creators"].length > 0) ? `Creators: ${data["creators"].map(i => i["name"]).join(" / ")}\n` : ""; 195 | descr += (data["actors"] && data["actors"].length > 0) ? `Actors: ${data["actors"].map(i => i["name"]).join(" / ")}\n` : ""; 196 | descr += (data["description"] && data["description"].length > 0) ? `\nIntroduction\n ${data["description"].replace(/\n/g, "\n" + " ".repeat(2))}\n` : ""; 197 | 198 | data["format"] = descr.trim(); 199 | data["success"] = true; // 更新状态为成功 200 | return data; 201 | } 202 | -------------------------------------------------------------------------------- /lib/indienova.js: -------------------------------------------------------------------------------- 1 | import {NONE_EXIST_ERROR, page_parser} from "./common"; 2 | 3 | /* global INDIENOVA_COOKIE */ 4 | export async function gen_indienova(sid) { 5 | let data = { 6 | site: "indienova", 7 | sid: sid 8 | }; 9 | 10 | let fetch_init = {} 11 | if (globalThis['INDIENOVA_COOKIE']) { 12 | fetch_init = {headers: {"Cookie": INDIENOVA_COOKIE}} 13 | } 14 | 15 | let indienova_page_resp = await fetch(`https://indienova.com/game/${sid}`, fetch_init); 16 | let indienova_page_raw = await indienova_page_resp.text(); 17 | 18 | // 检查标题看对应资源是否存在 19 | if (indienova_page_raw.match(/出现错误/)) { 20 | return Object.assign(data, { 21 | error: NONE_EXIST_ERROR 22 | }); 23 | } 24 | 25 | let $ = page_parser(indienova_page_raw); 26 | 27 | data["poster"] = data["cover"] = $("div.cover-image img").attr("src"); // 提出封面链接 28 | data["chinese_title"] = $("title").text().split("|")[0].split("-")[0].trim(); // 提出标题部分 29 | 30 | let title_field = $("div.title-holder"); // 提取出副标部分 31 | data["another_title"] = title_field.find("h1 small") ? title_field.find("h1 small").text().trim() : ""; 32 | data["english_title"] = title_field.find("h1 span") ? title_field.find("h1 span").text().trim() : ""; 33 | data["release_date"] = title_field.find("p.gamedb-release").text().trim(); 34 | 35 | // 提取链接信息 36 | let link_field = $("div#tabs-link a.gamedb-link"); 37 | if (link_field.length > 0) { 38 | let links = {}; 39 | link_field.each(function () { 40 | let that = $(this); 41 | let site = that.text().trim(); 42 | links[site] = that.attr("href"); 43 | }); 44 | data["links"] = links; 45 | } 46 | 47 | // 提取简介、类型信息 48 | let intro_field = $("#tabs-intro"); 49 | data["intro"] = intro_field.find("div.bottommargin-sm").text().trim(); 50 | 51 | let tt = intro_field.find("p.single-line"); 52 | if (tt.length > 0) { 53 | data["intro_detail"] = tt.map(function () { 54 | return $(this).text().replace(/[ \n]+/ig, " ").replace(/,/g, "/").trim(); 55 | }).get(); 56 | } 57 | 58 | // 提取详细介绍 在游戏无详细介绍时用简介代替 59 | let descr_field = $("article"); 60 | data["descr"] = descr_field.length > 0 ? descr_field.text().replace("……显示全部", "").trim() : data["intro"]; 61 | 62 | // 提取评分信息 63 | let rating_field = $("div#scores text").map(function () { 64 | return $(this).text(); 65 | }).get(); 66 | data["rate"] = `${rating_field[0]}:${rating_field[1]} / ${rating_field[2]}:${rating_field[3]}`; 67 | 68 | // 提取制作与发行商 69 | let pubdev = $("div#tabs-devpub ul[class^=\"db-companies\"]"); 70 | // noinspection JSUnusedLocalSymbols 71 | data["dev"] = pubdev.eq(0).text().trim().split("\n").map(function (value, index, array) { 72 | return value.trim(); 73 | }); 74 | // noinspection JSUnusedLocalSymbols 75 | data["pub"] = pubdev.length === 2 ? pubdev.eq(1).text().trim().split("\n").map(function (value, index, array) { 76 | return value.trim(); 77 | }) : []; 78 | 79 | // 提取图片列表 80 | data["screenshot"] = $("li.slide img").map(function () { 81 | return $(this).attr("src"); 82 | }).get(); 83 | 84 | // 提取标签信息 85 | let cat_field = $("div.indienova-tags.gamedb-tags"); 86 | let cat = cat_field ? cat_field.text().trim().split("\n").map(x => x.trim()) : []; 87 | // 对cat进行去重并移除 "查看全部 +" 88 | data["cat"] = cat.filter(function (item, pos) { 89 | return cat.indexOf(item) === pos && item !== "查看全部 +"; 90 | }); 91 | 92 | // 提取分级信息 93 | let level_field = $("h4:contains(\"分级\") + div.bottommargin-sm"); 94 | data["level"] = level_field ? level_field.find("img").map(function () { 95 | return $(this).attr("src"); 96 | }).get() : []; 97 | 98 | // 提取价格信息 99 | let price_fields = $("ul.db-stores"); 100 | data["price"] = price_fields ? price_fields.find("li").map(function () { 101 | let price_field = $(this).find("a > div"); // 里面依次为3个div,分别为 store, platform , price 102 | let store = price_field.eq(0).text().trim(); 103 | //let platform = price_field.eq(1).text().trim(); // 均为图片,无内容 104 | let price = price_field.eq(2).text().trim().replace(/[ \n]{2,}/, " "); 105 | return `${store}:${price}`; 106 | }).get() : []; 107 | 108 | // 生成format 109 | let descr = data["cover"] ? `[img]${data["cover"]}[/img]\n\n` : ""; 110 | descr += "【基本信息】\n\n"; // 基本信息为原来的baseinfo块 111 | descr += (data["chinese_title"] && data["chinese_title"].length > 0) ? `中文名称:${data["chinese_title"]}\n` : ""; 112 | descr += (data["english_title"] && data["english_title"].length > 0) ? `英文名称:${data["english_title"]}\n` : ""; 113 | descr += (data["another_title"] && data["another_title"].length > 0) ? `其他名称:${data["another_title"]}\n` : ""; 114 | descr += (data["release_date"] && data["release_date"].length > 0) ? `发行时间:${data["release_date"]}\n` : ""; 115 | descr += (data["rate"] && data["rate"].length > 0) ? `评分:${data["rate"]}\n` : ""; 116 | descr += (data["dev"] && data["dev"].length > 0) ? `开发商:${data["dev"].join(" / ")}\n` : ""; 117 | descr += (data["pub"] && data["pub"].length > 0) ? `发行商:${data["pub"].join(" / ")}\n` : ""; 118 | descr += (data["intro_detail"] && data["intro_detail"].length > 0) ? `${data["intro_detail"].join("\n")}\n` : ""; 119 | descr += (data["cat"] && data["cat"].length > 0) ? `标签:${data["cat"].slice(0, 8).join(" | ")}\n` : ""; 120 | if ((data["links"] && data["links"].length > 0)) { 121 | let format_links = []; 122 | for (let [key, value] of Object.entries(data["links"])) { 123 | format_links.push(`[url=${value}]${key}[/url]`); 124 | } 125 | descr += `链接地址:${format_links.join(" ")}\n`; 126 | } 127 | descr += (data["price"] && data["price"].length > 0) ? `价格信息:${data["price"].join(" / ")}\n` : ""; 128 | descr += "\n"; 129 | descr += (data["descr"] && data["descr"].length > 0) ? `【游戏简介】\n\n${data["descr"]}\n\n` : ""; 130 | descr += (data["screenshot"] && data["screenshot"].length > 0) ? `【游戏截图】\n\n${data["screenshot"].map(x => `[img]${x}[/img]`).join("\n")}\n\n` : ""; 131 | descr += (data["level"] && data["level"].length > 0) ? `【游戏评级】\n\n${data["level"].map(x => `[img]${x}[/img]`).join("\n")}\n\n` : ""; 132 | 133 | data["format"] = descr.trim(); 134 | data["success"] = true; // 更新状态为成功 135 | return data; 136 | } 137 | -------------------------------------------------------------------------------- /lib/steam.js: -------------------------------------------------------------------------------- 1 | import {jsonp_parser, NONE_EXIST_ERROR, page_parser, html2bbcode} from "./common"; 2 | 3 | export async function gen_steam(sid) { 4 | let data = { 5 | site: "steam", 6 | sid: sid 7 | }; 8 | 9 | let steam_page_resp = await fetch(`https://store.steampowered.com/app/${sid}/?l=schinese`, { 10 | redirect: "manual", 11 | headers: { // 使用Cookies绕过年龄检查和成人内容提示,并强制中文 12 | "Cookie": "lastagecheckage=1-January-1975; birthtime=157737601; mature_content=1; wants_mature_content=1; Steam_Language=schinese" 13 | } 14 | }); 15 | 16 | // 不存在的资源会被302到首页,故检查标题 17 | if (steam_page_resp.status === 302) { 18 | return Object.assign(data, { 19 | error: NONE_EXIST_ERROR 20 | }); 21 | } else if (steam_page_resp.status === 403) { 22 | return Object.assign(data, { 23 | error: "GenHelp was temporary banned by Steam Server, Please wait...." 24 | }); 25 | } 26 | 27 | data["steam_id"] = sid; 28 | 29 | // 立即请求附加资源 30 | let steamcn_api_req = fetch(`https://steamdb.keylol.com/app/${sid}/data.js?v=38`); 31 | let $ = page_parser(await steam_page_resp.text()); 32 | 33 | // 从网页中定位数据 34 | let name_anchor = $("div.apphub_AppName") || $("span[itemprop=\"name\"]"); // 游戏名 35 | let cover_anchor = $("img.game_header_image_full[src]"); // 游戏封面图 36 | let detail_anchor = $("div.details_block"); // 游戏基本信息 37 | let linkbar_anchor = $("a.linkbar"); // 官网 38 | let language_anchor = $("table.game_language_options tr[class!=unsupported]"); // 支持语言 39 | let tag_anchor = $("a.app_tag"); // 标签 40 | let rate_anchor = $("div.user_reviews_summary_row"); // 游戏评价 41 | let descr_anchor = $("div#game_area_description"); // 游戏简介 42 | let sysreq_anchor = $("div.sysreq_contents > div.game_area_sys_req"); // 系统需求 43 | let screenshot_anchor = $("div.screenshot_holder a"); // 游戏截图 44 | 45 | data["cover"] = data["poster"] = cover_anchor ? cover_anchor.attr("src").replace(/^(.+?)(\?t=\d+)?$/, "$1") : ""; 46 | data["name"] = name_anchor ? name_anchor.text().trim() : ""; 47 | data["detail"] = detail_anchor ? 48 | detail_anchor.eq(0).text() 49 | .replace(/:[ \n]+/g, ": ") 50 | .split("\n") 51 | .map(x => x.trim()) 52 | .filter(x => x.length > 0) 53 | .join("\n") : ""; 54 | data["tags"] = tag_anchor ? tag_anchor.map(function () { 55 | return $(this).text().trim(); 56 | }).get() : []; 57 | data["review"] = rate_anchor ? rate_anchor.map(function () { 58 | return $(this).text().replace(":", ":").replace(/[ \n]{2,}/ig, " ").trim(); 59 | }).get() : []; 60 | if (linkbar_anchor && linkbar_anchor.text().search("访问网站")) { 61 | data["linkbar"] = linkbar_anchor.attr("href").replace(/^.+?url=(.+)$/, "$1"); 62 | } 63 | 64 | const lag_checkcol_list = ["界面", "完全音频", "字幕"]; 65 | data["language"] = language_anchor ? 66 | language_anchor 67 | .slice(1, 4) // 不要首行,不要不支持行 外的前三行 68 | .map(function () { 69 | let tag = $(this); 70 | let tag_td_list = tag.find("td"); 71 | let lag_support_checkcol = []; 72 | let lag = tag_td_list.eq(0).text().trim(); 73 | 74 | for (let i = 0; i < lag_checkcol_list.length; i++) { 75 | let j = tag_td_list.eq(i + 1); 76 | if (j.text().search("✔")) { 77 | lag_support_checkcol.push(lag_checkcol_list[i]); 78 | } 79 | } 80 | 81 | return `${lag}${lag_support_checkcol.length > 0 ? ` (${lag_support_checkcol.join(", ")})` : ""}`; 82 | }).get() : []; 83 | 84 | data["descr"] = descr_anchor ? html2bbcode(descr_anchor.html()).replace("[h2]关于这款游戏[/h2]", "").trim() : ""; 85 | data["screenshot"] = screenshot_anchor ? screenshot_anchor.map(function () { 86 | let dic = $(this); 87 | return dic.attr("href").replace(/^.+?url=(http.+?)\.[\dx]+(.+?)(\?t=\d+)?$/, "$1$2"); 88 | }).get() : []; 89 | 90 | const os_dict = { 91 | "win": "Windows", 92 | "mac": "Mac OS X", 93 | "linux": "SteamOS + Linux" 94 | }; 95 | data["sysreq"] = sysreq_anchor ? sysreq_anchor.map(function () { 96 | let tag = $(this); 97 | let os_type = os_dict[tag.attr("data-os")]; 98 | 99 | let clone_tag = tag.clone(); 100 | clone_tag.html(tag.html().replace(/
    /ig, "[br]")); 101 | 102 | let sysreq_content = clone_tag 103 | .text() 104 | .split("\n").map(x => x.trim()).filter(x => x.length > 0).join("\n\n") // 处理最低配置和最高配置之间的空白行 105 | .split("[br]").map(x => x.trim()).filter(x => x.length > 0).join("\n"); // 处理配置内的分行 106 | 107 | return `${os_type}\n${sysreq_content}`; 108 | }).get() : []; 109 | 110 | // 处理附加资源 111 | let steamcn_api_resp = await steamcn_api_req; 112 | let steamcn_api_jsonp = await steamcn_api_resp.text(); 113 | let steamcn_api_json = jsonp_parser(steamcn_api_jsonp); 114 | if (steamcn_api_json["name_cn"]) data["name_chs"] = steamcn_api_json["name_cn"]; 115 | 116 | // 生成format 117 | let descr = (data["poster"] && data["poster"].length > 0) ? `[img]${data["poster"]}[/img]\n\n` : ""; 118 | descr += "【基本信息】\n\n"; // 基本信息为原来的baseinfo块 119 | descr += (data["name_chs"] && data["name_chs"].length > 0) ? `中文名: ${data["name_chs"]}\n` : ""; 120 | descr += (data["detail"] && data["detail"].length > 0) ? `${data["detail"]}\n` : ""; 121 | descr += (data["linkbar"] && data["linkbar"].length > 0) ? `官方网站: ${data["linkbar"]}\n` : ""; 122 | descr += (data["steam_id"] && data["steam_id"].length > 0) ? `Steam页面: https://store.steampowered.com/app/${data["steam_id"]}/\n` : ""; 123 | descr += (data["language"] && data["language"].length > 0) ? `游戏语种: ${data["language"].join(" | ")}\n` : ""; 124 | descr += (data["tags"] && data["tags"].length > 0) ? `标签: ${data["tags"].join(" | ")}\n` : ""; 125 | descr += (data["review"] && data["review"].length > 0) ? `\n${data["review"].join("\n")}\n` : ""; 126 | descr += "\n"; 127 | descr += (data["descr"] && data["descr"].length > 0) ? `【游戏简介】\n\n${data["descr"]}\n\n` : ""; 128 | descr += (data["sysreq"] && data["sysreq"].length > 0) ? `【配置需求】\n\n${data["sysreq"].join("\n")}\n\n` : ""; 129 | descr += (data["screenshot"] && data["screenshot"].length > 0) ? `【游戏截图】\n\n${data["screenshot"].map(x => `[img]${x}[/img]`).join("\n")}\n\n` : ""; 130 | 131 | data["format"] = descr.trim(); 132 | data["success"] = true; // 更新状态为成功 133 | return data; 134 | } 135 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ptgen", 3 | "version": "0.0.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ptgen", 9 | "version": "0.0.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "cheerio": "^1.0.0-rc.10", 13 | "html2bbcode": "^1.2.6" 14 | }, 15 | "devDependencies": { 16 | "html-loader": "^1.3.2" 17 | } 18 | }, 19 | "node_modules/@types/eslint": { 20 | "version": "8.4.1", 21 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", 22 | "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", 23 | "dev": true, 24 | "peer": true, 25 | "dependencies": { 26 | "@types/estree": "*", 27 | "@types/json-schema": "*" 28 | } 29 | }, 30 | "node_modules/@types/eslint-scope": { 31 | "version": "3.7.3", 32 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", 33 | "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", 34 | "dev": true, 35 | "peer": true, 36 | "dependencies": { 37 | "@types/eslint": "*", 38 | "@types/estree": "*" 39 | } 40 | }, 41 | "node_modules/@types/estree": { 42 | "version": "0.0.51", 43 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", 44 | "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", 45 | "dev": true, 46 | "peer": true 47 | }, 48 | "node_modules/@types/json-schema": { 49 | "version": "7.0.11", 50 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 51 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 52 | "dev": true 53 | }, 54 | "node_modules/@types/node": { 55 | "version": "17.0.24", 56 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", 57 | "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==", 58 | "dev": true, 59 | "peer": true 60 | }, 61 | "node_modules/@webassemblyjs/ast": { 62 | "version": "1.11.1", 63 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", 64 | "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", 65 | "dev": true, 66 | "peer": true, 67 | "dependencies": { 68 | "@webassemblyjs/helper-numbers": "1.11.1", 69 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1" 70 | } 71 | }, 72 | "node_modules/@webassemblyjs/floating-point-hex-parser": { 73 | "version": "1.11.1", 74 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", 75 | "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", 76 | "dev": true, 77 | "peer": true 78 | }, 79 | "node_modules/@webassemblyjs/helper-api-error": { 80 | "version": "1.11.1", 81 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", 82 | "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", 83 | "dev": true, 84 | "peer": true 85 | }, 86 | "node_modules/@webassemblyjs/helper-buffer": { 87 | "version": "1.11.1", 88 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", 89 | "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", 90 | "dev": true, 91 | "peer": true 92 | }, 93 | "node_modules/@webassemblyjs/helper-numbers": { 94 | "version": "1.11.1", 95 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", 96 | "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", 97 | "dev": true, 98 | "peer": true, 99 | "dependencies": { 100 | "@webassemblyjs/floating-point-hex-parser": "1.11.1", 101 | "@webassemblyjs/helper-api-error": "1.11.1", 102 | "@xtuc/long": "4.2.2" 103 | } 104 | }, 105 | "node_modules/@webassemblyjs/helper-wasm-bytecode": { 106 | "version": "1.11.1", 107 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", 108 | "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", 109 | "dev": true, 110 | "peer": true 111 | }, 112 | "node_modules/@webassemblyjs/helper-wasm-section": { 113 | "version": "1.11.1", 114 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", 115 | "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", 116 | "dev": true, 117 | "peer": true, 118 | "dependencies": { 119 | "@webassemblyjs/ast": "1.11.1", 120 | "@webassemblyjs/helper-buffer": "1.11.1", 121 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 122 | "@webassemblyjs/wasm-gen": "1.11.1" 123 | } 124 | }, 125 | "node_modules/@webassemblyjs/ieee754": { 126 | "version": "1.11.1", 127 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", 128 | "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", 129 | "dev": true, 130 | "peer": true, 131 | "dependencies": { 132 | "@xtuc/ieee754": "^1.2.0" 133 | } 134 | }, 135 | "node_modules/@webassemblyjs/leb128": { 136 | "version": "1.11.1", 137 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", 138 | "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", 139 | "dev": true, 140 | "peer": true, 141 | "dependencies": { 142 | "@xtuc/long": "4.2.2" 143 | } 144 | }, 145 | "node_modules/@webassemblyjs/utf8": { 146 | "version": "1.11.1", 147 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", 148 | "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", 149 | "dev": true, 150 | "peer": true 151 | }, 152 | "node_modules/@webassemblyjs/wasm-edit": { 153 | "version": "1.11.1", 154 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", 155 | "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", 156 | "dev": true, 157 | "peer": true, 158 | "dependencies": { 159 | "@webassemblyjs/ast": "1.11.1", 160 | "@webassemblyjs/helper-buffer": "1.11.1", 161 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 162 | "@webassemblyjs/helper-wasm-section": "1.11.1", 163 | "@webassemblyjs/wasm-gen": "1.11.1", 164 | "@webassemblyjs/wasm-opt": "1.11.1", 165 | "@webassemblyjs/wasm-parser": "1.11.1", 166 | "@webassemblyjs/wast-printer": "1.11.1" 167 | } 168 | }, 169 | "node_modules/@webassemblyjs/wasm-gen": { 170 | "version": "1.11.1", 171 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", 172 | "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", 173 | "dev": true, 174 | "peer": true, 175 | "dependencies": { 176 | "@webassemblyjs/ast": "1.11.1", 177 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 178 | "@webassemblyjs/ieee754": "1.11.1", 179 | "@webassemblyjs/leb128": "1.11.1", 180 | "@webassemblyjs/utf8": "1.11.1" 181 | } 182 | }, 183 | "node_modules/@webassemblyjs/wasm-opt": { 184 | "version": "1.11.1", 185 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", 186 | "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", 187 | "dev": true, 188 | "peer": true, 189 | "dependencies": { 190 | "@webassemblyjs/ast": "1.11.1", 191 | "@webassemblyjs/helper-buffer": "1.11.1", 192 | "@webassemblyjs/wasm-gen": "1.11.1", 193 | "@webassemblyjs/wasm-parser": "1.11.1" 194 | } 195 | }, 196 | "node_modules/@webassemblyjs/wasm-parser": { 197 | "version": "1.11.1", 198 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", 199 | "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", 200 | "dev": true, 201 | "peer": true, 202 | "dependencies": { 203 | "@webassemblyjs/ast": "1.11.1", 204 | "@webassemblyjs/helper-api-error": "1.11.1", 205 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 206 | "@webassemblyjs/ieee754": "1.11.1", 207 | "@webassemblyjs/leb128": "1.11.1", 208 | "@webassemblyjs/utf8": "1.11.1" 209 | } 210 | }, 211 | "node_modules/@webassemblyjs/wast-printer": { 212 | "version": "1.11.1", 213 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", 214 | "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", 215 | "dev": true, 216 | "peer": true, 217 | "dependencies": { 218 | "@webassemblyjs/ast": "1.11.1", 219 | "@xtuc/long": "4.2.2" 220 | } 221 | }, 222 | "node_modules/@xtuc/ieee754": { 223 | "version": "1.2.0", 224 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 225 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 226 | "dev": true, 227 | "peer": true 228 | }, 229 | "node_modules/@xtuc/long": { 230 | "version": "4.2.2", 231 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 232 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 233 | "dev": true, 234 | "peer": true 235 | }, 236 | "node_modules/acorn": { 237 | "version": "8.7.0", 238 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", 239 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", 240 | "dev": true, 241 | "peer": true, 242 | "bin": { 243 | "acorn": "bin/acorn" 244 | }, 245 | "engines": { 246 | "node": ">=0.4.0" 247 | } 248 | }, 249 | "node_modules/acorn-import-assertions": { 250 | "version": "1.8.0", 251 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", 252 | "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", 253 | "dev": true, 254 | "peer": true, 255 | "peerDependencies": { 256 | "acorn": "^8" 257 | } 258 | }, 259 | "node_modules/ajv": { 260 | "version": "6.12.6", 261 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 262 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 263 | "dev": true, 264 | "dependencies": { 265 | "fast-deep-equal": "^3.1.1", 266 | "fast-json-stable-stringify": "^2.0.0", 267 | "json-schema-traverse": "^0.4.1", 268 | "uri-js": "^4.2.2" 269 | }, 270 | "funding": { 271 | "type": "github", 272 | "url": "https://github.com/sponsors/epoberezkin" 273 | } 274 | }, 275 | "node_modules/ajv-keywords": { 276 | "version": "3.5.2", 277 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 278 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 279 | "dev": true, 280 | "peerDependencies": { 281 | "ajv": "^6.9.1" 282 | } 283 | }, 284 | "node_modules/big.js": { 285 | "version": "5.2.2", 286 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 287 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", 288 | "dev": true, 289 | "engines": { 290 | "node": "*" 291 | } 292 | }, 293 | "node_modules/boolbase": { 294 | "version": "1.0.0", 295 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 296 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 297 | }, 298 | "node_modules/browserslist": { 299 | "version": "4.20.2", 300 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", 301 | "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", 302 | "dev": true, 303 | "funding": [ 304 | { 305 | "type": "opencollective", 306 | "url": "https://opencollective.com/browserslist" 307 | }, 308 | { 309 | "type": "tidelift", 310 | "url": "https://tidelift.com/funding/github/npm/browserslist" 311 | } 312 | ], 313 | "peer": true, 314 | "dependencies": { 315 | "caniuse-lite": "^1.0.30001317", 316 | "electron-to-chromium": "^1.4.84", 317 | "escalade": "^3.1.1", 318 | "node-releases": "^2.0.2", 319 | "picocolors": "^1.0.0" 320 | }, 321 | "bin": { 322 | "browserslist": "cli.js" 323 | }, 324 | "engines": { 325 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 326 | } 327 | }, 328 | "node_modules/buffer-from": { 329 | "version": "1.1.2", 330 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 331 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 332 | "dev": true 333 | }, 334 | "node_modules/camel-case": { 335 | "version": "4.1.2", 336 | "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", 337 | "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", 338 | "dev": true, 339 | "dependencies": { 340 | "pascal-case": "^3.1.2", 341 | "tslib": "^2.0.3" 342 | } 343 | }, 344 | "node_modules/caniuse-lite": { 345 | "version": "1.0.30001332", 346 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", 347 | "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", 348 | "dev": true, 349 | "funding": [ 350 | { 351 | "type": "opencollective", 352 | "url": "https://opencollective.com/browserslist" 353 | }, 354 | { 355 | "type": "tidelift", 356 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 357 | } 358 | ], 359 | "peer": true 360 | }, 361 | "node_modules/cheerio": { 362 | "version": "1.0.0-rc.10", 363 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", 364 | "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", 365 | "dependencies": { 366 | "cheerio-select": "^1.5.0", 367 | "dom-serializer": "^1.3.2", 368 | "domhandler": "^4.2.0", 369 | "htmlparser2": "^6.1.0", 370 | "parse5": "^6.0.1", 371 | "parse5-htmlparser2-tree-adapter": "^6.0.1", 372 | "tslib": "^2.2.0" 373 | }, 374 | "engines": { 375 | "node": ">= 6" 376 | }, 377 | "funding": { 378 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 379 | } 380 | }, 381 | "node_modules/cheerio-select": { 382 | "version": "1.6.0", 383 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", 384 | "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", 385 | "dependencies": { 386 | "css-select": "^4.3.0", 387 | "css-what": "^6.0.1", 388 | "domelementtype": "^2.2.0", 389 | "domhandler": "^4.3.1", 390 | "domutils": "^2.8.0" 391 | }, 392 | "funding": { 393 | "url": "https://github.com/sponsors/fb55" 394 | } 395 | }, 396 | "node_modules/chrome-trace-event": { 397 | "version": "1.0.3", 398 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", 399 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", 400 | "dev": true, 401 | "peer": true, 402 | "engines": { 403 | "node": ">=6.0" 404 | } 405 | }, 406 | "node_modules/clean-css": { 407 | "version": "4.2.4", 408 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", 409 | "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", 410 | "dev": true, 411 | "dependencies": { 412 | "source-map": "~0.6.0" 413 | }, 414 | "engines": { 415 | "node": ">= 4.0" 416 | } 417 | }, 418 | "node_modules/commander": { 419 | "version": "4.1.1", 420 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 421 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 422 | "dev": true, 423 | "engines": { 424 | "node": ">= 6" 425 | } 426 | }, 427 | "node_modules/css-select": { 428 | "version": "4.3.0", 429 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", 430 | "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", 431 | "dependencies": { 432 | "boolbase": "^1.0.0", 433 | "css-what": "^6.0.1", 434 | "domhandler": "^4.3.1", 435 | "domutils": "^2.8.0", 436 | "nth-check": "^2.0.1" 437 | }, 438 | "funding": { 439 | "url": "https://github.com/sponsors/fb55" 440 | } 441 | }, 442 | "node_modules/css-what": { 443 | "version": "6.1.0", 444 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 445 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 446 | "engines": { 447 | "node": ">= 6" 448 | }, 449 | "funding": { 450 | "url": "https://github.com/sponsors/fb55" 451 | } 452 | }, 453 | "node_modules/dom-serializer": { 454 | "version": "1.4.1", 455 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 456 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 457 | "dependencies": { 458 | "domelementtype": "^2.0.1", 459 | "domhandler": "^4.2.0", 460 | "entities": "^2.0.0" 461 | }, 462 | "funding": { 463 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 464 | } 465 | }, 466 | "node_modules/domelementtype": { 467 | "version": "2.3.0", 468 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 469 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 470 | "funding": [ 471 | { 472 | "type": "github", 473 | "url": "https://github.com/sponsors/fb55" 474 | } 475 | ] 476 | }, 477 | "node_modules/domhandler": { 478 | "version": "4.3.1", 479 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 480 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 481 | "dependencies": { 482 | "domelementtype": "^2.2.0" 483 | }, 484 | "engines": { 485 | "node": ">= 4" 486 | }, 487 | "funding": { 488 | "url": "https://github.com/fb55/domhandler?sponsor=1" 489 | } 490 | }, 491 | "node_modules/domutils": { 492 | "version": "2.8.0", 493 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 494 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 495 | "dependencies": { 496 | "dom-serializer": "^1.0.1", 497 | "domelementtype": "^2.2.0", 498 | "domhandler": "^4.2.0" 499 | }, 500 | "funding": { 501 | "url": "https://github.com/fb55/domutils?sponsor=1" 502 | } 503 | }, 504 | "node_modules/dot-case": { 505 | "version": "3.0.4", 506 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 507 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 508 | "dev": true, 509 | "dependencies": { 510 | "no-case": "^3.0.4", 511 | "tslib": "^2.0.3" 512 | } 513 | }, 514 | "node_modules/electron-to-chromium": { 515 | "version": "1.4.111", 516 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.111.tgz", 517 | "integrity": "sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw==", 518 | "dev": true, 519 | "peer": true 520 | }, 521 | "node_modules/emojis-list": { 522 | "version": "3.0.0", 523 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 524 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", 525 | "dev": true, 526 | "engines": { 527 | "node": ">= 4" 528 | } 529 | }, 530 | "node_modules/enhanced-resolve": { 531 | "version": "5.9.3", 532 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", 533 | "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", 534 | "dev": true, 535 | "peer": true, 536 | "dependencies": { 537 | "graceful-fs": "^4.2.4", 538 | "tapable": "^2.2.0" 539 | }, 540 | "engines": { 541 | "node": ">=10.13.0" 542 | } 543 | }, 544 | "node_modules/entities": { 545 | "version": "2.2.0", 546 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 547 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 548 | "funding": { 549 | "url": "https://github.com/fb55/entities?sponsor=1" 550 | } 551 | }, 552 | "node_modules/es-module-lexer": { 553 | "version": "0.9.3", 554 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", 555 | "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", 556 | "dev": true, 557 | "peer": true 558 | }, 559 | "node_modules/escalade": { 560 | "version": "3.1.1", 561 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 562 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 563 | "dev": true, 564 | "peer": true, 565 | "engines": { 566 | "node": ">=6" 567 | } 568 | }, 569 | "node_modules/eslint-scope": { 570 | "version": "5.1.1", 571 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 572 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 573 | "dev": true, 574 | "peer": true, 575 | "dependencies": { 576 | "esrecurse": "^4.3.0", 577 | "estraverse": "^4.1.1" 578 | }, 579 | "engines": { 580 | "node": ">=8.0.0" 581 | } 582 | }, 583 | "node_modules/esrecurse": { 584 | "version": "4.3.0", 585 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 586 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 587 | "dev": true, 588 | "peer": true, 589 | "dependencies": { 590 | "estraverse": "^5.2.0" 591 | }, 592 | "engines": { 593 | "node": ">=4.0" 594 | } 595 | }, 596 | "node_modules/esrecurse/node_modules/estraverse": { 597 | "version": "5.3.0", 598 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 599 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 600 | "dev": true, 601 | "peer": true, 602 | "engines": { 603 | "node": ">=4.0" 604 | } 605 | }, 606 | "node_modules/estraverse": { 607 | "version": "4.3.0", 608 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 609 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 610 | "dev": true, 611 | "peer": true, 612 | "engines": { 613 | "node": ">=4.0" 614 | } 615 | }, 616 | "node_modules/events": { 617 | "version": "3.3.0", 618 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 619 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 620 | "dev": true, 621 | "peer": true, 622 | "engines": { 623 | "node": ">=0.8.x" 624 | } 625 | }, 626 | "node_modules/fast-deep-equal": { 627 | "version": "3.1.3", 628 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 629 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 630 | "dev": true 631 | }, 632 | "node_modules/fast-json-stable-stringify": { 633 | "version": "2.1.0", 634 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 635 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 636 | "dev": true 637 | }, 638 | "node_modules/glob-to-regexp": { 639 | "version": "0.4.1", 640 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 641 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 642 | "dev": true, 643 | "peer": true 644 | }, 645 | "node_modules/graceful-fs": { 646 | "version": "4.2.10", 647 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 648 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 649 | "dev": true, 650 | "peer": true 651 | }, 652 | "node_modules/has-flag": { 653 | "version": "4.0.0", 654 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 655 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 656 | "dev": true, 657 | "peer": true, 658 | "engines": { 659 | "node": ">=8" 660 | } 661 | }, 662 | "node_modules/he": { 663 | "version": "1.2.0", 664 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 665 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 666 | "dev": true, 667 | "bin": { 668 | "he": "bin/he" 669 | } 670 | }, 671 | "node_modules/html-loader": { 672 | "version": "1.3.2", 673 | "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", 674 | "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", 675 | "dev": true, 676 | "dependencies": { 677 | "html-minifier-terser": "^5.1.1", 678 | "htmlparser2": "^4.1.0", 679 | "loader-utils": "^2.0.0", 680 | "schema-utils": "^3.0.0" 681 | }, 682 | "engines": { 683 | "node": ">= 10.13.0" 684 | }, 685 | "funding": { 686 | "type": "opencollective", 687 | "url": "https://opencollective.com/webpack" 688 | }, 689 | "peerDependencies": { 690 | "webpack": "^4.0.0 || ^5.0.0" 691 | } 692 | }, 693 | "node_modules/html-loader/node_modules/domhandler": { 694 | "version": "3.3.0", 695 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", 696 | "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", 697 | "dev": true, 698 | "dependencies": { 699 | "domelementtype": "^2.0.1" 700 | }, 701 | "engines": { 702 | "node": ">= 4" 703 | }, 704 | "funding": { 705 | "url": "https://github.com/fb55/domhandler?sponsor=1" 706 | } 707 | }, 708 | "node_modules/html-loader/node_modules/htmlparser2": { 709 | "version": "4.1.0", 710 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", 711 | "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", 712 | "dev": true, 713 | "dependencies": { 714 | "domelementtype": "^2.0.1", 715 | "domhandler": "^3.0.0", 716 | "domutils": "^2.0.0", 717 | "entities": "^2.0.0" 718 | } 719 | }, 720 | "node_modules/html-minifier-terser": { 721 | "version": "5.1.1", 722 | "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", 723 | "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", 724 | "dev": true, 725 | "dependencies": { 726 | "camel-case": "^4.1.1", 727 | "clean-css": "^4.2.3", 728 | "commander": "^4.1.1", 729 | "he": "^1.2.0", 730 | "param-case": "^3.0.3", 731 | "relateurl": "^0.2.7", 732 | "terser": "^4.6.3" 733 | }, 734 | "bin": { 735 | "html-minifier-terser": "cli.js" 736 | }, 737 | "engines": { 738 | "node": ">=6" 739 | } 740 | }, 741 | "node_modules/html-minifier-terser/node_modules/terser": { 742 | "version": "4.8.0", 743 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", 744 | "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", 745 | "dev": true, 746 | "dependencies": { 747 | "commander": "^2.20.0", 748 | "source-map": "~0.6.1", 749 | "source-map-support": "~0.5.12" 750 | }, 751 | "bin": { 752 | "terser": "bin/terser" 753 | }, 754 | "engines": { 755 | "node": ">=6.0.0" 756 | } 757 | }, 758 | "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { 759 | "version": "2.20.3", 760 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 761 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 762 | "dev": true 763 | }, 764 | "node_modules/html2bbcode": { 765 | "version": "1.2.6", 766 | "resolved": "https://registry.npm.taobao.org/html2bbcode/download/html2bbcode-1.2.6.tgz", 767 | "integrity": "sha1-ApKhPvtNhEdWD925KTmL/wHWA9k=", 768 | "bin": { 769 | "html2bbcode": "convert.js" 770 | }, 771 | "engines": { 772 | "node": ">= 0.10" 773 | } 774 | }, 775 | "node_modules/htmlparser2": { 776 | "version": "6.1.0", 777 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", 778 | "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", 779 | "funding": [ 780 | "https://github.com/fb55/htmlparser2?sponsor=1", 781 | { 782 | "type": "github", 783 | "url": "https://github.com/sponsors/fb55" 784 | } 785 | ], 786 | "dependencies": { 787 | "domelementtype": "^2.0.1", 788 | "domhandler": "^4.0.0", 789 | "domutils": "^2.5.2", 790 | "entities": "^2.0.0" 791 | } 792 | }, 793 | "node_modules/jest-worker": { 794 | "version": "27.5.1", 795 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 796 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 797 | "dev": true, 798 | "peer": true, 799 | "dependencies": { 800 | "@types/node": "*", 801 | "merge-stream": "^2.0.0", 802 | "supports-color": "^8.0.0" 803 | }, 804 | "engines": { 805 | "node": ">= 10.13.0" 806 | } 807 | }, 808 | "node_modules/json-parse-better-errors": { 809 | "version": "1.0.2", 810 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 811 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 812 | "dev": true, 813 | "peer": true 814 | }, 815 | "node_modules/json-schema-traverse": { 816 | "version": "0.4.1", 817 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 818 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 819 | "dev": true 820 | }, 821 | "node_modules/json5": { 822 | "version": "2.2.1", 823 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 824 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 825 | "dev": true, 826 | "bin": { 827 | "json5": "lib/cli.js" 828 | }, 829 | "engines": { 830 | "node": ">=6" 831 | } 832 | }, 833 | "node_modules/loader-runner": { 834 | "version": "4.3.0", 835 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 836 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 837 | "dev": true, 838 | "peer": true, 839 | "engines": { 840 | "node": ">=6.11.5" 841 | } 842 | }, 843 | "node_modules/loader-utils": { 844 | "version": "2.0.2", 845 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", 846 | "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", 847 | "dev": true, 848 | "dependencies": { 849 | "big.js": "^5.2.2", 850 | "emojis-list": "^3.0.0", 851 | "json5": "^2.1.2" 852 | }, 853 | "engines": { 854 | "node": ">=8.9.0" 855 | } 856 | }, 857 | "node_modules/lower-case": { 858 | "version": "2.0.2", 859 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 860 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 861 | "dev": true, 862 | "dependencies": { 863 | "tslib": "^2.0.3" 864 | } 865 | }, 866 | "node_modules/merge-stream": { 867 | "version": "2.0.0", 868 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 869 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 870 | "dev": true, 871 | "peer": true 872 | }, 873 | "node_modules/mime-db": { 874 | "version": "1.52.0", 875 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 876 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 877 | "dev": true, 878 | "peer": true, 879 | "engines": { 880 | "node": ">= 0.6" 881 | } 882 | }, 883 | "node_modules/mime-types": { 884 | "version": "2.1.35", 885 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 886 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 887 | "dev": true, 888 | "peer": true, 889 | "dependencies": { 890 | "mime-db": "1.52.0" 891 | }, 892 | "engines": { 893 | "node": ">= 0.6" 894 | } 895 | }, 896 | "node_modules/neo-async": { 897 | "version": "2.6.2", 898 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 899 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 900 | "dev": true, 901 | "peer": true 902 | }, 903 | "node_modules/no-case": { 904 | "version": "3.0.4", 905 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 906 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 907 | "dev": true, 908 | "dependencies": { 909 | "lower-case": "^2.0.2", 910 | "tslib": "^2.0.3" 911 | } 912 | }, 913 | "node_modules/node-releases": { 914 | "version": "2.0.3", 915 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", 916 | "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", 917 | "dev": true, 918 | "peer": true 919 | }, 920 | "node_modules/nth-check": { 921 | "version": "2.0.1", 922 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", 923 | "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", 924 | "dependencies": { 925 | "boolbase": "^1.0.0" 926 | }, 927 | "funding": { 928 | "url": "https://github.com/fb55/nth-check?sponsor=1" 929 | } 930 | }, 931 | "node_modules/param-case": { 932 | "version": "3.0.4", 933 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", 934 | "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", 935 | "dev": true, 936 | "dependencies": { 937 | "dot-case": "^3.0.4", 938 | "tslib": "^2.0.3" 939 | } 940 | }, 941 | "node_modules/parse5": { 942 | "version": "6.0.1", 943 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 944 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" 945 | }, 946 | "node_modules/parse5-htmlparser2-tree-adapter": { 947 | "version": "6.0.1", 948 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", 949 | "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", 950 | "dependencies": { 951 | "parse5": "^6.0.1" 952 | } 953 | }, 954 | "node_modules/pascal-case": { 955 | "version": "3.1.2", 956 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 957 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 958 | "dev": true, 959 | "dependencies": { 960 | "no-case": "^3.0.4", 961 | "tslib": "^2.0.3" 962 | } 963 | }, 964 | "node_modules/picocolors": { 965 | "version": "1.0.0", 966 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 967 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 968 | "dev": true, 969 | "peer": true 970 | }, 971 | "node_modules/punycode": { 972 | "version": "2.1.1", 973 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 974 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 975 | "dev": true, 976 | "engines": { 977 | "node": ">=6" 978 | } 979 | }, 980 | "node_modules/randombytes": { 981 | "version": "2.1.0", 982 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 983 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 984 | "dev": true, 985 | "peer": true, 986 | "dependencies": { 987 | "safe-buffer": "^5.1.0" 988 | } 989 | }, 990 | "node_modules/relateurl": { 991 | "version": "0.2.7", 992 | "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", 993 | "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", 994 | "dev": true, 995 | "engines": { 996 | "node": ">= 0.10" 997 | } 998 | }, 999 | "node_modules/safe-buffer": { 1000 | "version": "5.2.1", 1001 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1002 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1003 | "dev": true, 1004 | "funding": [ 1005 | { 1006 | "type": "github", 1007 | "url": "https://github.com/sponsors/feross" 1008 | }, 1009 | { 1010 | "type": "patreon", 1011 | "url": "https://www.patreon.com/feross" 1012 | }, 1013 | { 1014 | "type": "consulting", 1015 | "url": "https://feross.org/support" 1016 | } 1017 | ], 1018 | "peer": true 1019 | }, 1020 | "node_modules/schema-utils": { 1021 | "version": "3.1.1", 1022 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", 1023 | "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", 1024 | "dev": true, 1025 | "dependencies": { 1026 | "@types/json-schema": "^7.0.8", 1027 | "ajv": "^6.12.5", 1028 | "ajv-keywords": "^3.5.2" 1029 | }, 1030 | "engines": { 1031 | "node": ">= 10.13.0" 1032 | }, 1033 | "funding": { 1034 | "type": "opencollective", 1035 | "url": "https://opencollective.com/webpack" 1036 | } 1037 | }, 1038 | "node_modules/serialize-javascript": { 1039 | "version": "6.0.0", 1040 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1041 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1042 | "dev": true, 1043 | "peer": true, 1044 | "dependencies": { 1045 | "randombytes": "^2.1.0" 1046 | } 1047 | }, 1048 | "node_modules/source-map": { 1049 | "version": "0.6.1", 1050 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1051 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1052 | "dev": true, 1053 | "engines": { 1054 | "node": ">=0.10.0" 1055 | } 1056 | }, 1057 | "node_modules/source-map-support": { 1058 | "version": "0.5.21", 1059 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1060 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1061 | "dev": true, 1062 | "dependencies": { 1063 | "buffer-from": "^1.0.0", 1064 | "source-map": "^0.6.0" 1065 | } 1066 | }, 1067 | "node_modules/supports-color": { 1068 | "version": "8.1.1", 1069 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1070 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1071 | "dev": true, 1072 | "peer": true, 1073 | "dependencies": { 1074 | "has-flag": "^4.0.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">=10" 1078 | }, 1079 | "funding": { 1080 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1081 | } 1082 | }, 1083 | "node_modules/tapable": { 1084 | "version": "2.2.1", 1085 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 1086 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 1087 | "dev": true, 1088 | "peer": true, 1089 | "engines": { 1090 | "node": ">=6" 1091 | } 1092 | }, 1093 | "node_modules/terser": { 1094 | "version": "5.12.1", 1095 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", 1096 | "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", 1097 | "dev": true, 1098 | "peer": true, 1099 | "dependencies": { 1100 | "acorn": "^8.5.0", 1101 | "commander": "^2.20.0", 1102 | "source-map": "~0.7.2", 1103 | "source-map-support": "~0.5.20" 1104 | }, 1105 | "bin": { 1106 | "terser": "bin/terser" 1107 | }, 1108 | "engines": { 1109 | "node": ">=10" 1110 | } 1111 | }, 1112 | "node_modules/terser-webpack-plugin": { 1113 | "version": "5.3.1", 1114 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", 1115 | "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", 1116 | "dev": true, 1117 | "peer": true, 1118 | "dependencies": { 1119 | "jest-worker": "^27.4.5", 1120 | "schema-utils": "^3.1.1", 1121 | "serialize-javascript": "^6.0.0", 1122 | "source-map": "^0.6.1", 1123 | "terser": "^5.7.2" 1124 | }, 1125 | "engines": { 1126 | "node": ">= 10.13.0" 1127 | }, 1128 | "funding": { 1129 | "type": "opencollective", 1130 | "url": "https://opencollective.com/webpack" 1131 | }, 1132 | "peerDependencies": { 1133 | "webpack": "^5.1.0" 1134 | }, 1135 | "peerDependenciesMeta": { 1136 | "@swc/core": { 1137 | "optional": true 1138 | }, 1139 | "esbuild": { 1140 | "optional": true 1141 | }, 1142 | "uglify-js": { 1143 | "optional": true 1144 | } 1145 | } 1146 | }, 1147 | "node_modules/terser/node_modules/commander": { 1148 | "version": "2.20.3", 1149 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1150 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1151 | "dev": true, 1152 | "peer": true 1153 | }, 1154 | "node_modules/terser/node_modules/source-map": { 1155 | "version": "0.7.3", 1156 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 1157 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 1158 | "dev": true, 1159 | "peer": true, 1160 | "engines": { 1161 | "node": ">= 8" 1162 | } 1163 | }, 1164 | "node_modules/tslib": { 1165 | "version": "2.3.1", 1166 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1167 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1168 | }, 1169 | "node_modules/uri-js": { 1170 | "version": "4.4.1", 1171 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1172 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1173 | "dev": true, 1174 | "dependencies": { 1175 | "punycode": "^2.1.0" 1176 | } 1177 | }, 1178 | "node_modules/watchpack": { 1179 | "version": "2.3.1", 1180 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", 1181 | "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", 1182 | "dev": true, 1183 | "peer": true, 1184 | "dependencies": { 1185 | "glob-to-regexp": "^0.4.1", 1186 | "graceful-fs": "^4.1.2" 1187 | }, 1188 | "engines": { 1189 | "node": ">=10.13.0" 1190 | } 1191 | }, 1192 | "node_modules/webpack": { 1193 | "version": "5.72.0", 1194 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", 1195 | "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", 1196 | "dev": true, 1197 | "peer": true, 1198 | "dependencies": { 1199 | "@types/eslint-scope": "^3.7.3", 1200 | "@types/estree": "^0.0.51", 1201 | "@webassemblyjs/ast": "1.11.1", 1202 | "@webassemblyjs/wasm-edit": "1.11.1", 1203 | "@webassemblyjs/wasm-parser": "1.11.1", 1204 | "acorn": "^8.4.1", 1205 | "acorn-import-assertions": "^1.7.6", 1206 | "browserslist": "^4.14.5", 1207 | "chrome-trace-event": "^1.0.2", 1208 | "enhanced-resolve": "^5.9.2", 1209 | "es-module-lexer": "^0.9.0", 1210 | "eslint-scope": "5.1.1", 1211 | "events": "^3.2.0", 1212 | "glob-to-regexp": "^0.4.1", 1213 | "graceful-fs": "^4.2.9", 1214 | "json-parse-better-errors": "^1.0.2", 1215 | "loader-runner": "^4.2.0", 1216 | "mime-types": "^2.1.27", 1217 | "neo-async": "^2.6.2", 1218 | "schema-utils": "^3.1.0", 1219 | "tapable": "^2.1.1", 1220 | "terser-webpack-plugin": "^5.1.3", 1221 | "watchpack": "^2.3.1", 1222 | "webpack-sources": "^3.2.3" 1223 | }, 1224 | "bin": { 1225 | "webpack": "bin/webpack.js" 1226 | }, 1227 | "engines": { 1228 | "node": ">=10.13.0" 1229 | }, 1230 | "funding": { 1231 | "type": "opencollective", 1232 | "url": "https://opencollective.com/webpack" 1233 | }, 1234 | "peerDependenciesMeta": { 1235 | "webpack-cli": { 1236 | "optional": true 1237 | } 1238 | } 1239 | }, 1240 | "node_modules/webpack-sources": { 1241 | "version": "3.2.3", 1242 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 1243 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 1244 | "dev": true, 1245 | "peer": true, 1246 | "engines": { 1247 | "node": ">=10.13.0" 1248 | } 1249 | } 1250 | }, 1251 | "dependencies": { 1252 | "@types/eslint": { 1253 | "version": "8.4.1", 1254 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", 1255 | "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", 1256 | "dev": true, 1257 | "peer": true, 1258 | "requires": { 1259 | "@types/estree": "*", 1260 | "@types/json-schema": "*" 1261 | } 1262 | }, 1263 | "@types/eslint-scope": { 1264 | "version": "3.7.3", 1265 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", 1266 | "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", 1267 | "dev": true, 1268 | "peer": true, 1269 | "requires": { 1270 | "@types/eslint": "*", 1271 | "@types/estree": "*" 1272 | } 1273 | }, 1274 | "@types/estree": { 1275 | "version": "0.0.51", 1276 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", 1277 | "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", 1278 | "dev": true, 1279 | "peer": true 1280 | }, 1281 | "@types/json-schema": { 1282 | "version": "7.0.11", 1283 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 1284 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 1285 | "dev": true 1286 | }, 1287 | "@types/node": { 1288 | "version": "17.0.24", 1289 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", 1290 | "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==", 1291 | "dev": true, 1292 | "peer": true 1293 | }, 1294 | "@webassemblyjs/ast": { 1295 | "version": "1.11.1", 1296 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", 1297 | "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", 1298 | "dev": true, 1299 | "peer": true, 1300 | "requires": { 1301 | "@webassemblyjs/helper-numbers": "1.11.1", 1302 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1" 1303 | } 1304 | }, 1305 | "@webassemblyjs/floating-point-hex-parser": { 1306 | "version": "1.11.1", 1307 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", 1308 | "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", 1309 | "dev": true, 1310 | "peer": true 1311 | }, 1312 | "@webassemblyjs/helper-api-error": { 1313 | "version": "1.11.1", 1314 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", 1315 | "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", 1316 | "dev": true, 1317 | "peer": true 1318 | }, 1319 | "@webassemblyjs/helper-buffer": { 1320 | "version": "1.11.1", 1321 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", 1322 | "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", 1323 | "dev": true, 1324 | "peer": true 1325 | }, 1326 | "@webassemblyjs/helper-numbers": { 1327 | "version": "1.11.1", 1328 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", 1329 | "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", 1330 | "dev": true, 1331 | "peer": true, 1332 | "requires": { 1333 | "@webassemblyjs/floating-point-hex-parser": "1.11.1", 1334 | "@webassemblyjs/helper-api-error": "1.11.1", 1335 | "@xtuc/long": "4.2.2" 1336 | } 1337 | }, 1338 | "@webassemblyjs/helper-wasm-bytecode": { 1339 | "version": "1.11.1", 1340 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", 1341 | "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", 1342 | "dev": true, 1343 | "peer": true 1344 | }, 1345 | "@webassemblyjs/helper-wasm-section": { 1346 | "version": "1.11.1", 1347 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", 1348 | "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", 1349 | "dev": true, 1350 | "peer": true, 1351 | "requires": { 1352 | "@webassemblyjs/ast": "1.11.1", 1353 | "@webassemblyjs/helper-buffer": "1.11.1", 1354 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1355 | "@webassemblyjs/wasm-gen": "1.11.1" 1356 | } 1357 | }, 1358 | "@webassemblyjs/ieee754": { 1359 | "version": "1.11.1", 1360 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", 1361 | "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", 1362 | "dev": true, 1363 | "peer": true, 1364 | "requires": { 1365 | "@xtuc/ieee754": "^1.2.0" 1366 | } 1367 | }, 1368 | "@webassemblyjs/leb128": { 1369 | "version": "1.11.1", 1370 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", 1371 | "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", 1372 | "dev": true, 1373 | "peer": true, 1374 | "requires": { 1375 | "@xtuc/long": "4.2.2" 1376 | } 1377 | }, 1378 | "@webassemblyjs/utf8": { 1379 | "version": "1.11.1", 1380 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", 1381 | "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", 1382 | "dev": true, 1383 | "peer": true 1384 | }, 1385 | "@webassemblyjs/wasm-edit": { 1386 | "version": "1.11.1", 1387 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", 1388 | "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", 1389 | "dev": true, 1390 | "peer": true, 1391 | "requires": { 1392 | "@webassemblyjs/ast": "1.11.1", 1393 | "@webassemblyjs/helper-buffer": "1.11.1", 1394 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1395 | "@webassemblyjs/helper-wasm-section": "1.11.1", 1396 | "@webassemblyjs/wasm-gen": "1.11.1", 1397 | "@webassemblyjs/wasm-opt": "1.11.1", 1398 | "@webassemblyjs/wasm-parser": "1.11.1", 1399 | "@webassemblyjs/wast-printer": "1.11.1" 1400 | } 1401 | }, 1402 | "@webassemblyjs/wasm-gen": { 1403 | "version": "1.11.1", 1404 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", 1405 | "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", 1406 | "dev": true, 1407 | "peer": true, 1408 | "requires": { 1409 | "@webassemblyjs/ast": "1.11.1", 1410 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1411 | "@webassemblyjs/ieee754": "1.11.1", 1412 | "@webassemblyjs/leb128": "1.11.1", 1413 | "@webassemblyjs/utf8": "1.11.1" 1414 | } 1415 | }, 1416 | "@webassemblyjs/wasm-opt": { 1417 | "version": "1.11.1", 1418 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", 1419 | "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", 1420 | "dev": true, 1421 | "peer": true, 1422 | "requires": { 1423 | "@webassemblyjs/ast": "1.11.1", 1424 | "@webassemblyjs/helper-buffer": "1.11.1", 1425 | "@webassemblyjs/wasm-gen": "1.11.1", 1426 | "@webassemblyjs/wasm-parser": "1.11.1" 1427 | } 1428 | }, 1429 | "@webassemblyjs/wasm-parser": { 1430 | "version": "1.11.1", 1431 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", 1432 | "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", 1433 | "dev": true, 1434 | "peer": true, 1435 | "requires": { 1436 | "@webassemblyjs/ast": "1.11.1", 1437 | "@webassemblyjs/helper-api-error": "1.11.1", 1438 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1439 | "@webassemblyjs/ieee754": "1.11.1", 1440 | "@webassemblyjs/leb128": "1.11.1", 1441 | "@webassemblyjs/utf8": "1.11.1" 1442 | } 1443 | }, 1444 | "@webassemblyjs/wast-printer": { 1445 | "version": "1.11.1", 1446 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", 1447 | "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", 1448 | "dev": true, 1449 | "peer": true, 1450 | "requires": { 1451 | "@webassemblyjs/ast": "1.11.1", 1452 | "@xtuc/long": "4.2.2" 1453 | } 1454 | }, 1455 | "@xtuc/ieee754": { 1456 | "version": "1.2.0", 1457 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 1458 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 1459 | "dev": true, 1460 | "peer": true 1461 | }, 1462 | "@xtuc/long": { 1463 | "version": "4.2.2", 1464 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 1465 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 1466 | "dev": true, 1467 | "peer": true 1468 | }, 1469 | "acorn": { 1470 | "version": "8.7.0", 1471 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", 1472 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", 1473 | "dev": true, 1474 | "peer": true 1475 | }, 1476 | "acorn-import-assertions": { 1477 | "version": "1.8.0", 1478 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", 1479 | "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", 1480 | "dev": true, 1481 | "peer": true, 1482 | "requires": {} 1483 | }, 1484 | "ajv": { 1485 | "version": "6.12.6", 1486 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1487 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1488 | "dev": true, 1489 | "requires": { 1490 | "fast-deep-equal": "^3.1.1", 1491 | "fast-json-stable-stringify": "^2.0.0", 1492 | "json-schema-traverse": "^0.4.1", 1493 | "uri-js": "^4.2.2" 1494 | } 1495 | }, 1496 | "ajv-keywords": { 1497 | "version": "3.5.2", 1498 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 1499 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 1500 | "dev": true, 1501 | "requires": {} 1502 | }, 1503 | "big.js": { 1504 | "version": "5.2.2", 1505 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 1506 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", 1507 | "dev": true 1508 | }, 1509 | "boolbase": { 1510 | "version": "1.0.0", 1511 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 1512 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 1513 | }, 1514 | "browserslist": { 1515 | "version": "4.20.2", 1516 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", 1517 | "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", 1518 | "dev": true, 1519 | "peer": true, 1520 | "requires": { 1521 | "caniuse-lite": "^1.0.30001317", 1522 | "electron-to-chromium": "^1.4.84", 1523 | "escalade": "^3.1.1", 1524 | "node-releases": "^2.0.2", 1525 | "picocolors": "^1.0.0" 1526 | } 1527 | }, 1528 | "buffer-from": { 1529 | "version": "1.1.2", 1530 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1531 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1532 | "dev": true 1533 | }, 1534 | "camel-case": { 1535 | "version": "4.1.2", 1536 | "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", 1537 | "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", 1538 | "dev": true, 1539 | "requires": { 1540 | "pascal-case": "^3.1.2", 1541 | "tslib": "^2.0.3" 1542 | } 1543 | }, 1544 | "caniuse-lite": { 1545 | "version": "1.0.30001332", 1546 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", 1547 | "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", 1548 | "dev": true, 1549 | "peer": true 1550 | }, 1551 | "cheerio": { 1552 | "version": "1.0.0-rc.10", 1553 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", 1554 | "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", 1555 | "requires": { 1556 | "cheerio-select": "^1.5.0", 1557 | "dom-serializer": "^1.3.2", 1558 | "domhandler": "^4.2.0", 1559 | "htmlparser2": "^6.1.0", 1560 | "parse5": "^6.0.1", 1561 | "parse5-htmlparser2-tree-adapter": "^6.0.1", 1562 | "tslib": "^2.2.0" 1563 | } 1564 | }, 1565 | "cheerio-select": { 1566 | "version": "1.6.0", 1567 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", 1568 | "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", 1569 | "requires": { 1570 | "css-select": "^4.3.0", 1571 | "css-what": "^6.0.1", 1572 | "domelementtype": "^2.2.0", 1573 | "domhandler": "^4.3.1", 1574 | "domutils": "^2.8.0" 1575 | } 1576 | }, 1577 | "chrome-trace-event": { 1578 | "version": "1.0.3", 1579 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", 1580 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", 1581 | "dev": true, 1582 | "peer": true 1583 | }, 1584 | "clean-css": { 1585 | "version": "4.2.4", 1586 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", 1587 | "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", 1588 | "dev": true, 1589 | "requires": { 1590 | "source-map": "~0.6.0" 1591 | } 1592 | }, 1593 | "commander": { 1594 | "version": "4.1.1", 1595 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1596 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1597 | "dev": true 1598 | }, 1599 | "css-select": { 1600 | "version": "4.3.0", 1601 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", 1602 | "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", 1603 | "requires": { 1604 | "boolbase": "^1.0.0", 1605 | "css-what": "^6.0.1", 1606 | "domhandler": "^4.3.1", 1607 | "domutils": "^2.8.0", 1608 | "nth-check": "^2.0.1" 1609 | } 1610 | }, 1611 | "css-what": { 1612 | "version": "6.1.0", 1613 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 1614 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" 1615 | }, 1616 | "dom-serializer": { 1617 | "version": "1.4.1", 1618 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 1619 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 1620 | "requires": { 1621 | "domelementtype": "^2.0.1", 1622 | "domhandler": "^4.2.0", 1623 | "entities": "^2.0.0" 1624 | } 1625 | }, 1626 | "domelementtype": { 1627 | "version": "2.3.0", 1628 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 1629 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" 1630 | }, 1631 | "domhandler": { 1632 | "version": "4.3.1", 1633 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 1634 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 1635 | "requires": { 1636 | "domelementtype": "^2.2.0" 1637 | } 1638 | }, 1639 | "domutils": { 1640 | "version": "2.8.0", 1641 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 1642 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 1643 | "requires": { 1644 | "dom-serializer": "^1.0.1", 1645 | "domelementtype": "^2.2.0", 1646 | "domhandler": "^4.2.0" 1647 | } 1648 | }, 1649 | "dot-case": { 1650 | "version": "3.0.4", 1651 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 1652 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 1653 | "dev": true, 1654 | "requires": { 1655 | "no-case": "^3.0.4", 1656 | "tslib": "^2.0.3" 1657 | } 1658 | }, 1659 | "electron-to-chromium": { 1660 | "version": "1.4.111", 1661 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.111.tgz", 1662 | "integrity": "sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw==", 1663 | "dev": true, 1664 | "peer": true 1665 | }, 1666 | "emojis-list": { 1667 | "version": "3.0.0", 1668 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 1669 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", 1670 | "dev": true 1671 | }, 1672 | "enhanced-resolve": { 1673 | "version": "5.9.3", 1674 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", 1675 | "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", 1676 | "dev": true, 1677 | "peer": true, 1678 | "requires": { 1679 | "graceful-fs": "^4.2.4", 1680 | "tapable": "^2.2.0" 1681 | } 1682 | }, 1683 | "entities": { 1684 | "version": "2.2.0", 1685 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 1686 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" 1687 | }, 1688 | "es-module-lexer": { 1689 | "version": "0.9.3", 1690 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", 1691 | "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", 1692 | "dev": true, 1693 | "peer": true 1694 | }, 1695 | "escalade": { 1696 | "version": "3.1.1", 1697 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1698 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1699 | "dev": true, 1700 | "peer": true 1701 | }, 1702 | "eslint-scope": { 1703 | "version": "5.1.1", 1704 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1705 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1706 | "dev": true, 1707 | "peer": true, 1708 | "requires": { 1709 | "esrecurse": "^4.3.0", 1710 | "estraverse": "^4.1.1" 1711 | } 1712 | }, 1713 | "esrecurse": { 1714 | "version": "4.3.0", 1715 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1716 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1717 | "dev": true, 1718 | "peer": true, 1719 | "requires": { 1720 | "estraverse": "^5.2.0" 1721 | }, 1722 | "dependencies": { 1723 | "estraverse": { 1724 | "version": "5.3.0", 1725 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1726 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1727 | "dev": true, 1728 | "peer": true 1729 | } 1730 | } 1731 | }, 1732 | "estraverse": { 1733 | "version": "4.3.0", 1734 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1735 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1736 | "dev": true, 1737 | "peer": true 1738 | }, 1739 | "events": { 1740 | "version": "3.3.0", 1741 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1742 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1743 | "dev": true, 1744 | "peer": true 1745 | }, 1746 | "fast-deep-equal": { 1747 | "version": "3.1.3", 1748 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1749 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1750 | "dev": true 1751 | }, 1752 | "fast-json-stable-stringify": { 1753 | "version": "2.1.0", 1754 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1755 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1756 | "dev": true 1757 | }, 1758 | "glob-to-regexp": { 1759 | "version": "0.4.1", 1760 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1761 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 1762 | "dev": true, 1763 | "peer": true 1764 | }, 1765 | "graceful-fs": { 1766 | "version": "4.2.10", 1767 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 1768 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 1769 | "dev": true, 1770 | "peer": true 1771 | }, 1772 | "has-flag": { 1773 | "version": "4.0.0", 1774 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1775 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1776 | "dev": true, 1777 | "peer": true 1778 | }, 1779 | "he": { 1780 | "version": "1.2.0", 1781 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1782 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1783 | "dev": true 1784 | }, 1785 | "html-loader": { 1786 | "version": "1.3.2", 1787 | "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", 1788 | "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", 1789 | "dev": true, 1790 | "requires": { 1791 | "html-minifier-terser": "^5.1.1", 1792 | "htmlparser2": "^4.1.0", 1793 | "loader-utils": "^2.0.0", 1794 | "schema-utils": "^3.0.0" 1795 | }, 1796 | "dependencies": { 1797 | "domhandler": { 1798 | "version": "3.3.0", 1799 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", 1800 | "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", 1801 | "dev": true, 1802 | "requires": { 1803 | "domelementtype": "^2.0.1" 1804 | } 1805 | }, 1806 | "htmlparser2": { 1807 | "version": "4.1.0", 1808 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", 1809 | "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", 1810 | "dev": true, 1811 | "requires": { 1812 | "domelementtype": "^2.0.1", 1813 | "domhandler": "^3.0.0", 1814 | "domutils": "^2.0.0", 1815 | "entities": "^2.0.0" 1816 | } 1817 | } 1818 | } 1819 | }, 1820 | "html-minifier-terser": { 1821 | "version": "5.1.1", 1822 | "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", 1823 | "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", 1824 | "dev": true, 1825 | "requires": { 1826 | "camel-case": "^4.1.1", 1827 | "clean-css": "^4.2.3", 1828 | "commander": "^4.1.1", 1829 | "he": "^1.2.0", 1830 | "param-case": "^3.0.3", 1831 | "relateurl": "^0.2.7", 1832 | "terser": "^4.6.3" 1833 | }, 1834 | "dependencies": { 1835 | "terser": { 1836 | "version": "4.8.0", 1837 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", 1838 | "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", 1839 | "dev": true, 1840 | "requires": { 1841 | "commander": "^2.20.0", 1842 | "source-map": "~0.6.1", 1843 | "source-map-support": "~0.5.12" 1844 | }, 1845 | "dependencies": { 1846 | "commander": { 1847 | "version": "2.20.3", 1848 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1849 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1850 | "dev": true 1851 | } 1852 | } 1853 | } 1854 | } 1855 | }, 1856 | "html2bbcode": { 1857 | "version": "1.2.6", 1858 | "resolved": "https://registry.npm.taobao.org/html2bbcode/download/html2bbcode-1.2.6.tgz", 1859 | "integrity": "sha1-ApKhPvtNhEdWD925KTmL/wHWA9k=" 1860 | }, 1861 | "htmlparser2": { 1862 | "version": "6.1.0", 1863 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", 1864 | "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", 1865 | "requires": { 1866 | "domelementtype": "^2.0.1", 1867 | "domhandler": "^4.0.0", 1868 | "domutils": "^2.5.2", 1869 | "entities": "^2.0.0" 1870 | } 1871 | }, 1872 | "jest-worker": { 1873 | "version": "27.5.1", 1874 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 1875 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 1876 | "dev": true, 1877 | "peer": true, 1878 | "requires": { 1879 | "@types/node": "*", 1880 | "merge-stream": "^2.0.0", 1881 | "supports-color": "^8.0.0" 1882 | } 1883 | }, 1884 | "json-parse-better-errors": { 1885 | "version": "1.0.2", 1886 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1887 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1888 | "dev": true, 1889 | "peer": true 1890 | }, 1891 | "json-schema-traverse": { 1892 | "version": "0.4.1", 1893 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1894 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1895 | "dev": true 1896 | }, 1897 | "json5": { 1898 | "version": "2.2.1", 1899 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 1900 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 1901 | "dev": true 1902 | }, 1903 | "loader-runner": { 1904 | "version": "4.3.0", 1905 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 1906 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 1907 | "dev": true, 1908 | "peer": true 1909 | }, 1910 | "loader-utils": { 1911 | "version": "2.0.2", 1912 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", 1913 | "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", 1914 | "dev": true, 1915 | "requires": { 1916 | "big.js": "^5.2.2", 1917 | "emojis-list": "^3.0.0", 1918 | "json5": "^2.1.2" 1919 | } 1920 | }, 1921 | "lower-case": { 1922 | "version": "2.0.2", 1923 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1924 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1925 | "dev": true, 1926 | "requires": { 1927 | "tslib": "^2.0.3" 1928 | } 1929 | }, 1930 | "merge-stream": { 1931 | "version": "2.0.0", 1932 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1933 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1934 | "dev": true, 1935 | "peer": true 1936 | }, 1937 | "mime-db": { 1938 | "version": "1.52.0", 1939 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1940 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1941 | "dev": true, 1942 | "peer": true 1943 | }, 1944 | "mime-types": { 1945 | "version": "2.1.35", 1946 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1947 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1948 | "dev": true, 1949 | "peer": true, 1950 | "requires": { 1951 | "mime-db": "1.52.0" 1952 | } 1953 | }, 1954 | "neo-async": { 1955 | "version": "2.6.2", 1956 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 1957 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 1958 | "dev": true, 1959 | "peer": true 1960 | }, 1961 | "no-case": { 1962 | "version": "3.0.4", 1963 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1964 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1965 | "dev": true, 1966 | "requires": { 1967 | "lower-case": "^2.0.2", 1968 | "tslib": "^2.0.3" 1969 | } 1970 | }, 1971 | "node-releases": { 1972 | "version": "2.0.3", 1973 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", 1974 | "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", 1975 | "dev": true, 1976 | "peer": true 1977 | }, 1978 | "nth-check": { 1979 | "version": "2.0.1", 1980 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", 1981 | "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", 1982 | "requires": { 1983 | "boolbase": "^1.0.0" 1984 | } 1985 | }, 1986 | "param-case": { 1987 | "version": "3.0.4", 1988 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", 1989 | "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", 1990 | "dev": true, 1991 | "requires": { 1992 | "dot-case": "^3.0.4", 1993 | "tslib": "^2.0.3" 1994 | } 1995 | }, 1996 | "parse5": { 1997 | "version": "6.0.1", 1998 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 1999 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" 2000 | }, 2001 | "parse5-htmlparser2-tree-adapter": { 2002 | "version": "6.0.1", 2003 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", 2004 | "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", 2005 | "requires": { 2006 | "parse5": "^6.0.1" 2007 | } 2008 | }, 2009 | "pascal-case": { 2010 | "version": "3.1.2", 2011 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 2012 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 2013 | "dev": true, 2014 | "requires": { 2015 | "no-case": "^3.0.4", 2016 | "tslib": "^2.0.3" 2017 | } 2018 | }, 2019 | "picocolors": { 2020 | "version": "1.0.0", 2021 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2022 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2023 | "dev": true, 2024 | "peer": true 2025 | }, 2026 | "punycode": { 2027 | "version": "2.1.1", 2028 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2029 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2030 | "dev": true 2031 | }, 2032 | "randombytes": { 2033 | "version": "2.1.0", 2034 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2035 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2036 | "dev": true, 2037 | "peer": true, 2038 | "requires": { 2039 | "safe-buffer": "^5.1.0" 2040 | } 2041 | }, 2042 | "relateurl": { 2043 | "version": "0.2.7", 2044 | "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", 2045 | "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", 2046 | "dev": true 2047 | }, 2048 | "safe-buffer": { 2049 | "version": "5.2.1", 2050 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2051 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2052 | "dev": true, 2053 | "peer": true 2054 | }, 2055 | "schema-utils": { 2056 | "version": "3.1.1", 2057 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", 2058 | "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", 2059 | "dev": true, 2060 | "requires": { 2061 | "@types/json-schema": "^7.0.8", 2062 | "ajv": "^6.12.5", 2063 | "ajv-keywords": "^3.5.2" 2064 | } 2065 | }, 2066 | "serialize-javascript": { 2067 | "version": "6.0.0", 2068 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2069 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2070 | "dev": true, 2071 | "peer": true, 2072 | "requires": { 2073 | "randombytes": "^2.1.0" 2074 | } 2075 | }, 2076 | "source-map": { 2077 | "version": "0.6.1", 2078 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2079 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2080 | "dev": true 2081 | }, 2082 | "source-map-support": { 2083 | "version": "0.5.21", 2084 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2085 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2086 | "dev": true, 2087 | "requires": { 2088 | "buffer-from": "^1.0.0", 2089 | "source-map": "^0.6.0" 2090 | } 2091 | }, 2092 | "supports-color": { 2093 | "version": "8.1.1", 2094 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2095 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2096 | "dev": true, 2097 | "peer": true, 2098 | "requires": { 2099 | "has-flag": "^4.0.0" 2100 | } 2101 | }, 2102 | "tapable": { 2103 | "version": "2.2.1", 2104 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 2105 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 2106 | "dev": true, 2107 | "peer": true 2108 | }, 2109 | "terser": { 2110 | "version": "5.12.1", 2111 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", 2112 | "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", 2113 | "dev": true, 2114 | "peer": true, 2115 | "requires": { 2116 | "acorn": "^8.5.0", 2117 | "commander": "^2.20.0", 2118 | "source-map": "~0.7.2", 2119 | "source-map-support": "~0.5.20" 2120 | }, 2121 | "dependencies": { 2122 | "commander": { 2123 | "version": "2.20.3", 2124 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 2125 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 2126 | "dev": true, 2127 | "peer": true 2128 | }, 2129 | "source-map": { 2130 | "version": "0.7.3", 2131 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 2132 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 2133 | "dev": true, 2134 | "peer": true 2135 | } 2136 | } 2137 | }, 2138 | "terser-webpack-plugin": { 2139 | "version": "5.3.1", 2140 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", 2141 | "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", 2142 | "dev": true, 2143 | "peer": true, 2144 | "requires": { 2145 | "jest-worker": "^27.4.5", 2146 | "schema-utils": "^3.1.1", 2147 | "serialize-javascript": "^6.0.0", 2148 | "source-map": "^0.6.1", 2149 | "terser": "^5.7.2" 2150 | } 2151 | }, 2152 | "tslib": { 2153 | "version": "2.3.1", 2154 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 2155 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 2156 | }, 2157 | "uri-js": { 2158 | "version": "4.4.1", 2159 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2160 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2161 | "dev": true, 2162 | "requires": { 2163 | "punycode": "^2.1.0" 2164 | } 2165 | }, 2166 | "watchpack": { 2167 | "version": "2.3.1", 2168 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", 2169 | "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", 2170 | "dev": true, 2171 | "peer": true, 2172 | "requires": { 2173 | "glob-to-regexp": "^0.4.1", 2174 | "graceful-fs": "^4.1.2" 2175 | } 2176 | }, 2177 | "webpack": { 2178 | "version": "5.72.0", 2179 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", 2180 | "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", 2181 | "dev": true, 2182 | "peer": true, 2183 | "requires": { 2184 | "@types/eslint-scope": "^3.7.3", 2185 | "@types/estree": "^0.0.51", 2186 | "@webassemblyjs/ast": "1.11.1", 2187 | "@webassemblyjs/wasm-edit": "1.11.1", 2188 | "@webassemblyjs/wasm-parser": "1.11.1", 2189 | "acorn": "^8.4.1", 2190 | "acorn-import-assertions": "^1.7.6", 2191 | "browserslist": "^4.14.5", 2192 | "chrome-trace-event": "^1.0.2", 2193 | "enhanced-resolve": "^5.9.2", 2194 | "es-module-lexer": "^0.9.0", 2195 | "eslint-scope": "5.1.1", 2196 | "events": "^3.2.0", 2197 | "glob-to-regexp": "^0.4.1", 2198 | "graceful-fs": "^4.2.9", 2199 | "json-parse-better-errors": "^1.0.2", 2200 | "loader-runner": "^4.2.0", 2201 | "mime-types": "^2.1.27", 2202 | "neo-async": "^2.6.2", 2203 | "schema-utils": "^3.1.0", 2204 | "tapable": "^2.1.1", 2205 | "terser-webpack-plugin": "^5.1.3", 2206 | "watchpack": "^2.3.1", 2207 | "webpack-sources": "^3.2.3" 2208 | } 2209 | }, 2210 | "webpack-sources": { 2211 | "version": "3.2.3", 2212 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 2213 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 2214 | "dev": true, 2215 | "peer": true 2216 | } 2217 | } 2218 | } 2219 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ptgen", 3 | "version": "0.0.1", 4 | "description": "PT-Gen on Cloudflare Worker", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "wrangler build", 8 | "preview": "wrangler preview", 9 | "publish": "wrangler publish" 10 | }, 11 | "author": "Rhilip ", 12 | "license": "MIT", 13 | "dependencies": { 14 | "cheerio": "^1.0.0-rc.10", 15 | "html2bbcode": "^1.2.6" 16 | }, 17 | "devDependencies": { 18 | "html-loader": "^1.3.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | target: 'webworker', 3 | entry: './index.js', 4 | module: { 5 | rules: [ 6 | { 7 | test: /\.html$/i, 8 | loader: "html-loader", 9 | }, 10 | ], 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /wrangler.toml.sample: -------------------------------------------------------------------------------- 1 | name = "ptgen" 2 | type = "webpack" 3 | webpack_config = "webpack.config.js" 4 | workers_dev = true 5 | account_id = "CF_ACCOUNT_ID" 6 | vars = { } 7 | kv_namespaces = [ 8 | { binding = "PT_GEN_STORE", id = "" } 9 | ] 10 | --------------------------------------------------------------------------------