├── .github
└── workflows
│ └── main.yml
├── .gitignore
├── README.md
├── assets
└── DEMO.JPG
├── backend
├── gallery.js
├── package-lock.json
└── package.json
├── data
├── plugins.json
└── repos.json
├── loon-gallery.plugin
├── package-lock.json
├── plugin-sources.json
├── update-sources.js
└── web
├── .gitignore
├── README.md
├── babel.config.js
├── jsconfig.json
├── package-lock.json
├── package.json
├── public
├── favicon.ico
└── index.html
├── src
├── App.vue
├── components
│ └── Gallery.vue
├── config.js
├── main.js
├── plugins
│ └── vuetify.js
└── utils
│ └── index.js
└── vue.config.js
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | name: update
2 | on:
3 | schedule:
4 | - cron: "0 0 * * *"
5 | push:
6 | branches:
7 | - master
8 | paths:
9 | - 'plugin-sources.json'
10 | pull_request:
11 | branches:
12 | - master
13 | paths:
14 | - 'plugin-sources.json'
15 | jobs:
16 | build:
17 | runs-on: ubuntu-latest
18 | steps:
19 | - name: Checkout
20 | uses: actions/checkout@v3
21 | with:
22 | ref: 'master'
23 | - name: Set up Node.js
24 | uses: actions/setup-node@v3
25 | with:
26 | node-version: "14"
27 | - name: Install dependencies
28 | run: npm install request
29 | - name: Update source
30 | run: node update-sources.js ${{ secrets.GITHUB_TOKEN }}
31 | - name: Commit changes
32 | run: |
33 | git config user.email github-actions
34 | git config user.name github-actions@github.com
35 | git add .
36 | git commit -m "Plugin update" -a
37 | git push
38 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 | loon-gallery.json
5 | root.json
6 |
7 |
8 | # local env files
9 | .env.local
10 | .env.*.local
11 |
12 | # Log files
13 | npm-debug.log*
14 | yarn-debug.log*
15 | yarn-error.log*
16 | pnpm-debug.log*
17 |
18 | # Editor directories and files
19 | .idea
20 | .vscode
21 | *.suo
22 | *.ntvs*
23 | *.njsproj
24 | *.sln
25 | *.sw?
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Loon Gallery
2 |
3 | [](https://github.com/Peng-YM/Loon-Gallery/actions/workflows/main.yml)
4 |
5 | Loon 插件仓库,提供一键式安装 Loon 插件。
6 |
7 |
8 |
9 |
10 |
11 | ## 配置
12 | Loon 用户安装[插件](https://raw.githubusercontent.com/Peng-YM/Loon-Gallery/master/loon-gallery.plugin),访问以下网址即可: https://🎈.com
13 |
14 | ## 如何贡献?
15 | 您可以通过以下几个步骤添加一个 GitHub 仓库作为 Loon Gallery 的来源:
16 | 1. 首先 Fork 本仓库
17 | 2. 修改 [plugin-sources.json](https://github.com/Peng-YM/Loon-Gallery/blob/master/plugin-sources.json) 文件,填写 GitHub 仓库的用户名,仓库名,分支,以及可选的搜索路径(如果未提供该参数,则默认指定根目录)。示例如下:
18 | ```json
19 | {
20 | "user": "Peng-YM",
21 | "repo": "QuanX",
22 | "branch": "master",
23 | "paths": ["/Tools"]
24 | }
25 | ```
26 | 3. 提交 PR 申请即可。非常感谢您的贡献!
27 |
--------------------------------------------------------------------------------
/assets/DEMO.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Peng-YM/Loon-Gallery/d8043afe48cd0edf1e7664871e448e91432ff651/assets/DEMO.JPG
--------------------------------------------------------------------------------
/backend/gallery.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Loon plugin gallery
3 |
4 | ██╗ ██████╗ ██████╗ ███╗ ██╗ ██████╗ █████╗ ██╗ ██╗ ███████╗██████╗ ██╗ ██╗
5 | ██║ ██╔═══██╗██╔═══██╗████╗ ██║ ██╔════╝ ██╔══██╗██║ ██║ ██╔════╝██╔══██╗╚██╗ ██╔╝
6 | ██║ ██║ ██║██║ ██║██╔██╗ ██║ ██║ ███╗███████║██║ ██║ █████╗ ██████╔╝ ╚████╔╝
7 | ██║ ██║ ██║██║ ██║██║╚██╗██║ ██║ ██║██╔══██║██║ ██║ ██╔══╝ ██╔══██╗ ╚██╔╝
8 | ███████╗╚██████╔╝╚██████╔╝██║ ╚████║ ╚██████╔╝██║ ██║███████╗███████╗███████╗██║ ██║ ██║
9 | ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝
10 |
11 | */
12 |
13 |
14 | const $ = API("loon-gallery", true);
15 |
16 | const PLUGIN_SOURCE_REPO_KEY = "sources-repos";
17 | if (!$.read(PLUGIN_SOURCE_REPO_KEY)) $.write({}, PLUGIN_SOURCE_REPO_KEY);
18 |
19 | const PLUGIN_KEY = "plugins";
20 | if (!$.read(PLUGIN_KEY)) $.write({}, PLUGIN_KEY);
21 |
22 | service();
23 |
24 | function service() {
25 | const $app = express();
26 |
27 | $app.all("/", (req, res) => {
28 | res.set("location", "https://loon-gallery.vercel.app/").status(302).end();
29 | });
30 |
31 | $app.start();
32 | }
33 |
34 | /**
35 | * OpenAPI
36 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md
37 | */
38 | function ENV() {
39 | const isQX = typeof $task !== "undefined";
40 | const isLoon = typeof $loon !== "undefined";
41 | const isSurge = typeof $httpClient !== "undefined" && !isLoon;
42 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined";
43 | const isNode = typeof require == "function" && !isJSBox;
44 | const isRequest = typeof $request !== "undefined";
45 | const isScriptable = typeof importModule !== "undefined";
46 | return { isQX, isLoon, isSurge, isNode, isJSBox, isRequest, isScriptable };
47 | }
48 |
49 | function HTTP(defaultOptions = { baseURL: "" }) {
50 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV();
51 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"];
52 | const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;
53 |
54 | function send(method, options) {
55 | options = typeof options === "string" ? { url: options } : options;
56 | const baseURL = defaultOptions.baseURL;
57 | if (baseURL && !URL_REGEX.test(options.url || "")) {
58 | options.url = baseURL ? baseURL + options.url : options.url;
59 | }
60 | options = { ...defaultOptions, ...options };
61 | const timeout = options.timeout;
62 | const events = {
63 | ...{
64 | onRequest: () => {
65 | },
66 | onResponse: (resp) => resp,
67 | onTimeout: () => {
68 | },
69 | },
70 | ...options.events,
71 | };
72 |
73 | events.onRequest(method, options);
74 |
75 | let worker;
76 | if (isQX) {
77 | worker = $task.fetch({
78 | method,
79 | url: options.url,
80 | headers: options.headers,
81 | body: options.body,
82 | });
83 | } else if (isLoon || isSurge || isNode) {
84 | worker = new Promise((resolve, reject) => {
85 | const request = isNode ? require("request") : $httpClient;
86 | request[method.toLowerCase()](options, (err, response, body) => {
87 | if (err) reject(err);
88 | else
89 | resolve({
90 | statusCode: response.status || response.statusCode,
91 | headers: response.headers,
92 | body,
93 | });
94 | });
95 | });
96 | } else if (isScriptable) {
97 | const request = new Request(options.url);
98 | request.method = method;
99 | request.headers = options.headers;
100 | request.body = options.body;
101 | worker = new Promise((resolve, reject) => {
102 | request
103 | .loadString()
104 | .then((body) => {
105 | resolve({
106 | statusCode: request.response.statusCode,
107 | headers: request.response.headers,
108 | body,
109 | });
110 | })
111 | .catch((err) => reject(err));
112 | });
113 | }
114 |
115 | let timeoutid;
116 | const timer = timeout
117 | ? new Promise((_, reject) => {
118 | timeoutid = setTimeout(() => {
119 | events.onTimeout();
120 | return reject(
121 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms`
122 | );
123 | }, timeout);
124 | })
125 | : null;
126 |
127 | return (timer
128 | ? Promise.race([timer, worker]).then((res) => {
129 | clearTimeout(timeoutid);
130 | return res;
131 | })
132 | : worker
133 | ).then((resp) => events.onResponse(resp));
134 | }
135 |
136 | const http = {};
137 | methods.forEach(
138 | (method) =>
139 | (http[method.toLowerCase()] = (options) => send(method, options))
140 | );
141 | return http;
142 | }
143 |
144 | function API(name = "untitled", debug = false) {
145 | const { isQX, isLoon, isSurge, isNode, isJSBox, isScriptable } = ENV();
146 | return new (class {
147 | constructor(name, debug) {
148 | this.name = name;
149 | this.debug = debug;
150 |
151 | this.http = HTTP();
152 | this.env = ENV();
153 |
154 | this.node = (() => {
155 | if (isNode) {
156 | const fs = require("fs");
157 |
158 | return {
159 | fs,
160 | };
161 | } else {
162 | return null;
163 | }
164 | })();
165 | this.initCache();
166 |
167 | const delay = (t, v) =>
168 | new Promise(function (resolve) {
169 | setTimeout(resolve.bind(null, v), t);
170 | });
171 |
172 | Promise.prototype.delay = function (t) {
173 | return this.then(function (v) {
174 | return delay(t, v);
175 | });
176 | };
177 | }
178 |
179 | // persistence
180 | // initialize cache
181 | initCache() {
182 | if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}");
183 | if (isLoon || isSurge)
184 | this.cache = JSON.parse($persistentStore.read(this.name) || "{}");
185 |
186 | if (isNode) {
187 | // create a json for root cache
188 | let fpath = "root.json";
189 | if (!this.node.fs.existsSync(fpath)) {
190 | this.node.fs.writeFileSync(
191 | fpath,
192 | JSON.stringify({}),
193 | { flag: "wx" },
194 | (err) => console.log(err)
195 | );
196 | }
197 | this.root = {};
198 |
199 | // create a json file with the given name if not exists
200 | fpath = `${this.name}.json`;
201 | if (!this.node.fs.existsSync(fpath)) {
202 | this.node.fs.writeFileSync(
203 | fpath,
204 | JSON.stringify({}),
205 | { flag: "wx" },
206 | (err) => console.log(err)
207 | );
208 | this.cache = {};
209 | } else {
210 | this.cache = JSON.parse(
211 | this.node.fs.readFileSync(`${this.name}.json`)
212 | );
213 | }
214 | }
215 | }
216 |
217 | // store cache
218 | persistCache() {
219 | const data = JSON.stringify(this.cache, null, 2);
220 | if (isQX) $prefs.setValueForKey(data, this.name);
221 | if (isLoon || isSurge) $persistentStore.write(data, this.name);
222 | if (isNode) {
223 | this.node.fs.writeFileSync(
224 | `${this.name}.json`,
225 | data,
226 | { flag: "w" },
227 | (err) => console.log(err)
228 | );
229 | this.node.fs.writeFileSync(
230 | "root.json",
231 | JSON.stringify(this.root, null, 2),
232 | { flag: "w" },
233 | (err) => console.log(err)
234 | );
235 | }
236 | }
237 |
238 | write(data, key) {
239 | this.log(`SET ${key}`);
240 | if (key.indexOf("#") !== -1) {
241 | key = key.substr(1);
242 | if (isSurge || isLoon) {
243 | return $persistentStore.write(data, key);
244 | }
245 | if (isQX) {
246 | return $prefs.setValueForKey(data, key);
247 | }
248 | if (isNode) {
249 | this.root[key] = data;
250 | }
251 | } else {
252 | this.cache[key] = data;
253 | }
254 | this.persistCache();
255 | }
256 |
257 | read(key) {
258 | this.log(`READ ${key}`);
259 | if (key.indexOf("#") !== -1) {
260 | key = key.substr(1);
261 | if (isSurge || isLoon) {
262 | return $persistentStore.read(key);
263 | }
264 | if (isQX) {
265 | return $prefs.valueForKey(key);
266 | }
267 | if (isNode) {
268 | return this.root[key];
269 | }
270 | } else {
271 | return this.cache[key];
272 | }
273 | }
274 |
275 | delete(key) {
276 | this.log(`DELETE ${key}`);
277 | if (key.indexOf("#") !== -1) {
278 | key = key.substr(1);
279 | if (isSurge || isLoon) {
280 | return $persistentStore.write(null, key);
281 | }
282 | if (isQX) {
283 | return $prefs.removeValueForKey(key);
284 | }
285 | if (isNode) {
286 | delete this.root[key];
287 | }
288 | } else {
289 | delete this.cache[key];
290 | }
291 | this.persistCache();
292 | }
293 |
294 | // notification
295 | notify(title, subtitle = "", content = "", options = {}) {
296 | const openURL = options["open-url"];
297 | const mediaURL = options["media-url"];
298 |
299 | if (isQX) $notify(title, subtitle, content, options);
300 | if (isSurge) {
301 | $notification.post(
302 | title,
303 | subtitle,
304 | content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`,
305 | {
306 | url: openURL,
307 | }
308 | );
309 | }
310 | if (isLoon) {
311 | let opts = {};
312 | if (openURL) opts["openUrl"] = openURL;
313 | if (mediaURL) opts["mediaUrl"] = mediaURL;
314 | if (JSON.stringify(opts) === "{}") {
315 | $notification.post(title, subtitle, content);
316 | } else {
317 | $notification.post(title, subtitle, content, opts);
318 | }
319 | }
320 | if (isNode || isScriptable) {
321 | const content_ =
322 | content +
323 | (openURL ? `\n点击跳转: ${openURL}` : "") +
324 | (mediaURL ? `\n多媒体: ${mediaURL}` : "");
325 | if (isJSBox) {
326 | const push = require("push");
327 | push.schedule({
328 | title: title,
329 | body: (subtitle ? subtitle + "\n" : "") + content_,
330 | });
331 | } else {
332 | console.log(`${title}\n${subtitle}\n${content_}\n\n`);
333 | }
334 | }
335 | }
336 |
337 | // other helper functions
338 | log(msg) {
339 | if (this.debug) console.log(`[${this.name}] LOG: ${msg}`);
340 | }
341 |
342 | info(msg) {
343 | console.log(`[${this.name}] INFO: ${msg}`);
344 | }
345 |
346 | error(msg) {
347 | console.log(`[${this.name}] ERROR: ${msg}`);
348 | }
349 |
350 | wait(millisec) {
351 | return new Promise((resolve) => setTimeout(resolve, millisec));
352 | }
353 |
354 | done(value = {}) {
355 | if (isQX || isLoon || isSurge) {
356 | $done(value);
357 | } else if (isNode && !isJSBox) {
358 | if (typeof $context !== "undefined") {
359 | $context.headers = value.headers;
360 | $context.statusCode = value.statusCode;
361 | $context.body = value.body;
362 | }
363 | }
364 | }
365 | })(name, debug);
366 | }
367 |
368 | /**
369 | * Mini Express Framework
370 | * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/Express.js
371 | */
372 | function express({ port } = { port: 3000 }) {
373 | const { isNode } = ENV();
374 | const DEFAULT_HEADERS = {
375 | "Content-Type": "text/plain;charset=UTF-8",
376 | "Access-Control-Allow-Origin": "*",
377 | "Access-Control-Allow-Methods": "POST,GET,OPTIONS,PATCH,PUT,DELETE",
378 | "Access-Control-Allow-Headers":
379 | "Origin, X-Requested-With, Content-Type, Accept",
380 | };
381 |
382 | // node support
383 | if (isNode) {
384 | const express_ = require("express");
385 | const bodyParser = require("body-parser");
386 | const app = express_();
387 | app.use(bodyParser.json({ verify: rawBodySaver }));
388 | app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
389 | app.use(bodyParser.raw({ verify: rawBodySaver, type: "*/*" }));
390 | app.use((req, res, next) => {
391 | res.set(DEFAULT_HEADERS);
392 | next();
393 | });
394 |
395 | // adapter
396 | app.start = () => {
397 | app.listen(port, () => {
398 | $.log(`Express started on port: ${port}`);
399 | });
400 | };
401 | return app;
402 | }
403 |
404 | // route handlers
405 | const handlers = [];
406 |
407 | // http methods
408 | const METHODS_NAMES = [
409 | "GET",
410 | "POST",
411 | "PUT",
412 | "DELETE",
413 | "PATCH",
414 | "OPTIONS",
415 | "HEAD'",
416 | "ALL",
417 | ];
418 |
419 | // dispatch url to route
420 | const dispatch = (request, start = 0) => {
421 | let { method, url, headers, body } = request;
422 | if (/json/i.test(headers["Content-Type"])) {
423 | body = JSON.parse(body);
424 | }
425 |
426 | method = method.toUpperCase();
427 | const { path, query } = extractURL(url);
428 |
429 | // pattern match
430 | let handler = null;
431 | let i;
432 | let longestMatchedPattern = 0;
433 | for (i = start; i < handlers.length; i++) {
434 | if (handlers[i].method === "ALL" || method === handlers[i].method) {
435 | const { pattern } = handlers[i];
436 | if (patternMatched(pattern, path)) {
437 | if (pattern.split("/").length > longestMatchedPattern) {
438 | handler = handlers[i];
439 | longestMatchedPattern = pattern.split("/").length;
440 | }
441 | }
442 | }
443 | }
444 | if (handler) {
445 | // dispatch to next handler
446 | const next = () => {
447 | dispatch(method, url, i);
448 | };
449 | const req = {
450 | method,
451 | url,
452 | path,
453 | query,
454 | params: extractPathParams(handler.pattern, path),
455 | headers,
456 | body,
457 | };
458 | const res = Response();
459 | const cb = handler.callback;
460 |
461 | const errFunc = (err) => {
462 | res.status(500).json({
463 | status: "failed",
464 | message: `Internal Server Error: ${err}`,
465 | });
466 | };
467 |
468 | if (cb.constructor.name === "AsyncFunction") {
469 | cb(req, res, next).catch(errFunc);
470 | } else {
471 | try {
472 | cb(req, res, next);
473 | } catch (err) {
474 | errFunc(err);
475 | }
476 | }
477 | } else {
478 | // no route, return 404
479 | const res = Response();
480 | res.status(404).json({
481 | status: "failed",
482 | message: "ERROR: 404 not found",
483 | });
484 | }
485 | };
486 |
487 | const app = {};
488 |
489 | // attach http methods
490 | METHODS_NAMES.forEach((method) => {
491 | app[method.toLowerCase()] = (pattern, callback) => {
492 | // add handler
493 | handlers.push({ method, pattern, callback });
494 | };
495 | });
496 |
497 | // chainable route
498 | app.route = (pattern) => {
499 | const chainApp = {};
500 | METHODS_NAMES.forEach((method) => {
501 | chainApp[method.toLowerCase()] = (callback) => {
502 | // add handler
503 | handlers.push({ method, pattern, callback });
504 | return chainApp;
505 | };
506 | });
507 | return chainApp;
508 | };
509 |
510 | // start service
511 | app.start = () => {
512 | dispatch($request);
513 | };
514 |
515 | return app;
516 |
517 | /************************************************
518 | Utility Functions
519 | *************************************************/
520 | function rawBodySaver(req, res, buf, encoding) {
521 | if (buf && buf.length) {
522 | req.rawBody = buf.toString(encoding || "utf8");
523 | }
524 | }
525 |
526 | function Response() {
527 | let statusCode = 200;
528 | const { isQX, isLoon, isSurge } = ENV();
529 | const headers = DEFAULT_HEADERS;
530 | const STATUS_CODE_MAP = {
531 | 200: "HTTP/1.1 200 OK",
532 | 201: "HTTP/1.1 201 Created",
533 | 302: "HTTP/1.1 302 Found",
534 | 307: "HTTP/1.1 307 Temporary Redirect",
535 | 308: "HTTP/1.1 308 Permanent Redirect",
536 | 404: "HTTP/1.1 404 Not Found",
537 | 500: "HTTP/1.1 500 Internal Server Error",
538 | };
539 | return new (class {
540 | status(code) {
541 | statusCode = code;
542 | return this;
543 | }
544 |
545 | send(body = "") {
546 | const response = {
547 | status: isQX ? STATUS_CODE_MAP[statusCode] : statusCode,
548 | body,
549 | headers,
550 | };
551 | if (isQX) {
552 | $done(response);
553 | } else if (isLoon || isSurge) {
554 | $done({
555 | response,
556 | });
557 | }
558 | }
559 |
560 | end() {
561 | this.send();
562 | }
563 |
564 | html(data) {
565 | this.set("Content-Type", "text/html;charset=UTF-8");
566 | this.send(data);
567 | }
568 |
569 | json(data) {
570 | this.set("Content-Type", "application/json;charset=UTF-8");
571 | $.info(headers);
572 | this.send(JSON.stringify(data));
573 | }
574 |
575 | set(key, val) {
576 | headers[key] = val;
577 | return this;
578 | }
579 | })();
580 | }
581 |
582 | function patternMatched(pattern, path) {
583 | if (pattern instanceof RegExp && pattern.test(path)) {
584 | return true;
585 | } else {
586 | // root pattern, match all
587 | if (pattern === "/") return true;
588 | // normal string pattern
589 | if (pattern.indexOf(":") === -1) {
590 | const spath = path.split("/");
591 | const spattern = pattern.split("/");
592 | for (let i = 0; i < spattern.length; i++) {
593 | if (spath[i] !== spattern[i]) {
594 | return false;
595 | }
596 | }
597 | return true;
598 | }
599 | // string pattern with path parameters
600 | else if (extractPathParams(pattern, path)) {
601 | return true;
602 | }
603 | }
604 | return false;
605 | }
606 |
607 | function extractURL(url) {
608 | // extract path
609 | const match = url.match(/https?:\/\/[^\/]+(\/[^?]*)/) || [];
610 | const path = match[1] || "/";
611 |
612 | // extract query string
613 | const split = url.indexOf("?");
614 | const query = {};
615 | if (split !== -1) {
616 | let hashes = url.slice(url.indexOf("?") + 1).split("&");
617 | for (let i = 0; i < hashes.length; i++) {
618 | hash = hashes[i].split("=");
619 | query[hash[0]] = hash[1];
620 | }
621 | }
622 | return {
623 | path,
624 | query,
625 | };
626 | }
627 |
628 | function extractPathParams(pattern, path) {
629 | if (pattern.indexOf(":") === -1) {
630 | return null;
631 | } else {
632 | const params = {};
633 | for (let i = 0, j = 0; i < pattern.length; i++, j++) {
634 | if (pattern[i] === ":") {
635 | let key = [];
636 | let val = [];
637 | while (pattern[++i] !== "/" && i < pattern.length) {
638 | key.push(pattern[i]);
639 | }
640 | while (path[j] !== "/" && j < path.length) {
641 | val.push(path[j++]);
642 | }
643 | params[key.join("")] = val.join("");
644 | } else {
645 | if (pattern[i] !== path[j]) {
646 | return null;
647 | }
648 | }
649 | }
650 | return params;
651 | }
652 | }
653 | }
--------------------------------------------------------------------------------
/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "loon-gallery",
3 | "version": "0.1.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "loon-gallery",
9 | "version": "0.1.0",
10 | "license": "GPL-3.0-or-later",
11 | "dependencies": {
12 | "axios": "^0.27.2",
13 | "body-parser": "^1.20.0",
14 | "express": "^4.18.1",
15 | "request": "^2.88.2"
16 | }
17 | },
18 | "node_modules/accepts": {
19 | "version": "1.3.8",
20 | "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
21 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
22 | "dependencies": {
23 | "mime-types": "~2.1.34",
24 | "negotiator": "0.6.3"
25 | },
26 | "engines": {
27 | "node": ">= 0.6"
28 | }
29 | },
30 | "node_modules/ajv": {
31 | "version": "6.12.6",
32 | "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
33 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
34 | "dependencies": {
35 | "fast-deep-equal": "^3.1.1",
36 | "fast-json-stable-stringify": "^2.0.0",
37 | "json-schema-traverse": "^0.4.1",
38 | "uri-js": "^4.2.2"
39 | }
40 | },
41 | "node_modules/array-flatten": {
42 | "version": "1.1.1",
43 | "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
44 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
45 | },
46 | "node_modules/asn1": {
47 | "version": "0.2.6",
48 | "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
49 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
50 | "dependencies": {
51 | "safer-buffer": "~2.1.0"
52 | }
53 | },
54 | "node_modules/assert-plus": {
55 | "version": "1.0.0",
56 | "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
57 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
58 | "engines": {
59 | "node": ">=0.8"
60 | }
61 | },
62 | "node_modules/asynckit": {
63 | "version": "0.4.0",
64 | "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
65 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
66 | },
67 | "node_modules/aws-sign2": {
68 | "version": "0.7.0",
69 | "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
70 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
71 | "engines": {
72 | "node": "*"
73 | }
74 | },
75 | "node_modules/aws4": {
76 | "version": "1.11.0",
77 | "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.11.0.tgz",
78 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
79 | },
80 | "node_modules/axios": {
81 | "version": "0.27.2",
82 | "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
83 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
84 | "dependencies": {
85 | "follow-redirects": "^1.14.9",
86 | "form-data": "^4.0.0"
87 | }
88 | },
89 | "node_modules/bcrypt-pbkdf": {
90 | "version": "1.0.2",
91 | "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
92 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
93 | "dependencies": {
94 | "tweetnacl": "^0.14.3"
95 | }
96 | },
97 | "node_modules/body-parser": {
98 | "version": "1.20.0",
99 | "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz",
100 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
101 | "dependencies": {
102 | "bytes": "3.1.2",
103 | "content-type": "~1.0.4",
104 | "debug": "2.6.9",
105 | "depd": "2.0.0",
106 | "destroy": "1.2.0",
107 | "http-errors": "2.0.0",
108 | "iconv-lite": "0.4.24",
109 | "on-finished": "2.4.1",
110 | "qs": "6.10.3",
111 | "raw-body": "2.5.1",
112 | "type-is": "~1.6.18",
113 | "unpipe": "1.0.0"
114 | },
115 | "engines": {
116 | "node": ">= 0.8",
117 | "npm": "1.2.8000 || >= 1.4.16"
118 | }
119 | },
120 | "node_modules/bytes": {
121 | "version": "3.1.2",
122 | "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
123 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
124 | "engines": {
125 | "node": ">= 0.8"
126 | }
127 | },
128 | "node_modules/call-bind": {
129 | "version": "1.0.2",
130 | "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
131 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
132 | "dependencies": {
133 | "function-bind": "^1.1.1",
134 | "get-intrinsic": "^1.0.2"
135 | }
136 | },
137 | "node_modules/caseless": {
138 | "version": "0.12.0",
139 | "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
140 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
141 | },
142 | "node_modules/combined-stream": {
143 | "version": "1.0.8",
144 | "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
145 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
146 | "dependencies": {
147 | "delayed-stream": "~1.0.0"
148 | },
149 | "engines": {
150 | "node": ">= 0.8"
151 | }
152 | },
153 | "node_modules/content-disposition": {
154 | "version": "0.5.4",
155 | "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
156 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
157 | "dependencies": {
158 | "safe-buffer": "5.2.1"
159 | },
160 | "engines": {
161 | "node": ">= 0.6"
162 | }
163 | },
164 | "node_modules/content-type": {
165 | "version": "1.0.4",
166 | "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz",
167 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
168 | "engines": {
169 | "node": ">= 0.6"
170 | }
171 | },
172 | "node_modules/cookie": {
173 | "version": "0.5.0",
174 | "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz",
175 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
176 | "engines": {
177 | "node": ">= 0.6"
178 | }
179 | },
180 | "node_modules/cookie-signature": {
181 | "version": "1.0.6",
182 | "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
183 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
184 | },
185 | "node_modules/core-util-is": {
186 | "version": "1.0.2",
187 | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
188 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
189 | },
190 | "node_modules/dashdash": {
191 | "version": "1.14.1",
192 | "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
193 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
194 | "dependencies": {
195 | "assert-plus": "^1.0.0"
196 | },
197 | "engines": {
198 | "node": ">=0.10"
199 | }
200 | },
201 | "node_modules/debug": {
202 | "version": "2.6.9",
203 | "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
204 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
205 | "dependencies": {
206 | "ms": "2.0.0"
207 | }
208 | },
209 | "node_modules/delayed-stream": {
210 | "version": "1.0.0",
211 | "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
212 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
213 | "engines": {
214 | "node": ">=0.4.0"
215 | }
216 | },
217 | "node_modules/depd": {
218 | "version": "2.0.0",
219 | "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
220 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
221 | "engines": {
222 | "node": ">= 0.8"
223 | }
224 | },
225 | "node_modules/destroy": {
226 | "version": "1.2.0",
227 | "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
228 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
229 | "engines": {
230 | "node": ">= 0.8",
231 | "npm": "1.2.8000 || >= 1.4.16"
232 | }
233 | },
234 | "node_modules/ecc-jsbn": {
235 | "version": "0.1.2",
236 | "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
237 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
238 | "dependencies": {
239 | "jsbn": "~0.1.0",
240 | "safer-buffer": "^2.1.0"
241 | }
242 | },
243 | "node_modules/ee-first": {
244 | "version": "1.1.1",
245 | "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
246 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
247 | },
248 | "node_modules/encodeurl": {
249 | "version": "1.0.2",
250 | "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
251 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
252 | "engines": {
253 | "node": ">= 0.8"
254 | }
255 | },
256 | "node_modules/escape-html": {
257 | "version": "1.0.3",
258 | "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
259 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
260 | },
261 | "node_modules/etag": {
262 | "version": "1.8.1",
263 | "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
264 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
265 | "engines": {
266 | "node": ">= 0.6"
267 | }
268 | },
269 | "node_modules/express": {
270 | "version": "4.18.1",
271 | "resolved": "https://registry.npmmirror.com/express/-/express-4.18.1.tgz",
272 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
273 | "dependencies": {
274 | "accepts": "~1.3.8",
275 | "array-flatten": "1.1.1",
276 | "body-parser": "1.20.0",
277 | "content-disposition": "0.5.4",
278 | "content-type": "~1.0.4",
279 | "cookie": "0.5.0",
280 | "cookie-signature": "1.0.6",
281 | "debug": "2.6.9",
282 | "depd": "2.0.0",
283 | "encodeurl": "~1.0.2",
284 | "escape-html": "~1.0.3",
285 | "etag": "~1.8.1",
286 | "finalhandler": "1.2.0",
287 | "fresh": "0.5.2",
288 | "http-errors": "2.0.0",
289 | "merge-descriptors": "1.0.1",
290 | "methods": "~1.1.2",
291 | "on-finished": "2.4.1",
292 | "parseurl": "~1.3.3",
293 | "path-to-regexp": "0.1.7",
294 | "proxy-addr": "~2.0.7",
295 | "qs": "6.10.3",
296 | "range-parser": "~1.2.1",
297 | "safe-buffer": "5.2.1",
298 | "send": "0.18.0",
299 | "serve-static": "1.15.0",
300 | "setprototypeof": "1.2.0",
301 | "statuses": "2.0.1",
302 | "type-is": "~1.6.18",
303 | "utils-merge": "1.0.1",
304 | "vary": "~1.1.2"
305 | },
306 | "engines": {
307 | "node": ">= 0.10.0"
308 | }
309 | },
310 | "node_modules/extend": {
311 | "version": "3.0.2",
312 | "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
313 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
314 | },
315 | "node_modules/extsprintf": {
316 | "version": "1.3.0",
317 | "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
318 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
319 | "engines": [
320 | "node >=0.6.0"
321 | ]
322 | },
323 | "node_modules/fast-deep-equal": {
324 | "version": "3.1.3",
325 | "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
326 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
327 | },
328 | "node_modules/fast-json-stable-stringify": {
329 | "version": "2.1.0",
330 | "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
331 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
332 | },
333 | "node_modules/finalhandler": {
334 | "version": "1.2.0",
335 | "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
336 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
337 | "dependencies": {
338 | "debug": "2.6.9",
339 | "encodeurl": "~1.0.2",
340 | "escape-html": "~1.0.3",
341 | "on-finished": "2.4.1",
342 | "parseurl": "~1.3.3",
343 | "statuses": "2.0.1",
344 | "unpipe": "~1.0.0"
345 | },
346 | "engines": {
347 | "node": ">= 0.8"
348 | }
349 | },
350 | "node_modules/follow-redirects": {
351 | "version": "1.15.0",
352 | "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.0.tgz",
353 | "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==",
354 | "engines": {
355 | "node": ">=4.0"
356 | },
357 | "peerDependenciesMeta": {
358 | "debug": {
359 | "optional": true
360 | }
361 | }
362 | },
363 | "node_modules/forever-agent": {
364 | "version": "0.6.1",
365 | "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
366 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
367 | "engines": {
368 | "node": "*"
369 | }
370 | },
371 | "node_modules/form-data": {
372 | "version": "4.0.0",
373 | "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
374 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
375 | "dependencies": {
376 | "asynckit": "^0.4.0",
377 | "combined-stream": "^1.0.8",
378 | "mime-types": "^2.1.12"
379 | },
380 | "engines": {
381 | "node": ">= 6"
382 | }
383 | },
384 | "node_modules/forwarded": {
385 | "version": "0.2.0",
386 | "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
387 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
388 | "engines": {
389 | "node": ">= 0.6"
390 | }
391 | },
392 | "node_modules/fresh": {
393 | "version": "0.5.2",
394 | "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
395 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
396 | "engines": {
397 | "node": ">= 0.6"
398 | }
399 | },
400 | "node_modules/function-bind": {
401 | "version": "1.1.1",
402 | "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
403 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
404 | },
405 | "node_modules/get-intrinsic": {
406 | "version": "1.1.1",
407 | "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
408 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
409 | "dependencies": {
410 | "function-bind": "^1.1.1",
411 | "has": "^1.0.3",
412 | "has-symbols": "^1.0.1"
413 | }
414 | },
415 | "node_modules/getpass": {
416 | "version": "0.1.7",
417 | "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
418 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
419 | "dependencies": {
420 | "assert-plus": "^1.0.0"
421 | }
422 | },
423 | "node_modules/har-schema": {
424 | "version": "2.0.0",
425 | "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz",
426 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
427 | "engines": {
428 | "node": ">=4"
429 | }
430 | },
431 | "node_modules/har-validator": {
432 | "version": "5.1.5",
433 | "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz",
434 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
435 | "deprecated": "this library is no longer supported",
436 | "dependencies": {
437 | "ajv": "^6.12.3",
438 | "har-schema": "^2.0.0"
439 | },
440 | "engines": {
441 | "node": ">=6"
442 | }
443 | },
444 | "node_modules/has": {
445 | "version": "1.0.3",
446 | "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
447 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
448 | "dependencies": {
449 | "function-bind": "^1.1.1"
450 | },
451 | "engines": {
452 | "node": ">= 0.4.0"
453 | }
454 | },
455 | "node_modules/has-symbols": {
456 | "version": "1.0.3",
457 | "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
458 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
459 | "engines": {
460 | "node": ">= 0.4"
461 | }
462 | },
463 | "node_modules/http-errors": {
464 | "version": "2.0.0",
465 | "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
466 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
467 | "dependencies": {
468 | "depd": "2.0.0",
469 | "inherits": "2.0.4",
470 | "setprototypeof": "1.2.0",
471 | "statuses": "2.0.1",
472 | "toidentifier": "1.0.1"
473 | },
474 | "engines": {
475 | "node": ">= 0.8"
476 | }
477 | },
478 | "node_modules/http-signature": {
479 | "version": "1.2.0",
480 | "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz",
481 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
482 | "dependencies": {
483 | "assert-plus": "^1.0.0",
484 | "jsprim": "^1.2.2",
485 | "sshpk": "^1.7.0"
486 | },
487 | "engines": {
488 | "node": ">=0.8",
489 | "npm": ">=1.3.7"
490 | }
491 | },
492 | "node_modules/iconv-lite": {
493 | "version": "0.4.24",
494 | "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
495 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
496 | "dependencies": {
497 | "safer-buffer": ">= 2.1.2 < 3"
498 | },
499 | "engines": {
500 | "node": ">=0.10.0"
501 | }
502 | },
503 | "node_modules/inherits": {
504 | "version": "2.0.4",
505 | "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
506 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
507 | },
508 | "node_modules/ipaddr.js": {
509 | "version": "1.9.1",
510 | "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
511 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
512 | "engines": {
513 | "node": ">= 0.10"
514 | }
515 | },
516 | "node_modules/is-typedarray": {
517 | "version": "1.0.0",
518 | "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
519 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
520 | },
521 | "node_modules/isstream": {
522 | "version": "0.1.2",
523 | "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
524 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
525 | },
526 | "node_modules/jsbn": {
527 | "version": "0.1.1",
528 | "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
529 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
530 | },
531 | "node_modules/json-schema": {
532 | "version": "0.4.0",
533 | "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
534 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
535 | },
536 | "node_modules/json-schema-traverse": {
537 | "version": "0.4.1",
538 | "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
539 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
540 | },
541 | "node_modules/json-stringify-safe": {
542 | "version": "5.0.1",
543 | "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
544 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
545 | },
546 | "node_modules/jsprim": {
547 | "version": "1.4.2",
548 | "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz",
549 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
550 | "dependencies": {
551 | "assert-plus": "1.0.0",
552 | "extsprintf": "1.3.0",
553 | "json-schema": "0.4.0",
554 | "verror": "1.10.0"
555 | },
556 | "engines": {
557 | "node": ">=0.6.0"
558 | }
559 | },
560 | "node_modules/media-typer": {
561 | "version": "0.3.0",
562 | "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
563 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
564 | "engines": {
565 | "node": ">= 0.6"
566 | }
567 | },
568 | "node_modules/merge-descriptors": {
569 | "version": "1.0.1",
570 | "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
571 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
572 | },
573 | "node_modules/methods": {
574 | "version": "1.1.2",
575 | "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
576 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
577 | "engines": {
578 | "node": ">= 0.6"
579 | }
580 | },
581 | "node_modules/mime": {
582 | "version": "1.6.0",
583 | "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
584 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
585 | "bin": {
586 | "mime": "cli.js"
587 | },
588 | "engines": {
589 | "node": ">=4"
590 | }
591 | },
592 | "node_modules/mime-db": {
593 | "version": "1.52.0",
594 | "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
595 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
596 | "engines": {
597 | "node": ">= 0.6"
598 | }
599 | },
600 | "node_modules/mime-types": {
601 | "version": "2.1.35",
602 | "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
603 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
604 | "dependencies": {
605 | "mime-db": "1.52.0"
606 | },
607 | "engines": {
608 | "node": ">= 0.6"
609 | }
610 | },
611 | "node_modules/ms": {
612 | "version": "2.0.0",
613 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
614 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
615 | },
616 | "node_modules/negotiator": {
617 | "version": "0.6.3",
618 | "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
619 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
620 | "engines": {
621 | "node": ">= 0.6"
622 | }
623 | },
624 | "node_modules/oauth-sign": {
625 | "version": "0.9.0",
626 | "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz",
627 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
628 | "engines": {
629 | "node": "*"
630 | }
631 | },
632 | "node_modules/object-inspect": {
633 | "version": "1.12.0",
634 | "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.0.tgz",
635 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
636 | },
637 | "node_modules/on-finished": {
638 | "version": "2.4.1",
639 | "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
640 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
641 | "dependencies": {
642 | "ee-first": "1.1.1"
643 | },
644 | "engines": {
645 | "node": ">= 0.8"
646 | }
647 | },
648 | "node_modules/parseurl": {
649 | "version": "1.3.3",
650 | "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
651 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
652 | "engines": {
653 | "node": ">= 0.8"
654 | }
655 | },
656 | "node_modules/path-to-regexp": {
657 | "version": "0.1.7",
658 | "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
659 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
660 | },
661 | "node_modules/performance-now": {
662 | "version": "2.1.0",
663 | "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
664 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
665 | },
666 | "node_modules/proxy-addr": {
667 | "version": "2.0.7",
668 | "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
669 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
670 | "dependencies": {
671 | "forwarded": "0.2.0",
672 | "ipaddr.js": "1.9.1"
673 | },
674 | "engines": {
675 | "node": ">= 0.10"
676 | }
677 | },
678 | "node_modules/psl": {
679 | "version": "1.8.0",
680 | "resolved": "https://registry.npmmirror.com/psl/-/psl-1.8.0.tgz",
681 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
682 | },
683 | "node_modules/punycode": {
684 | "version": "2.1.1",
685 | "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz",
686 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
687 | "engines": {
688 | "node": ">=6"
689 | }
690 | },
691 | "node_modules/qs": {
692 | "version": "6.10.3",
693 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz",
694 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
695 | "dependencies": {
696 | "side-channel": "^1.0.4"
697 | },
698 | "engines": {
699 | "node": ">=0.6"
700 | }
701 | },
702 | "node_modules/range-parser": {
703 | "version": "1.2.1",
704 | "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
705 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
706 | "engines": {
707 | "node": ">= 0.6"
708 | }
709 | },
710 | "node_modules/raw-body": {
711 | "version": "2.5.1",
712 | "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
713 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
714 | "dependencies": {
715 | "bytes": "3.1.2",
716 | "http-errors": "2.0.0",
717 | "iconv-lite": "0.4.24",
718 | "unpipe": "1.0.0"
719 | },
720 | "engines": {
721 | "node": ">= 0.8"
722 | }
723 | },
724 | "node_modules/request": {
725 | "version": "2.88.2",
726 | "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
727 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
728 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
729 | "dependencies": {
730 | "aws-sign2": "~0.7.0",
731 | "aws4": "^1.8.0",
732 | "caseless": "~0.12.0",
733 | "combined-stream": "~1.0.6",
734 | "extend": "~3.0.2",
735 | "forever-agent": "~0.6.1",
736 | "form-data": "~2.3.2",
737 | "har-validator": "~5.1.3",
738 | "http-signature": "~1.2.0",
739 | "is-typedarray": "~1.0.0",
740 | "isstream": "~0.1.2",
741 | "json-stringify-safe": "~5.0.1",
742 | "mime-types": "~2.1.19",
743 | "oauth-sign": "~0.9.0",
744 | "performance-now": "^2.1.0",
745 | "qs": "~6.5.2",
746 | "safe-buffer": "^5.1.2",
747 | "tough-cookie": "~2.5.0",
748 | "tunnel-agent": "^0.6.0",
749 | "uuid": "^3.3.2"
750 | },
751 | "engines": {
752 | "node": ">= 6"
753 | }
754 | },
755 | "node_modules/request/node_modules/form-data": {
756 | "version": "2.3.3",
757 | "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
758 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
759 | "dependencies": {
760 | "asynckit": "^0.4.0",
761 | "combined-stream": "^1.0.6",
762 | "mime-types": "^2.1.12"
763 | },
764 | "engines": {
765 | "node": ">= 0.12"
766 | }
767 | },
768 | "node_modules/request/node_modules/qs": {
769 | "version": "6.5.3",
770 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
771 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
772 | "engines": {
773 | "node": ">=0.6"
774 | }
775 | },
776 | "node_modules/safe-buffer": {
777 | "version": "5.2.1",
778 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
779 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
780 | },
781 | "node_modules/safer-buffer": {
782 | "version": "2.1.2",
783 | "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
784 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
785 | },
786 | "node_modules/send": {
787 | "version": "0.18.0",
788 | "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
789 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
790 | "dependencies": {
791 | "debug": "2.6.9",
792 | "depd": "2.0.0",
793 | "destroy": "1.2.0",
794 | "encodeurl": "~1.0.2",
795 | "escape-html": "~1.0.3",
796 | "etag": "~1.8.1",
797 | "fresh": "0.5.2",
798 | "http-errors": "2.0.0",
799 | "mime": "1.6.0",
800 | "ms": "2.1.3",
801 | "on-finished": "2.4.1",
802 | "range-parser": "~1.2.1",
803 | "statuses": "2.0.1"
804 | },
805 | "engines": {
806 | "node": ">= 0.8.0"
807 | }
808 | },
809 | "node_modules/send/node_modules/ms": {
810 | "version": "2.1.3",
811 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
812 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
813 | },
814 | "node_modules/serve-static": {
815 | "version": "1.15.0",
816 | "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz",
817 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
818 | "dependencies": {
819 | "encodeurl": "~1.0.2",
820 | "escape-html": "~1.0.3",
821 | "parseurl": "~1.3.3",
822 | "send": "0.18.0"
823 | },
824 | "engines": {
825 | "node": ">= 0.8.0"
826 | }
827 | },
828 | "node_modules/setprototypeof": {
829 | "version": "1.2.0",
830 | "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
831 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
832 | },
833 | "node_modules/side-channel": {
834 | "version": "1.0.4",
835 | "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
836 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
837 | "dependencies": {
838 | "call-bind": "^1.0.0",
839 | "get-intrinsic": "^1.0.2",
840 | "object-inspect": "^1.9.0"
841 | }
842 | },
843 | "node_modules/sshpk": {
844 | "version": "1.17.0",
845 | "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.17.0.tgz",
846 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
847 | "dependencies": {
848 | "asn1": "~0.2.3",
849 | "assert-plus": "^1.0.0",
850 | "bcrypt-pbkdf": "^1.0.0",
851 | "dashdash": "^1.12.0",
852 | "ecc-jsbn": "~0.1.1",
853 | "getpass": "^0.1.1",
854 | "jsbn": "~0.1.0",
855 | "safer-buffer": "^2.0.2",
856 | "tweetnacl": "~0.14.0"
857 | },
858 | "bin": {
859 | "sshpk-conv": "bin/sshpk-conv",
860 | "sshpk-sign": "bin/sshpk-sign",
861 | "sshpk-verify": "bin/sshpk-verify"
862 | },
863 | "engines": {
864 | "node": ">=0.10.0"
865 | }
866 | },
867 | "node_modules/statuses": {
868 | "version": "2.0.1",
869 | "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
870 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
871 | "engines": {
872 | "node": ">= 0.8"
873 | }
874 | },
875 | "node_modules/toidentifier": {
876 | "version": "1.0.1",
877 | "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
878 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
879 | "engines": {
880 | "node": ">=0.6"
881 | }
882 | },
883 | "node_modules/tough-cookie": {
884 | "version": "2.5.0",
885 | "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz",
886 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
887 | "dependencies": {
888 | "psl": "^1.1.28",
889 | "punycode": "^2.1.1"
890 | },
891 | "engines": {
892 | "node": ">=0.8"
893 | }
894 | },
895 | "node_modules/tunnel-agent": {
896 | "version": "0.6.0",
897 | "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
898 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
899 | "dependencies": {
900 | "safe-buffer": "^5.0.1"
901 | },
902 | "engines": {
903 | "node": "*"
904 | }
905 | },
906 | "node_modules/tweetnacl": {
907 | "version": "0.14.5",
908 | "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
909 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
910 | },
911 | "node_modules/type-is": {
912 | "version": "1.6.18",
913 | "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
914 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
915 | "dependencies": {
916 | "media-typer": "0.3.0",
917 | "mime-types": "~2.1.24"
918 | },
919 | "engines": {
920 | "node": ">= 0.6"
921 | }
922 | },
923 | "node_modules/unpipe": {
924 | "version": "1.0.0",
925 | "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
926 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
927 | "engines": {
928 | "node": ">= 0.8"
929 | }
930 | },
931 | "node_modules/uri-js": {
932 | "version": "4.4.1",
933 | "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
934 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
935 | "dependencies": {
936 | "punycode": "^2.1.0"
937 | }
938 | },
939 | "node_modules/utils-merge": {
940 | "version": "1.0.1",
941 | "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
942 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
943 | "engines": {
944 | "node": ">= 0.4.0"
945 | }
946 | },
947 | "node_modules/uuid": {
948 | "version": "3.4.0",
949 | "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz",
950 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
951 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
952 | "bin": {
953 | "uuid": "bin/uuid"
954 | }
955 | },
956 | "node_modules/vary": {
957 | "version": "1.1.2",
958 | "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
959 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
960 | "engines": {
961 | "node": ">= 0.8"
962 | }
963 | },
964 | "node_modules/verror": {
965 | "version": "1.10.0",
966 | "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
967 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
968 | "engines": [
969 | "node >=0.6.0"
970 | ],
971 | "dependencies": {
972 | "assert-plus": "^1.0.0",
973 | "core-util-is": "1.0.2",
974 | "extsprintf": "^1.2.0"
975 | }
976 | }
977 | },
978 | "dependencies": {
979 | "accepts": {
980 | "version": "1.3.8",
981 | "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
982 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
983 | "requires": {
984 | "mime-types": "~2.1.34",
985 | "negotiator": "0.6.3"
986 | }
987 | },
988 | "ajv": {
989 | "version": "6.12.6",
990 | "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
991 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
992 | "requires": {
993 | "fast-deep-equal": "^3.1.1",
994 | "fast-json-stable-stringify": "^2.0.0",
995 | "json-schema-traverse": "^0.4.1",
996 | "uri-js": "^4.2.2"
997 | }
998 | },
999 | "array-flatten": {
1000 | "version": "1.1.1",
1001 | "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
1002 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
1003 | },
1004 | "asn1": {
1005 | "version": "0.2.6",
1006 | "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
1007 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
1008 | "requires": {
1009 | "safer-buffer": "~2.1.0"
1010 | }
1011 | },
1012 | "assert-plus": {
1013 | "version": "1.0.0",
1014 | "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
1015 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
1016 | },
1017 | "asynckit": {
1018 | "version": "0.4.0",
1019 | "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
1020 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
1021 | },
1022 | "aws-sign2": {
1023 | "version": "0.7.0",
1024 | "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
1025 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
1026 | },
1027 | "aws4": {
1028 | "version": "1.11.0",
1029 | "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.11.0.tgz",
1030 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
1031 | },
1032 | "axios": {
1033 | "version": "0.27.2",
1034 | "resolved": "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz",
1035 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
1036 | "requires": {
1037 | "follow-redirects": "^1.14.9",
1038 | "form-data": "^4.0.0"
1039 | }
1040 | },
1041 | "bcrypt-pbkdf": {
1042 | "version": "1.0.2",
1043 | "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1044 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
1045 | "requires": {
1046 | "tweetnacl": "^0.14.3"
1047 | }
1048 | },
1049 | "body-parser": {
1050 | "version": "1.20.0",
1051 | "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz",
1052 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
1053 | "requires": {
1054 | "bytes": "3.1.2",
1055 | "content-type": "~1.0.4",
1056 | "debug": "2.6.9",
1057 | "depd": "2.0.0",
1058 | "destroy": "1.2.0",
1059 | "http-errors": "2.0.0",
1060 | "iconv-lite": "0.4.24",
1061 | "on-finished": "2.4.1",
1062 | "qs": "6.10.3",
1063 | "raw-body": "2.5.1",
1064 | "type-is": "~1.6.18",
1065 | "unpipe": "1.0.0"
1066 | }
1067 | },
1068 | "bytes": {
1069 | "version": "3.1.2",
1070 | "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
1071 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
1072 | },
1073 | "call-bind": {
1074 | "version": "1.0.2",
1075 | "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
1076 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
1077 | "requires": {
1078 | "function-bind": "^1.1.1",
1079 | "get-intrinsic": "^1.0.2"
1080 | }
1081 | },
1082 | "caseless": {
1083 | "version": "0.12.0",
1084 | "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
1085 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
1086 | },
1087 | "combined-stream": {
1088 | "version": "1.0.8",
1089 | "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
1090 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1091 | "requires": {
1092 | "delayed-stream": "~1.0.0"
1093 | }
1094 | },
1095 | "content-disposition": {
1096 | "version": "0.5.4",
1097 | "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
1098 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
1099 | "requires": {
1100 | "safe-buffer": "5.2.1"
1101 | }
1102 | },
1103 | "content-type": {
1104 | "version": "1.0.4",
1105 | "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz",
1106 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
1107 | },
1108 | "cookie": {
1109 | "version": "0.5.0",
1110 | "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz",
1111 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
1112 | },
1113 | "cookie-signature": {
1114 | "version": "1.0.6",
1115 | "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
1116 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
1117 | },
1118 | "core-util-is": {
1119 | "version": "1.0.2",
1120 | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
1121 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
1122 | },
1123 | "dashdash": {
1124 | "version": "1.14.1",
1125 | "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
1126 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
1127 | "requires": {
1128 | "assert-plus": "^1.0.0"
1129 | }
1130 | },
1131 | "debug": {
1132 | "version": "2.6.9",
1133 | "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
1134 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1135 | "requires": {
1136 | "ms": "2.0.0"
1137 | }
1138 | },
1139 | "delayed-stream": {
1140 | "version": "1.0.0",
1141 | "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
1142 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
1143 | },
1144 | "depd": {
1145 | "version": "2.0.0",
1146 | "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
1147 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1148 | },
1149 | "destroy": {
1150 | "version": "1.2.0",
1151 | "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
1152 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
1153 | },
1154 | "ecc-jsbn": {
1155 | "version": "0.1.2",
1156 | "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
1157 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
1158 | "requires": {
1159 | "jsbn": "~0.1.0",
1160 | "safer-buffer": "^2.1.0"
1161 | }
1162 | },
1163 | "ee-first": {
1164 | "version": "1.1.1",
1165 | "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
1166 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
1167 | },
1168 | "encodeurl": {
1169 | "version": "1.0.2",
1170 | "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
1171 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
1172 | },
1173 | "escape-html": {
1174 | "version": "1.0.3",
1175 | "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
1176 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
1177 | },
1178 | "etag": {
1179 | "version": "1.8.1",
1180 | "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
1181 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
1182 | },
1183 | "express": {
1184 | "version": "4.18.1",
1185 | "resolved": "https://registry.npmmirror.com/express/-/express-4.18.1.tgz",
1186 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
1187 | "requires": {
1188 | "accepts": "~1.3.8",
1189 | "array-flatten": "1.1.1",
1190 | "body-parser": "1.20.0",
1191 | "content-disposition": "0.5.4",
1192 | "content-type": "~1.0.4",
1193 | "cookie": "0.5.0",
1194 | "cookie-signature": "1.0.6",
1195 | "debug": "2.6.9",
1196 | "depd": "2.0.0",
1197 | "encodeurl": "~1.0.2",
1198 | "escape-html": "~1.0.3",
1199 | "etag": "~1.8.1",
1200 | "finalhandler": "1.2.0",
1201 | "fresh": "0.5.2",
1202 | "http-errors": "2.0.0",
1203 | "merge-descriptors": "1.0.1",
1204 | "methods": "~1.1.2",
1205 | "on-finished": "2.4.1",
1206 | "parseurl": "~1.3.3",
1207 | "path-to-regexp": "0.1.7",
1208 | "proxy-addr": "~2.0.7",
1209 | "qs": "6.10.3",
1210 | "range-parser": "~1.2.1",
1211 | "safe-buffer": "5.2.1",
1212 | "send": "0.18.0",
1213 | "serve-static": "1.15.0",
1214 | "setprototypeof": "1.2.0",
1215 | "statuses": "2.0.1",
1216 | "type-is": "~1.6.18",
1217 | "utils-merge": "1.0.1",
1218 | "vary": "~1.1.2"
1219 | }
1220 | },
1221 | "extend": {
1222 | "version": "3.0.2",
1223 | "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
1224 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1225 | },
1226 | "extsprintf": {
1227 | "version": "1.3.0",
1228 | "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
1229 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
1230 | },
1231 | "fast-deep-equal": {
1232 | "version": "3.1.3",
1233 | "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1234 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
1235 | },
1236 | "fast-json-stable-stringify": {
1237 | "version": "2.1.0",
1238 | "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1239 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
1240 | },
1241 | "finalhandler": {
1242 | "version": "1.2.0",
1243 | "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
1244 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
1245 | "requires": {
1246 | "debug": "2.6.9",
1247 | "encodeurl": "~1.0.2",
1248 | "escape-html": "~1.0.3",
1249 | "on-finished": "2.4.1",
1250 | "parseurl": "~1.3.3",
1251 | "statuses": "2.0.1",
1252 | "unpipe": "~1.0.0"
1253 | }
1254 | },
1255 | "follow-redirects": {
1256 | "version": "1.15.0",
1257 | "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.0.tgz",
1258 | "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ=="
1259 | },
1260 | "forever-agent": {
1261 | "version": "0.6.1",
1262 | "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
1263 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
1264 | },
1265 | "form-data": {
1266 | "version": "4.0.0",
1267 | "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
1268 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1269 | "requires": {
1270 | "asynckit": "^0.4.0",
1271 | "combined-stream": "^1.0.8",
1272 | "mime-types": "^2.1.12"
1273 | }
1274 | },
1275 | "forwarded": {
1276 | "version": "0.2.0",
1277 | "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
1278 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1279 | },
1280 | "fresh": {
1281 | "version": "0.5.2",
1282 | "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
1283 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
1284 | },
1285 | "function-bind": {
1286 | "version": "1.1.1",
1287 | "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
1288 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1289 | },
1290 | "get-intrinsic": {
1291 | "version": "1.1.1",
1292 | "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
1293 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
1294 | "requires": {
1295 | "function-bind": "^1.1.1",
1296 | "has": "^1.0.3",
1297 | "has-symbols": "^1.0.1"
1298 | }
1299 | },
1300 | "getpass": {
1301 | "version": "0.1.7",
1302 | "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
1303 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
1304 | "requires": {
1305 | "assert-plus": "^1.0.0"
1306 | }
1307 | },
1308 | "har-schema": {
1309 | "version": "2.0.0",
1310 | "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz",
1311 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
1312 | },
1313 | "har-validator": {
1314 | "version": "5.1.5",
1315 | "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz",
1316 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
1317 | "requires": {
1318 | "ajv": "^6.12.3",
1319 | "har-schema": "^2.0.0"
1320 | }
1321 | },
1322 | "has": {
1323 | "version": "1.0.3",
1324 | "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
1325 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1326 | "requires": {
1327 | "function-bind": "^1.1.1"
1328 | }
1329 | },
1330 | "has-symbols": {
1331 | "version": "1.0.3",
1332 | "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
1333 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1334 | },
1335 | "http-errors": {
1336 | "version": "2.0.0",
1337 | "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
1338 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1339 | "requires": {
1340 | "depd": "2.0.0",
1341 | "inherits": "2.0.4",
1342 | "setprototypeof": "1.2.0",
1343 | "statuses": "2.0.1",
1344 | "toidentifier": "1.0.1"
1345 | }
1346 | },
1347 | "http-signature": {
1348 | "version": "1.2.0",
1349 | "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz",
1350 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
1351 | "requires": {
1352 | "assert-plus": "^1.0.0",
1353 | "jsprim": "^1.2.2",
1354 | "sshpk": "^1.7.0"
1355 | }
1356 | },
1357 | "iconv-lite": {
1358 | "version": "0.4.24",
1359 | "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
1360 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1361 | "requires": {
1362 | "safer-buffer": ">= 2.1.2 < 3"
1363 | }
1364 | },
1365 | "inherits": {
1366 | "version": "2.0.4",
1367 | "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
1368 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1369 | },
1370 | "ipaddr.js": {
1371 | "version": "1.9.1",
1372 | "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1373 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1374 | },
1375 | "is-typedarray": {
1376 | "version": "1.0.0",
1377 | "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
1378 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
1379 | },
1380 | "isstream": {
1381 | "version": "0.1.2",
1382 | "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
1383 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
1384 | },
1385 | "jsbn": {
1386 | "version": "0.1.1",
1387 | "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
1388 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
1389 | },
1390 | "json-schema": {
1391 | "version": "0.4.0",
1392 | "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
1393 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
1394 | },
1395 | "json-schema-traverse": {
1396 | "version": "0.4.1",
1397 | "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1398 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
1399 | },
1400 | "json-stringify-safe": {
1401 | "version": "5.0.1",
1402 | "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1403 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
1404 | },
1405 | "jsprim": {
1406 | "version": "1.4.2",
1407 | "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz",
1408 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
1409 | "requires": {
1410 | "assert-plus": "1.0.0",
1411 | "extsprintf": "1.3.0",
1412 | "json-schema": "0.4.0",
1413 | "verror": "1.10.0"
1414 | }
1415 | },
1416 | "media-typer": {
1417 | "version": "0.3.0",
1418 | "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
1419 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1420 | },
1421 | "merge-descriptors": {
1422 | "version": "1.0.1",
1423 | "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1424 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1425 | },
1426 | "methods": {
1427 | "version": "1.1.2",
1428 | "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
1429 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1430 | },
1431 | "mime": {
1432 | "version": "1.6.0",
1433 | "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
1434 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1435 | },
1436 | "mime-db": {
1437 | "version": "1.52.0",
1438 | "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
1439 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1440 | },
1441 | "mime-types": {
1442 | "version": "2.1.35",
1443 | "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
1444 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1445 | "requires": {
1446 | "mime-db": "1.52.0"
1447 | }
1448 | },
1449 | "ms": {
1450 | "version": "2.0.0",
1451 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
1452 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1453 | },
1454 | "negotiator": {
1455 | "version": "0.6.3",
1456 | "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
1457 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1458 | },
1459 | "oauth-sign": {
1460 | "version": "0.9.0",
1461 | "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz",
1462 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1463 | },
1464 | "object-inspect": {
1465 | "version": "1.12.0",
1466 | "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.0.tgz",
1467 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
1468 | },
1469 | "on-finished": {
1470 | "version": "2.4.1",
1471 | "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
1472 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1473 | "requires": {
1474 | "ee-first": "1.1.1"
1475 | }
1476 | },
1477 | "parseurl": {
1478 | "version": "1.3.3",
1479 | "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
1480 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1481 | },
1482 | "path-to-regexp": {
1483 | "version": "0.1.7",
1484 | "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1485 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1486 | },
1487 | "performance-now": {
1488 | "version": "2.1.0",
1489 | "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
1490 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
1491 | },
1492 | "proxy-addr": {
1493 | "version": "2.0.7",
1494 | "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
1495 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1496 | "requires": {
1497 | "forwarded": "0.2.0",
1498 | "ipaddr.js": "1.9.1"
1499 | }
1500 | },
1501 | "psl": {
1502 | "version": "1.8.0",
1503 | "resolved": "https://registry.npmmirror.com/psl/-/psl-1.8.0.tgz",
1504 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
1505 | },
1506 | "punycode": {
1507 | "version": "2.1.1",
1508 | "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz",
1509 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1510 | },
1511 | "qs": {
1512 | "version": "6.10.3",
1513 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz",
1514 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
1515 | "requires": {
1516 | "side-channel": "^1.0.4"
1517 | }
1518 | },
1519 | "range-parser": {
1520 | "version": "1.2.1",
1521 | "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
1522 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1523 | },
1524 | "raw-body": {
1525 | "version": "2.5.1",
1526 | "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
1527 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1528 | "requires": {
1529 | "bytes": "3.1.2",
1530 | "http-errors": "2.0.0",
1531 | "iconv-lite": "0.4.24",
1532 | "unpipe": "1.0.0"
1533 | }
1534 | },
1535 | "request": {
1536 | "version": "2.88.2",
1537 | "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
1538 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1539 | "requires": {
1540 | "aws-sign2": "~0.7.0",
1541 | "aws4": "^1.8.0",
1542 | "caseless": "~0.12.0",
1543 | "combined-stream": "~1.0.6",
1544 | "extend": "~3.0.2",
1545 | "forever-agent": "~0.6.1",
1546 | "form-data": "~2.3.2",
1547 | "har-validator": "~5.1.3",
1548 | "http-signature": "~1.2.0",
1549 | "is-typedarray": "~1.0.0",
1550 | "isstream": "~0.1.2",
1551 | "json-stringify-safe": "~5.0.1",
1552 | "mime-types": "~2.1.19",
1553 | "oauth-sign": "~0.9.0",
1554 | "performance-now": "^2.1.0",
1555 | "qs": "~6.5.2",
1556 | "safe-buffer": "^5.1.2",
1557 | "tough-cookie": "~2.5.0",
1558 | "tunnel-agent": "^0.6.0",
1559 | "uuid": "^3.3.2"
1560 | },
1561 | "dependencies": {
1562 | "form-data": {
1563 | "version": "2.3.3",
1564 | "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
1565 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1566 | "requires": {
1567 | "asynckit": "^0.4.0",
1568 | "combined-stream": "^1.0.6",
1569 | "mime-types": "^2.1.12"
1570 | }
1571 | },
1572 | "qs": {
1573 | "version": "6.5.3",
1574 | "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz",
1575 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
1576 | }
1577 | }
1578 | },
1579 | "safe-buffer": {
1580 | "version": "5.2.1",
1581 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
1582 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1583 | },
1584 | "safer-buffer": {
1585 | "version": "2.1.2",
1586 | "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
1587 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1588 | },
1589 | "send": {
1590 | "version": "0.18.0",
1591 | "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
1592 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1593 | "requires": {
1594 | "debug": "2.6.9",
1595 | "depd": "2.0.0",
1596 | "destroy": "1.2.0",
1597 | "encodeurl": "~1.0.2",
1598 | "escape-html": "~1.0.3",
1599 | "etag": "~1.8.1",
1600 | "fresh": "0.5.2",
1601 | "http-errors": "2.0.0",
1602 | "mime": "1.6.0",
1603 | "ms": "2.1.3",
1604 | "on-finished": "2.4.1",
1605 | "range-parser": "~1.2.1",
1606 | "statuses": "2.0.1"
1607 | },
1608 | "dependencies": {
1609 | "ms": {
1610 | "version": "2.1.3",
1611 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
1612 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1613 | }
1614 | }
1615 | },
1616 | "serve-static": {
1617 | "version": "1.15.0",
1618 | "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz",
1619 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1620 | "requires": {
1621 | "encodeurl": "~1.0.2",
1622 | "escape-html": "~1.0.3",
1623 | "parseurl": "~1.3.3",
1624 | "send": "0.18.0"
1625 | }
1626 | },
1627 | "setprototypeof": {
1628 | "version": "1.2.0",
1629 | "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
1630 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1631 | },
1632 | "side-channel": {
1633 | "version": "1.0.4",
1634 | "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
1635 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1636 | "requires": {
1637 | "call-bind": "^1.0.0",
1638 | "get-intrinsic": "^1.0.2",
1639 | "object-inspect": "^1.9.0"
1640 | }
1641 | },
1642 | "sshpk": {
1643 | "version": "1.17.0",
1644 | "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.17.0.tgz",
1645 | "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
1646 | "requires": {
1647 | "asn1": "~0.2.3",
1648 | "assert-plus": "^1.0.0",
1649 | "bcrypt-pbkdf": "^1.0.0",
1650 | "dashdash": "^1.12.0",
1651 | "ecc-jsbn": "~0.1.1",
1652 | "getpass": "^0.1.1",
1653 | "jsbn": "~0.1.0",
1654 | "safer-buffer": "^2.0.2",
1655 | "tweetnacl": "~0.14.0"
1656 | }
1657 | },
1658 | "statuses": {
1659 | "version": "2.0.1",
1660 | "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
1661 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1662 | },
1663 | "toidentifier": {
1664 | "version": "1.0.1",
1665 | "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
1666 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1667 | },
1668 | "tough-cookie": {
1669 | "version": "2.5.0",
1670 | "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz",
1671 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1672 | "requires": {
1673 | "psl": "^1.1.28",
1674 | "punycode": "^2.1.1"
1675 | }
1676 | },
1677 | "tunnel-agent": {
1678 | "version": "0.6.0",
1679 | "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1680 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
1681 | "requires": {
1682 | "safe-buffer": "^5.0.1"
1683 | }
1684 | },
1685 | "tweetnacl": {
1686 | "version": "0.14.5",
1687 | "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
1688 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
1689 | },
1690 | "type-is": {
1691 | "version": "1.6.18",
1692 | "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
1693 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1694 | "requires": {
1695 | "media-typer": "0.3.0",
1696 | "mime-types": "~2.1.24"
1697 | }
1698 | },
1699 | "unpipe": {
1700 | "version": "1.0.0",
1701 | "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
1702 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1703 | },
1704 | "uri-js": {
1705 | "version": "4.4.1",
1706 | "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
1707 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1708 | "requires": {
1709 | "punycode": "^2.1.0"
1710 | }
1711 | },
1712 | "utils-merge": {
1713 | "version": "1.0.1",
1714 | "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
1715 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1716 | },
1717 | "uuid": {
1718 | "version": "3.4.0",
1719 | "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz",
1720 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
1721 | },
1722 | "vary": {
1723 | "version": "1.1.2",
1724 | "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
1725 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1726 | },
1727 | "verror": {
1728 | "version": "1.10.0",
1729 | "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
1730 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
1731 | "requires": {
1732 | "assert-plus": "^1.0.0",
1733 | "core-util-is": "1.0.2",
1734 | "extsprintf": "^1.2.0"
1735 | }
1736 | }
1737 | }
1738 | }
1739 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "loon-gallery",
3 | "version": "0.1.0",
4 | "description": "Loon Plugin Gallery",
5 | "main": "gallery.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "Peng-YM",
10 | "license": "GPL-3.0-or-later",
11 | "dependencies": {
12 | "axios": "^0.27.2",
13 | "body-parser": "^1.20.0",
14 | "express": "^4.18.1",
15 | "request": "^2.88.2"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/data/repos.json:
--------------------------------------------------------------------------------
1 | {
2 | "Peng-YM-QuanX-master": {
3 | "user": "Peng-YM",
4 | "repo": "QuanX",
5 | "branch": "master",
6 | "avatar_url": "https://avatars.githubusercontent.com/u/21050064?v=4",
7 | "owner_url": "https://github.com/Peng-YM",
8 | "repo_description": "Scripts for QX, Loon, Surge, and ShadowRocket!",
9 | "repo_url": "https://github.com/Peng-YM/QuanX",
10 | "updated_at": "2024-10-27T17:36:48Z",
11 | "stargazers_count": 1600,
12 | "forks_count": 177
13 | },
14 | "VirgilClyne-iRingo-main": {
15 | "user": "VirgilClyne",
16 | "repo": "iRingo",
17 | "branch": "main",
18 | "avatar_url": "https://avatars.githubusercontent.com/u/2111377?v=4",
19 | "owner_url": "https://github.com/VirgilClyne",
20 | "repo_description": "解锁完整的 Apple功能和集成服务",
21 | "repo_url": "https://github.com/VirgilClyne/iRingo",
22 | "updated_at": "2024-10-27T14:12:14Z",
23 | "stargazers_count": 9430,
24 | "forks_count": 356
25 | },
26 | "Semporia-TikTok-Unlock-master": {
27 | "user": "Semporia",
28 | "repo": "TikTok-Unlock",
29 | "branch": "master",
30 | "avatar_url": "https://avatars.githubusercontent.com/u/29939899?v=4",
31 | "owner_url": "https://github.com/Semporia",
32 | "repo_description": "TikTok 無需拔卡解鎖最新支援 iPhone &iPad 、TikTok&TikTok TestFlight,地區切換 、視頻發佈 、 live 直播 、點贊 評論、私信聊天等!",
33 | "repo_url": "https://github.com/Semporia/TikTok-Unlock",
34 | "updated_at": "2024-10-27T19:42:49Z",
35 | "stargazers_count": 10980,
36 | "forks_count": 821
37 | },
38 | "blackmatrix7-ios_rule_script-master": {
39 | "user": "blackmatrix7",
40 | "repo": "ios_rule_script",
41 | "branch": "master",
42 | "avatar_url": "https://avatars.githubusercontent.com/u/27717518?v=4",
43 | "owner_url": "https://github.com/blackmatrix7",
44 | "repo_description": "分流规则、重写写规则及脚本。",
45 | "repo_url": "https://github.com/blackmatrix7/ios_rule_script",
46 | "updated_at": "2024-10-27T22:50:12Z",
47 | "stargazers_count": 18006,
48 | "forks_count": 2925
49 | },
50 | "Tartarus2014-Loon-Script-master": {
51 | "user": "Tartarus2014",
52 | "repo": "Loon-Script",
53 | "branch": "master",
54 | "avatar_url": "https://avatars.githubusercontent.com/u/39802246?v=4",
55 | "owner_url": "https://github.com/Tartarus2014",
56 | "repo_description": "Loon脚本收集",
57 | "repo_url": "https://github.com/Tartarus2014/Loon-Script",
58 | "updated_at": "2024-10-27T09:24:12Z",
59 | "stargazers_count": 1235,
60 | "forks_count": 241
61 | },
62 | "DualSubs-YouTube-main": {
63 | "user": "DualSubs",
64 | "repo": "YouTube",
65 | "branch": "main",
66 | "avatar_url": "https://avatars.githubusercontent.com/u/100578089?v=4",
67 | "owner_url": "https://github.com/DualSubs",
68 | "repo_description": "YouTube增强及双语字幕解决方案",
69 | "repo_url": "https://github.com/DualSubs/YouTube",
70 | "updated_at": "2024-10-26T10:47:40Z",
71 | "stargazers_count": 466,
72 | "forks_count": 16
73 | },
74 | "deezertidal-private-master": {
75 | "user": "deezertidal",
76 | "repo": "private",
77 | "branch": "master",
78 | "avatar_url": "https://avatars.githubusercontent.com/u/539868?v=4",
79 | "owner_url": "https://github.com/deezertidal",
80 | "repo_description": "Loon配置 脚本 插件 plugin 规则 分流 破解 解锁",
81 | "repo_url": "https://github.com/deezertidal/private",
82 | "updated_at": "2024-10-27T22:48:39Z",
83 | "stargazers_count": 545,
84 | "forks_count": 59
85 | },
86 | "chengkongyiban-Loon-main": {
87 | "user": "chengkongyiban",
88 | "repo": "Loon",
89 | "branch": "main",
90 | "avatar_url": "https://avatars.githubusercontent.com/u/48396581?v=4",
91 | "owner_url": "https://github.com/chengkongyiban",
92 | "repo_description": null,
93 | "repo_url": "https://github.com/chengkongyiban/Loon",
94 | "updated_at": "2024-06-23T20:20:11Z",
95 | "stargazers_count": 30,
96 | "forks_count": 1
97 | },
98 | "BiliUniverse-ADBlock-main": {
99 | "user": "BiliUniverse",
100 | "repo": "ADBlock",
101 | "branch": "main",
102 | "avatar_url": "https://avatars.githubusercontent.com/u/129515498?v=4",
103 | "owner_url": "https://github.com/BiliUniverse",
104 | "repo_description": "自定义去除 app 广告",
105 | "repo_url": "https://github.com/BiliUniverse/ADBlock",
106 | "updated_at": "2024-10-24T04:42:55Z",
107 | "stargazers_count": 68,
108 | "forks_count": 4
109 | },
110 | "BiliUniverse-Global-main": {
111 | "user": "BiliUniverse",
112 | "repo": "Global",
113 | "branch": "main",
114 | "avatar_url": "https://avatars.githubusercontent.com/u/129515498?v=4",
115 | "owner_url": "https://github.com/BiliUniverse",
116 | "repo_description": "自动识别番剧影视地区限制,自动切换线路至对应地区,快捷返回各区域搜索结果",
117 | "repo_url": "https://github.com/BiliUniverse/Global",
118 | "updated_at": "2024-10-21T16:45:39Z",
119 | "stargazers_count": 16,
120 | "forks_count": 2
121 | },
122 | "Guding88-Script-main": {
123 | "user": "Guding88",
124 | "repo": "Script",
125 | "branch": "main",
126 | "avatar_url": "https://avatars.githubusercontent.com/u/132737252?v=4",
127 | "owner_url": "https://github.com/Guding88",
128 | "repo_description": null,
129 | "repo_url": "https://github.com/Guding88/Script",
130 | "updated_at": "2024-10-23T03:00:56Z",
131 | "stargazers_count": 229,
132 | "forks_count": 33
133 | },
134 | "zqzess-rule_for_quantumultX-master": {
135 | "user": "zqzess",
136 | "repo": "rule_for_quantumultX",
137 | "branch": "master",
138 | "avatar_url": "https://avatars.githubusercontent.com/u/54464797?v=4",
139 | "owner_url": "https://github.com/zqzess",
140 | "repo_description": "自用Surge等代理app规则与配置,自用js脚本,爬虫每周自动更新规则",
141 | "repo_url": "https://github.com/zqzess/rule_for_quantumultX",
142 | "updated_at": "2024-10-26T14:16:15Z",
143 | "stargazers_count": 1845,
144 | "forks_count": 134
145 | },
146 | "VirgilClyne-Cloudflare-main": {
147 | "user": "VirgilClyne",
148 | "repo": "Cloudflare",
149 | "branch": "main",
150 | "avatar_url": "https://avatars.githubusercontent.com/u/2111377?v=4",
151 | "owner_url": "https://github.com/VirgilClyne",
152 | "repo_description": "Cloudflare相关插件/模块",
153 | "repo_url": "https://github.com/VirgilClyne/Cloudflare",
154 | "updated_at": "2024-10-24T09:29:09Z",
155 | "stargazers_count": 666,
156 | "forks_count": 47
157 | },
158 | "app2smile-rules-master": {
159 | "user": "app2smile",
160 | "repo": "rules",
161 | "branch": "master",
162 | "avatar_url": "https://avatars.githubusercontent.com/u/34903735?v=4",
163 | "owner_url": "https://github.com/app2smile",
164 | "repo_description": "iOS App去广告",
165 | "repo_url": "https://github.com/app2smile/rules",
166 | "updated_at": "2024-10-27T11:04:32Z",
167 | "stargazers_count": 3393,
168 | "forks_count": 216
169 | },
170 | "NobyDa-Script-master": {
171 | "user": "NobyDa",
172 | "repo": "Script",
173 | "branch": "master",
174 | "avatar_url": "https://avatars.githubusercontent.com/u/53217160?v=4",
175 | "owner_url": "https://github.com/NobyDa",
176 | "repo_description": "This project is based on the scripting capabilities of several excellent iOS proxy tools (e.g. Surge, Quantumult X)",
177 | "repo_url": "https://github.com/NobyDa/Script",
178 | "updated_at": "2024-10-27T07:24:44Z",
179 | "stargazers_count": 8169,
180 | "forks_count": 3173
181 | },
182 | "GeQ1an-Rules-master": {
183 | "user": "GeQ1an",
184 | "repo": "Rules",
185 | "branch": "master",
186 | "avatar_url": "https://avatars.githubusercontent.com/u/38187467?v=4",
187 | "owner_url": "https://github.com/GeQ1an",
188 | "repo_description": "Stick Rules -- Quantumult X / Loon / ClashX Rules \\ Quantumult back to CN Rules",
189 | "repo_url": "https://github.com/GeQ1an/Rules",
190 | "updated_at": "2024-10-24T06:30:00Z",
191 | "stargazers_count": 1001,
192 | "forks_count": 218
193 | },
194 | "chavyleung-scripts-master": {
195 | "user": "chavyleung",
196 | "repo": "scripts",
197 | "branch": "master",
198 | "avatar_url": "https://avatars.githubusercontent.com/u/29748519?v=4",
199 | "owner_url": "https://github.com/chavyleung",
200 | "repo_description": "BoxJs",
201 | "repo_url": "https://github.com/chavyleung/scripts",
202 | "updated_at": "2024-10-27T09:03:53Z",
203 | "stargazers_count": 5203,
204 | "forks_count": 1143
205 | },
206 | "VirgilClyne-GetSomeFries-main": {
207 | "user": "VirgilClyne",
208 | "repo": "GetSomeFries",
209 | "branch": "main",
210 | "avatar_url": "https://avatars.githubusercontent.com/u/2111377?v=4",
211 | "owner_url": "https://github.com/VirgilClyne",
212 | "repo_description": "个人独立作品或公共组件库",
213 | "repo_url": "https://github.com/VirgilClyne/GetSomeFries",
214 | "updated_at": "2024-10-27T12:36:04Z",
215 | "stargazers_count": 1243,
216 | "forks_count": 90
217 | },
218 | "BiliUniverse-Enhanced-main": {
219 | "user": "BiliUniverse",
220 | "repo": "Enhanced",
221 | "branch": "main",
222 | "avatar_url": "https://avatars.githubusercontent.com/u/129515498?v=4",
223 | "owner_url": "https://github.com/BiliUniverse",
224 | "repo_description": "全面自定义哔哩哔哩 App 主界面,修改首页和底栏元素的显示顺序和触发功能",
225 | "repo_url": "https://github.com/BiliUniverse/Enhanced",
226 | "updated_at": "2024-10-22T05:40:52Z",
227 | "stargazers_count": 12,
228 | "forks_count": 1
229 | },
230 | "I-am-R-E-Functional-Store-Hub-Master": {
231 | "user": "I-am-R-E",
232 | "repo": "Functional-Store-Hub",
233 | "branch": "Master",
234 | "avatar_url": "https://avatars.githubusercontent.com/u/97787451?v=4",
235 | "owner_url": "https://github.com/I-am-R-E",
236 | "repo_description": "Functional scripts, agent node, configurations for Surge, QuantumultX, Loon, Stash ,Egern , ShadowRocket and HTTPCatcher.",
237 | "repo_url": "https://github.com/I-am-R-E/Functional-Store-Hub",
238 | "updated_at": "2024-10-27T08:27:26Z",
239 | "stargazers_count": 1004,
240 | "forks_count": 71
241 | },
242 | "Peng-YM-Sub-Store-master": {
243 | "user": "Peng-YM",
244 | "repo": "Sub-Store",
245 | "branch": "master",
246 | "avatar_url": "https://avatars.githubusercontent.com/u/108168464?v=4",
247 | "owner_url": "https://github.com/sub-store-org",
248 | "repo_description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket!",
249 | "repo_url": "https://github.com/sub-store-org/Sub-Store",
250 | "updated_at": "2024-10-27T21:35:07Z",
251 | "stargazers_count": 5295,
252 | "forks_count": 581
253 | }
254 | }
--------------------------------------------------------------------------------
/loon-gallery.plugin:
--------------------------------------------------------------------------------
1 | #!name=Loon Gallery
2 | #!desc=Loon 插件仓库
3 | #!openUrl=https://🎈.com
4 | #!author=Peng-YM
5 | #!homepage=https://github.com/Peng-YM/Loon-Gallery
6 | #!icon=https://avatars.githubusercontent.com/u/38467044?v=4
7 |
8 | [MITM]
9 | hostname=xn--ck8h.com
10 |
11 | [Script]
12 |
13 | http-request https?:\/\/xn--ck8h\.com script-path=https://raw.githubusercontent.com/Peng-YM/Loon-Gallery/master/backend/gallery.js, requires-body=true, timeout=120, tag=Loon-Gallery
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "requires": true,
3 | "lockfileVersion": 1,
4 | "dependencies": {
5 | "ajv": {
6 | "version": "6.12.6",
7 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
8 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
9 | "requires": {
10 | "fast-deep-equal": "^3.1.1",
11 | "fast-json-stable-stringify": "^2.0.0",
12 | "json-schema-traverse": "^0.4.1",
13 | "uri-js": "^4.2.2"
14 | }
15 | },
16 | "asn1": {
17 | "version": "0.2.6",
18 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
19 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
20 | "requires": {
21 | "safer-buffer": "~2.1.0"
22 | }
23 | },
24 | "assert-plus": {
25 | "version": "1.0.0",
26 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
27 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
28 | },
29 | "asynckit": {
30 | "version": "0.4.0",
31 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
32 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
33 | },
34 | "aws-sign2": {
35 | "version": "0.7.0",
36 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
37 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
38 | },
39 | "aws4": {
40 | "version": "1.13.2",
41 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
42 | "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="
43 | },
44 | "bcrypt-pbkdf": {
45 | "version": "1.0.2",
46 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
47 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
48 | "requires": {
49 | "tweetnacl": "^0.14.3"
50 | }
51 | },
52 | "caseless": {
53 | "version": "0.12.0",
54 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
55 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
56 | },
57 | "combined-stream": {
58 | "version": "1.0.8",
59 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
60 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
61 | "requires": {
62 | "delayed-stream": "~1.0.0"
63 | }
64 | },
65 | "core-util-is": {
66 | "version": "1.0.2",
67 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
68 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
69 | },
70 | "dashdash": {
71 | "version": "1.14.1",
72 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
73 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
74 | "requires": {
75 | "assert-plus": "^1.0.0"
76 | }
77 | },
78 | "delayed-stream": {
79 | "version": "1.0.0",
80 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
81 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
82 | },
83 | "ecc-jsbn": {
84 | "version": "0.1.2",
85 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
86 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
87 | "requires": {
88 | "jsbn": "~0.1.0",
89 | "safer-buffer": "^2.1.0"
90 | }
91 | },
92 | "extend": {
93 | "version": "3.0.2",
94 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
95 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
96 | },
97 | "extsprintf": {
98 | "version": "1.3.0",
99 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
100 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
101 | },
102 | "fast-deep-equal": {
103 | "version": "3.1.3",
104 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
105 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
106 | },
107 | "fast-json-stable-stringify": {
108 | "version": "2.1.0",
109 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
110 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
111 | },
112 | "forever-agent": {
113 | "version": "0.6.1",
114 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
115 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
116 | },
117 | "form-data": {
118 | "version": "2.3.3",
119 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
120 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
121 | "requires": {
122 | "asynckit": "^0.4.0",
123 | "combined-stream": "^1.0.6",
124 | "mime-types": "^2.1.12"
125 | }
126 | },
127 | "getpass": {
128 | "version": "0.1.7",
129 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
130 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
131 | "requires": {
132 | "assert-plus": "^1.0.0"
133 | }
134 | },
135 | "har-schema": {
136 | "version": "2.0.0",
137 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
138 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
139 | },
140 | "har-validator": {
141 | "version": "5.1.5",
142 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
143 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
144 | "requires": {
145 | "ajv": "^6.12.3",
146 | "har-schema": "^2.0.0"
147 | }
148 | },
149 | "http-signature": {
150 | "version": "1.2.0",
151 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
152 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
153 | "requires": {
154 | "assert-plus": "^1.0.0",
155 | "jsprim": "^1.2.2",
156 | "sshpk": "^1.7.0"
157 | }
158 | },
159 | "is-typedarray": {
160 | "version": "1.0.0",
161 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
162 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
163 | },
164 | "isstream": {
165 | "version": "0.1.2",
166 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
167 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
168 | },
169 | "jsbn": {
170 | "version": "0.1.1",
171 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
172 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
173 | },
174 | "json-schema": {
175 | "version": "0.4.0",
176 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
177 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
178 | },
179 | "json-schema-traverse": {
180 | "version": "0.4.1",
181 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
182 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
183 | },
184 | "json-stringify-safe": {
185 | "version": "5.0.1",
186 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
187 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
188 | },
189 | "jsprim": {
190 | "version": "1.4.2",
191 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
192 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
193 | "requires": {
194 | "assert-plus": "1.0.0",
195 | "extsprintf": "1.3.0",
196 | "json-schema": "0.4.0",
197 | "verror": "1.10.0"
198 | }
199 | },
200 | "mime-db": {
201 | "version": "1.52.0",
202 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
203 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
204 | },
205 | "mime-types": {
206 | "version": "2.1.35",
207 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
208 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
209 | "requires": {
210 | "mime-db": "1.52.0"
211 | }
212 | },
213 | "oauth-sign": {
214 | "version": "0.9.0",
215 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
216 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
217 | },
218 | "performance-now": {
219 | "version": "2.1.0",
220 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
221 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
222 | },
223 | "psl": {
224 | "version": "1.15.0",
225 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
226 | "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
227 | "requires": {
228 | "punycode": "^2.3.1"
229 | }
230 | },
231 | "punycode": {
232 | "version": "2.3.1",
233 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
234 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
235 | },
236 | "qs": {
237 | "version": "6.5.3",
238 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
239 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
240 | },
241 | "request": {
242 | "version": "2.88.2",
243 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
244 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
245 | "requires": {
246 | "aws-sign2": "~0.7.0",
247 | "aws4": "^1.8.0",
248 | "caseless": "~0.12.0",
249 | "combined-stream": "~1.0.6",
250 | "extend": "~3.0.2",
251 | "forever-agent": "~0.6.1",
252 | "form-data": "~2.3.2",
253 | "har-validator": "~5.1.3",
254 | "http-signature": "~1.2.0",
255 | "is-typedarray": "~1.0.0",
256 | "isstream": "~0.1.2",
257 | "json-stringify-safe": "~5.0.1",
258 | "mime-types": "~2.1.19",
259 | "oauth-sign": "~0.9.0",
260 | "performance-now": "^2.1.0",
261 | "qs": "~6.5.2",
262 | "safe-buffer": "^5.1.2",
263 | "tough-cookie": "~2.5.0",
264 | "tunnel-agent": "^0.6.0",
265 | "uuid": "^3.3.2"
266 | }
267 | },
268 | "safe-buffer": {
269 | "version": "5.2.1",
270 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
271 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
272 | },
273 | "safer-buffer": {
274 | "version": "2.1.2",
275 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
276 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
277 | },
278 | "sshpk": {
279 | "version": "1.18.0",
280 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
281 | "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
282 | "requires": {
283 | "asn1": "~0.2.3",
284 | "assert-plus": "^1.0.0",
285 | "bcrypt-pbkdf": "^1.0.0",
286 | "dashdash": "^1.12.0",
287 | "ecc-jsbn": "~0.1.1",
288 | "getpass": "^0.1.1",
289 | "jsbn": "~0.1.0",
290 | "safer-buffer": "^2.0.2",
291 | "tweetnacl": "~0.14.0"
292 | }
293 | },
294 | "tough-cookie": {
295 | "version": "2.5.0",
296 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
297 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
298 | "requires": {
299 | "psl": "^1.1.28",
300 | "punycode": "^2.1.1"
301 | }
302 | },
303 | "tunnel-agent": {
304 | "version": "0.6.0",
305 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
306 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
307 | "requires": {
308 | "safe-buffer": "^5.0.1"
309 | }
310 | },
311 | "tweetnacl": {
312 | "version": "0.14.5",
313 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
314 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
315 | },
316 | "uri-js": {
317 | "version": "4.4.1",
318 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
319 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
320 | "requires": {
321 | "punycode": "^2.1.0"
322 | }
323 | },
324 | "uuid": {
325 | "version": "3.4.0",
326 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
327 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
328 | },
329 | "verror": {
330 | "version": "1.10.0",
331 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
332 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
333 | "requires": {
334 | "assert-plus": "^1.0.0",
335 | "core-util-is": "1.0.2",
336 | "extsprintf": "^1.2.0"
337 | }
338 | }
339 | }
340 | }
341 |
--------------------------------------------------------------------------------
/plugin-sources.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "user": "Semporia",
4 | "repo": "TikTok-Unlock",
5 | "branch": "master",
6 | "paths": ["Loon"]
7 | },
8 | {
9 | "user": "chavyleung",
10 | "repo": "scripts",
11 | "branch": "master"
12 | },
13 | {
14 | "user": "Peng-YM",
15 | "repo": "Sub-Store",
16 | "branch": "master"
17 | },
18 | {
19 | "user": "Peng-YM",
20 | "repo": "QuanX",
21 | "branch": "master"
22 | },
23 | {
24 | "user": "VirgilClyne",
25 | "repo": "iRingo",
26 | "branch": "main",
27 | "paths": ["plugin"]
28 | },
29 | {
30 | "user": "VirgilClyne",
31 | "repo": "GetSomeFries",
32 | "branch": "main",
33 | "paths": ["plugin"]
34 | },
35 | {
36 | "user": "VirgilClyne",
37 | "repo": "Cloudflare",
38 | "branch": "main",
39 | "paths": ["modules"]
40 | },
41 | {
42 | "user": "DualSubs",
43 | "repo": "YouTube",
44 | "branch": "main",
45 | "paths": ["modules"]
46 | },
47 | {
48 | "user": "BiliUniverse",
49 | "repo": "Enhanced",
50 | "branch": "main",
51 | "paths": ["modules"]
52 | },
53 | {
54 | "user": "BiliUniverse",
55 | "repo": "Global",
56 | "branch": "main",
57 | "paths": ["modules"]
58 | },
59 | {
60 | "user": "BiliUniverse",
61 | "repo": "ADBlock",
62 | "branch": "main",
63 | "paths": ["modules"]
64 | },
65 | {
66 | "user": "blackmatrix7",
67 | "repo": "ios_rule_script",
68 | "branch": "master",
69 | "paths": ["rewrite/Loon"]
70 | },
71 | {
72 | "user": "Tartarus2014",
73 | "repo": "Loon-Script",
74 | "branch": "master"
75 | },
76 | {
77 | "user": "NobyDa",
78 | "repo": "Script",
79 | "branch": "master"
80 | },
81 | {
82 | "user": "app2smile",
83 | "repo": "rules",
84 | "branch": "master"
85 | },
86 | {
87 | "user": "zqzess",
88 | "repo": "rule_for_quantumultX",
89 | "branch": "master"
90 | },
91 | {
92 | "user": "GeQ1an",
93 | "repo": "Rules",
94 | "branch": "master",
95 | "paths": ["Loon"]
96 | },
97 | {
98 | "user": "deezertidal",
99 | "repo": "private",
100 | "branch": "master",
101 | "paths": ["plugallery"]
102 | },
103 | {
104 | "user": "I-am-R-E",
105 | "repo": "Functional-Store-Hub",
106 | "branch": "Master"
107 | },
108 | {
109 | "user": "chengkongyiban",
110 | "repo": "Loon",
111 | "branch": "main",
112 | "paths": ["Loon-Gallery"]
113 | },
114 | {
115 | "user": "Guding88",
116 | "repo": "Script",
117 | "branch": "main"
118 | }
119 | ]
120 |
--------------------------------------------------------------------------------
/update-sources.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 |
3 | const $http = HTTP();
4 |
5 | const GITHUB_ACCESS_TOKEN = process.argv[2];
6 |
7 | const PLUGIN_DATA_PATH = "./data/plugins.json";
8 | const SOURCE_REPO_DATA_PATH = "./data/repos.json";
9 | const SOURCE_PATH = "plugin-sources.json";
10 |
11 | const sources = readJSON(SOURCE_PATH);
12 | const allPlugins = {};
13 | const allRepos = {};
14 |
15 | ; (async () => {
16 | const tasks = sources.map(async ({ user, repo, branch, paths }) => {
17 | const id = `${user}-${repo}-${branch}`;
18 |
19 | const repoInfo = {
20 | user, repo, branch,
21 | ...await fetchRepoInfo(user, repo),
22 | };
23 | allRepos[id] = repoInfo;
24 |
25 | const plugins = await fetchPlugins(user, repo, branch, paths);
26 | allPlugins[id] = plugins;
27 | });
28 |
29 | await Promise.all(tasks);
30 |
31 | writeJSON(allPlugins, PLUGIN_DATA_PATH);
32 | writeJSON(allRepos, SOURCE_REPO_DATA_PATH);
33 | })();
34 |
35 | function writeJSON(data, fpath) {
36 | fs.writeFileSync(
37 | fpath,
38 | JSON.stringify(data, null, 2),
39 | { encoding: "utf8", flag: "w" },
40 | (err) => console.log(err)
41 | );
42 | }
43 |
44 | function readJSON(fpath) {
45 | if (!fs.existsSync(fpath)) {
46 | return null;
47 | }
48 | return JSON.parse(fs.readFileSync(fpath, "utf8"));
49 | }
50 |
51 | /**
52 | * Fetch the information of a GitHub repository
53 | * @param {String} user Username
54 | * @param {String} repo Repository Name
55 | */
56 | async function fetchRepoInfo(user, repo) {
57 | const BASE_URL = "https://api.github.com";
58 | try {
59 | const response = await $http.get({
60 | url: `${BASE_URL}/repos/${user}/${repo}`,
61 | headers: {
62 | Authorization: `token ${GITHUB_ACCESS_TOKEN}`,
63 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36",
64 | }
65 | }).then(resp => JSON.parse(resp.body));
66 | const { description: repo_description, owner, html_url: repo_url, updated_at, stargazers_count, forks_count } = response;
67 | const { avatar_url: avatar_url, html_url: owner_url } = owner;
68 | return {
69 | avatar_url, owner_url,
70 | repo_description, repo_url, updated_at, stargazers_count, forks_count
71 | }
72 | } catch (err) {
73 | throw new Error(`Error fetching repository info for ${user}/${repo}`);
74 | }
75 | }
76 |
77 | /**
78 | * Fetch Loon plugins from a GitHub repository
79 | * @param {String} user Username
80 | * @param {String} repo Repository Name
81 | * @param {String} branch Branch
82 | */
83 | async function fetchPlugins(user, repo, branch, paths = [""]) {
84 | const BASE_URL = "https://api.github.com";
85 | console.log(`Fetching plugins from GitHub repo: ${user}/${repo}/${branch}...`);
86 |
87 | const plugins = [];
88 | async function fetch(path) {
89 | // walk through the repository recursively
90 | try {
91 | // see https://docs.github.com/cn/rest/repos/contents#get-contents
92 | const data = await $http.get({
93 | url: `${BASE_URL}/repos/${user}/${repo}/contents/${encodeURIComponent(path)}?ref=${branch}`,
94 | headers: {
95 | Authorization: `token ${GITHUB_ACCESS_TOKEN}`,
96 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36",
97 | }
98 | }).then(resp => JSON.parse(resp.body));
99 | const next = [];
100 | data.forEach(async item => {
101 | if (item.type === "dir") {
102 | next.push(fetch(item.path));
103 | }
104 | if (item.name.endsWith(".plugin")) {
105 | fetchPluginMeta(item.download_url)
106 | .then(plugin => plugins.push(plugin))
107 | .catch(err => {
108 | $.error(`Failed to fetch plugin: ${item.download_url}, reason: ${err}`);
109 | });
110 | }
111 | });
112 | await Promise.all(next);
113 | } catch (err) {
114 | throw new Error(`Error fetching plugins from repository: ${user}/${repo}/${branch}, reason: ${err}`);
115 | }
116 | }
117 |
118 | await Promise.all(paths.map(async p => fetch(p)));
119 |
120 | return plugins;
121 | }
122 |
123 | /**
124 | * Fetch the metadata of a plugin
125 | * @param {String} pluginURL
126 | */
127 | async function fetchPluginMeta(pluginURL) {
128 | try {
129 | if (!pluginURL.endsWith('plugin')) throw new Error('Invalid URL!');
130 |
131 | const data = await $http.get({
132 | url: pluginURL,
133 | headers: {
134 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36",
135 | }
136 | }).then(resp => resp.body);
137 |
138 | // some plugins do not have a name, use the file name instead
139 | const filename = decodeURIComponent(/[^/]*$/.exec(pluginURL)[0]);
140 |
141 | const metadata = {};
142 | data.split("\n")
143 | .filter(line => line.startsWith("#!"))
144 | .forEach(line => {
145 | line = line.trim();
146 | const matches = /^#!(\w+)=(.*)$/.exec(line);
147 | if (matches) {
148 | const key = matches[1].trim();
149 | const value = matches[2].trim();
150 | metadata[key] = value;
151 | }
152 | });
153 |
154 | return {
155 | url: pluginURL,
156 | name: metadata.name || filename,
157 | description: metadata.desc,
158 | icon: metadata.icon,
159 | open_url: metadata.openUrl,
160 | homepage: metadata.homepage,
161 | manual: metadata.manual,
162 | }
163 | } catch (e) {
164 | throw new Error(`Error fetching plugin info from ${pluginURL}, reason: ${e}`);
165 | }
166 | }
167 |
168 | function ENV() {
169 | const isQX = typeof $task !== "undefined";
170 | const isLoon = typeof $loon !== "undefined";
171 | const isSurge = typeof $httpClient !== "undefined" && !isLoon;
172 | const isJSBox = typeof require == "function" && typeof $jsbox != "undefined";
173 | const isNode = typeof require == "function" && !isJSBox;
174 | const isRequest = typeof $request !== "undefined";
175 | const isScriptable = typeof importModule !== "undefined";
176 | return { isQX, isLoon, isSurge, isNode, isJSBox, isRequest, isScriptable };
177 | }
178 |
179 | function HTTP(defaultOptions = { baseURL: "" }) {
180 | const { isQX, isLoon, isSurge, isScriptable, isNode } = ENV();
181 | const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"];
182 | const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;
183 |
184 | function send(method, options) {
185 | options = typeof options === "string" ? { url: options } : options;
186 | const baseURL = defaultOptions.baseURL;
187 | if (baseURL && !URL_REGEX.test(options.url || "")) {
188 | options.url = baseURL ? baseURL + options.url : options.url;
189 | }
190 | options = { ...defaultOptions, ...options };
191 | const timeout = options.timeout;
192 | const events = {
193 | ...{
194 | onRequest: () => {
195 | },
196 | onResponse: (resp) => resp,
197 | onTimeout: () => {
198 | },
199 | },
200 | ...options.events,
201 | };
202 |
203 | events.onRequest(method, options);
204 |
205 | let worker;
206 | if (isQX) {
207 | worker = $task.fetch({
208 | method,
209 | url: options.url,
210 | headers: options.headers,
211 | body: options.body,
212 | });
213 | } else if (isLoon || isSurge || isNode) {
214 | worker = new Promise((resolve, reject) => {
215 | const request = isNode ? require("request") : $httpClient;
216 | request[method.toLowerCase()](options, (err, response, body) => {
217 | if (err) reject(err);
218 | else
219 | resolve({
220 | statusCode: response.status || response.statusCode,
221 | headers: response.headers,
222 | body,
223 | });
224 | });
225 | });
226 | } else if (isScriptable) {
227 | const request = new Request(options.url);
228 | request.method = method;
229 | request.headers = options.headers;
230 | request.body = options.body;
231 | worker = new Promise((resolve, reject) => {
232 | request
233 | .loadString()
234 | .then((body) => {
235 | resolve({
236 | statusCode: request.response.statusCode,
237 | headers: request.response.headers,
238 | body,
239 | });
240 | })
241 | .catch((err) => reject(err));
242 | });
243 | }
244 |
245 | let timeoutid;
246 | const timer = timeout
247 | ? new Promise((_, reject) => {
248 | timeoutid = setTimeout(() => {
249 | events.onTimeout();
250 | return reject(
251 | `${method} URL: ${options.url} exceeds the timeout ${timeout} ms`
252 | );
253 | }, timeout);
254 | })
255 | : null;
256 |
257 | return (timer
258 | ? Promise.race([timer, worker]).then((res) => {
259 | clearTimeout(timeoutid);
260 | return res;
261 | })
262 | : worker
263 | ).then((resp) => events.onResponse(resp));
264 | }
265 |
266 | const http = {};
267 | methods.forEach(
268 | (method) =>
269 | (http[method.toLowerCase()] = (options) => send(method, options))
270 | );
271 | return http;
272 | }
273 |
274 | function Base64Code() {
275 | // constants
276 | const b64chars =
277 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
278 | const b64tab = (function (bin) {
279 | const t = {};
280 | let i = 0;
281 | const l = bin.length;
282 | for (; i < l; i++) t[bin.charAt(i)] = i;
283 | return t;
284 | })(b64chars);
285 | const fromCharCode = String.fromCharCode;
286 | // encoder stuff
287 | const cb_utob = function (c) {
288 | let cc;
289 | if (c.length < 2) {
290 | cc = c.charCodeAt(0);
291 | return cc < 0x80
292 | ? c
293 | : cc < 0x800
294 | ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f))
295 | : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) +
296 | fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +
297 | fromCharCode(0x80 | (cc & 0x3f));
298 | } else {
299 | cc =
300 | 0x10000 +
301 | (c.charCodeAt(0) - 0xd800) * 0x400 +
302 | (c.charCodeAt(1) - 0xdc00);
303 | return (
304 | fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) +
305 | fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) +
306 | fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +
307 | fromCharCode(0x80 | (cc & 0x3f))
308 | );
309 | }
310 | };
311 | const re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
312 | const utob = function (u) {
313 | return u.replace(re_utob, cb_utob);
314 | };
315 | const cb_encode = function (ccc) {
316 | const padlen = [0, 2, 1][ccc.length % 3],
317 | ord =
318 | (ccc.charCodeAt(0) << 16) |
319 | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) |
320 | (ccc.length > 2 ? ccc.charCodeAt(2) : 0),
321 | chars = [
322 | b64chars.charAt(ord >>> 18),
323 | b64chars.charAt((ord >>> 12) & 63),
324 | padlen >= 2 ? "=" : b64chars.charAt((ord >>> 6) & 63),
325 | padlen >= 1 ? "=" : b64chars.charAt(ord & 63),
326 | ];
327 | return chars.join("");
328 | };
329 | const btoa = function (b) {
330 | return b.replace(/[\s\S]{1,3}/g, cb_encode);
331 | };
332 | this.encode = function (u) {
333 | const isUint8Array =
334 | Object.prototype.toString.call(u) === "[object Uint8Array]";
335 | return isUint8Array ? u.toString("base64") : btoa(utob(String(u)));
336 | };
337 | const uriencode = function (u, urisafe) {
338 | return !urisafe
339 | ? _encode(u)
340 | : _encode(String(u))
341 | .replace(/[+\/]/g, function (m0) {
342 | return m0 === "+" ? "-" : "_";
343 | })
344 | .replace(/=/g, "");
345 | };
346 | const encodeURI = function (u) {
347 | return uriencode(u, true);
348 | };
349 | // decoder stuff
350 | const re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g;
351 | const cb_btou = function (cccc) {
352 | switch (cccc.length) {
353 | case 4:
354 | const cp =
355 | ((0x07 & cccc.charCodeAt(0)) << 18) |
356 | ((0x3f & cccc.charCodeAt(1)) << 12) |
357 | ((0x3f & cccc.charCodeAt(2)) << 6) |
358 | (0x3f & cccc.charCodeAt(3)),
359 | offset = cp - 0x10000;
360 | return (
361 | fromCharCode((offset >>> 10) + 0xd800) +
362 | fromCharCode((offset & 0x3ff) + 0xdc00)
363 | );
364 | case 3:
365 | return fromCharCode(
366 | ((0x0f & cccc.charCodeAt(0)) << 12) |
367 | ((0x3f & cccc.charCodeAt(1)) << 6) |
368 | (0x3f & cccc.charCodeAt(2))
369 | );
370 | default:
371 | return fromCharCode(
372 | ((0x1f & cccc.charCodeAt(0)) << 6) | (0x3f & cccc.charCodeAt(1))
373 | );
374 | }
375 | };
376 | const btou = function (b) {
377 | return b.replace(re_btou, cb_btou);
378 | };
379 | const cb_decode = function (cccc) {
380 | const len = cccc.length,
381 | padlen = len % 4,
382 | n =
383 | (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) |
384 | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) |
385 | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) |
386 | (len > 3 ? b64tab[cccc.charAt(3)] : 0),
387 | chars = [
388 | fromCharCode(n >>> 16),
389 | fromCharCode((n >>> 8) & 0xff),
390 | fromCharCode(n & 0xff),
391 | ];
392 | chars.length -= [0, 0, 2, 1][padlen];
393 | return chars.join("");
394 | };
395 | const _atob = function (a) {
396 | return a.replace(/\S{1,4}/g, cb_decode);
397 | };
398 | const atob = function (a) {
399 | return _atob(String(a).replace(/[^A-Za-z0-9\+\/]/g, ""));
400 | };
401 | const _decode = function (u) {
402 | return btou(_atob(u));
403 | };
404 | this.decode = function (a) {
405 | return _decode(
406 | String(a)
407 | .replace(/[-_]/g, function (m0) {
408 | return m0 === "-" ? "+" : "/";
409 | })
410 | .replace(/[^A-Za-z0-9\+\/]/g, "")
411 | )
412 | .replace(/>/g, ">")
413 | .replace(/</g, "<");
414 | };
415 | this.safeEncode = function (a) {
416 | return this.encode(a.replace(/\+/g, "-").replace(/\//g, "_"));
417 | };
418 | this.safeDecode = function (a) {
419 | return this.decode(a.replace(/-/g, "+").replace(/_/g, "/"));
420 | };
421 | }
422 |
--------------------------------------------------------------------------------
/web/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 |
5 |
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 | pnpm-debug.log*
15 |
16 | # Editor directories and files
17 | .idea
18 | .vscode
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
25 | .vercel
26 |
--------------------------------------------------------------------------------
/web/README.md:
--------------------------------------------------------------------------------
1 | # web
2 |
3 | ## Project setup
4 | ```
5 | npm install
6 | ```
7 |
8 | ### Compiles and hot-reloads for development
9 | ```
10 | npm run serve
11 | ```
12 |
13 | ### Compiles and minifies for production
14 | ```
15 | npm run build
16 | ```
17 |
18 | ### Lints and fixes files
19 | ```
20 | npm run lint
21 | ```
22 |
23 | ### Customize configuration
24 | See [Configuration Reference](https://cli.vuejs.org/config/).
25 |
--------------------------------------------------------------------------------
/web/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/cli-plugin-babel/preset'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/web/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "module": "esnext",
5 | "baseUrl": "./",
6 | "moduleResolution": "node",
7 | "paths": {
8 | "@/*": [
9 | "src/*"
10 | ]
11 | },
12 | "lib": [
13 | "esnext",
14 | "dom",
15 | "dom.iterable",
16 | "scripthost"
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/web/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "loon-gallery",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "serve": "vue-cli-service serve",
7 | "build": "vue-cli-service build",
8 | "lint": "vue-cli-service lint"
9 | },
10 | "dependencies": {
11 | "axios": "^0.27.2",
12 | "core-js": "^3.8.3",
13 | "vue": "^2.6.14",
14 | "vuetify": "^2.6.0"
15 | },
16 | "devDependencies": {
17 | "@babel/core": "^7.12.16",
18 | "@babel/eslint-parser": "^7.12.16",
19 | "@vue/cli-plugin-babel": "~5.0.0",
20 | "@vue/cli-plugin-eslint": "~5.0.0",
21 | "@vue/cli-service": "~5.0.0",
22 | "eslint": "^7.32.0",
23 | "eslint-plugin-vue": "^8.0.3",
24 | "sass": "~1.32.0",
25 | "sass-loader": "^10.0.0",
26 | "vue-cli-plugin-vuetify": "~2.4.8",
27 | "vue-template-compiler": "^2.6.14",
28 | "vuetify-loader": "^1.7.0"
29 | },
30 | "eslintConfig": {
31 | "root": true,
32 | "env": {
33 | "node": true
34 | },
35 | "extends": [
36 | "plugin:vue/essential",
37 | "eslint:recommended"
38 | ],
39 | "parserOptions": {
40 | "parser": "@babel/eslint-parser"
41 | },
42 | "rules": {}
43 | },
44 | "browserslist": [
45 | "> 1%",
46 | "last 2 versions",
47 | "not dead"
48 | ]
49 | }
50 |
--------------------------------------------------------------------------------
/web/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Peng-YM/Loon-Gallery/d8043afe48cd0edf1e7664871e448e91432ff651/web/public/favicon.ico
--------------------------------------------------------------------------------
/web/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | <%= htmlWebpackPlugin.options.title %>
9 |
10 |
11 |
12 |
13 |
14 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/web/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
17 |
18 |
19 | Loon 插件仓库
20 |
21 |
22 |
23 |
28 | 🌟 STAR
29 | fa-github
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
54 |
--------------------------------------------------------------------------------
/web/src/components/Gallery.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
15 |
19 |
20 |
21 |
22 |
28 | {{limitString(repos[repoId].user + "/" + repos[repoId].repo, 20)}}
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | fa-question
39 |
40 |
41 |
42 |
43 |
44 |
45 | {{plugin.homepage}}
46 |
47 |
48 |
49 |
50 |
51 |
52 | mdi-download
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | mdi-dots-vertical
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
133 |
--------------------------------------------------------------------------------
/web/src/config.js:
--------------------------------------------------------------------------------
1 | const DEBUG = process.env.NODE_ENV === 'development';
2 | const domain = process.env.DOMIAN || 'https://🎈.com';
3 | export const BACKEND_BASE = DEBUG ? `http://localhost:3000` : domain;
--------------------------------------------------------------------------------
/web/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 | import vuetify from './plugins/vuetify'
4 |
5 | Vue.config.productionTip = false
6 |
7 | new Vue({
8 | vuetify,
9 | render: h => h(App)
10 | }).$mount('#app')
11 |
--------------------------------------------------------------------------------
/web/src/plugins/vuetify.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuetify from 'vuetify/lib/framework';
3 |
4 | Vue.use(Vuetify);
5 |
6 | export default new Vuetify({
7 | });
8 |
--------------------------------------------------------------------------------
/web/src/utils/index.js:
--------------------------------------------------------------------------------
1 | import Axios from 'axios';
2 | import {BACKEND_BASE} from "@/config";
3 |
4 | export const axios = Axios.create({
5 | baseURL: `${BACKEND_BASE}/api/gallery`,
6 | timeout: 10000
7 | });
--------------------------------------------------------------------------------
/web/vue.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require('@vue/cli-service')
2 | module.exports = defineConfig({
3 | transpileDependencies: [
4 | 'vuetify'
5 | ]
6 | })
7 |
--------------------------------------------------------------------------------