├── .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 | [](https://app.fossa.io/projects/git%2Bgithub.com%2FRhilip%2Fpt-gen-cfworker?ref=badge_shield)
3 | [](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 | [](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 |
37 |
55 |
56 |
57 |
58 |
59 |
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 |
--------------------------------------------------------------------------------