├── .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 | [![Build](https://github.com/Peng-YM/Loon-Gallery/actions/workflows/main.yml/badge.svg)](https://github.com/Peng-YM/Loon-Gallery/actions/workflows/main.yml) 4 | 5 | Loon 插件仓库,提供一键式安装 Loon 插件。 6 | 7 |

8 | drawing 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 | 38 | 39 | 54 | -------------------------------------------------------------------------------- /web/src/components/Gallery.vue: -------------------------------------------------------------------------------- 1 | 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 | --------------------------------------------------------------------------------