├── .gitignore ├── LICENSE ├── README.md ├── bin └── index.js ├── package.json ├── src ├── client │ ├── client.ts │ └── tsconfig.json └── node │ ├── init │ ├── index.ts │ └── template │ │ ├── App.svelte │ │ ├── index.html │ │ └── package.json │ ├── preprocessors │ ├── index.ts │ ├── transformers │ │ ├── coffeescript.ts │ │ ├── less.ts │ │ ├── sass.ts │ │ ├── stylus.ts │ │ └── typescript.ts │ ├── types.ts │ └── utils │ │ ├── importAny.ts │ │ ├── installHelper.ts │ │ ├── loadLib.ts │ │ ├── or.ts │ │ └── resolvedFrom.ts │ ├── serve │ ├── hmrPlugin.ts │ ├── htmlPlugin.ts │ ├── index.ts │ ├── modulePlugin.ts │ ├── servePlugin.ts │ ├── sveltePlugin.ts │ └── wss.ts │ ├── tsconfig.json │ └── utils │ └── execute.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2020 Tan Li Hau 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # svelte-serve 2 | 3 | Create Svelte app with no configuration. 4 | 5 | ## Quick Overview 6 | 7 | ### Init a Svelte app 8 | 9 | ```sh 10 | npx svelte-serve init app-name 11 | ``` 12 | 13 | ### Init a Svelte app from [Svelte REPL](https://svelte.dev/repl) 14 | 15 | ```sh 16 | npx svelte-serve init https://svelte.dev/repl/hello-world?version=3.22.2 17 | ``` 18 | 19 | ### Serve Svelte app from a folder 20 | 21 | ```sh 22 | npx svelte-serve . 23 | ``` 24 | 25 | ## TODO 26 | - [ ] preprocessors (in progress) 27 | - [ ] HMR 28 | - [ ] source map 29 | 30 | ## License 31 | 32 | MIT -------------------------------------------------------------------------------- /bin/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const args = process.argv.slice(2); 4 | 5 | const command = args[0]; 6 | if (command === "init") { 7 | const { initSvelteApp } = require("../dist/init/index.js"); 8 | initSvelteApp(args[1]); 9 | } else { 10 | const { startDevServer } = require("../dist/serve/index.js"); 11 | startDevServer(args[0] || "."); 12 | } 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-serve", 3 | "version": "0.1.2", 4 | "license": "MIT", 5 | "bin": { 6 | "svelte-serve": "./bin/index.js" 7 | }, 8 | "scripts": { 9 | "dev": "run-p dev:client dev:node", 10 | "dev:client": "tsc -p src/client/tsconfig.json -w", 11 | "dev:node": "tsc -p src/node/tsconfig.json -w", 12 | "build": "tsc -p src/client/tsconfig.json && tsc -p src/node/tsconfig.json && rm -rf dist/init/template && cp -r src/node/init/template dist/init/template" 13 | }, 14 | "files": [ 15 | "bin", 16 | "dist" 17 | ], 18 | "dependencies": { 19 | "chalk": "^4.0.0", 20 | "es-module-lexer": "^0.3.18", 21 | "get-stream": "^5.1.0", 22 | "inquirer": "^7.1.0", 23 | "koa": "^2.11.0", 24 | "koa-conditional-get": "^2.0.0", 25 | "koa-etag": "^3.0.0", 26 | "koa-send": "^5.0.0", 27 | "koa-static": "^5.0.0", 28 | "lru-cache": "^5.1.1", 29 | "magic-string": "^0.25.7", 30 | "node-fetch": "^2.6.0", 31 | "ora": "^4.0.4", 32 | "resolve-from": "^5.0.0", 33 | "svelte": "^3.21.0", 34 | "svelte-hmr": "^0.7.0", 35 | "ws": "^7.2.5" 36 | }, 37 | "devDependencies": { 38 | "@types/es-module-lexer": "^0.3.0", 39 | "@types/estree": "^0.0.44", 40 | "@types/inquirer": "^6.5.0", 41 | "@types/koa": "^2.11.3", 42 | "@types/koa-send": "^4.1.2", 43 | "@types/node-fetch": "^2.5.7", 44 | "@types/sass": "^1.16.0", 45 | "@types/ws": "^7.2.4", 46 | "estree-walker": "^2.0.1", 47 | "npm-run-all": "^4.1.5", 48 | "typescript": "^3.8.3" 49 | }, 50 | "prettier": { 51 | "printWidth": 140 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/client/client.ts: -------------------------------------------------------------------------------- 1 | const socket = new WebSocket(`ws://${location.host}`); 2 | socket.addEventListener("message", ({ data }) => { 3 | data = JSON.parse(data); 4 | console.log("received message:", data); 5 | 6 | switch (data.type) { 7 | case "connected": 8 | document.cookie = `__SVELTE_SERVE_ID__=${data.id};`; 9 | break; 10 | case "missing_dependencies": 11 | handleMissingDependencies(data); 12 | break; 13 | case "missing_dependencies_done": 14 | handleMissingDependenciesDone(); 15 | break; 16 | } 17 | }); 18 | socket.addEventListener("close", () => { 19 | console.log("Connection lost. Polling for restart..."); 20 | setInterval(() => { 21 | const socket = new WebSocket(`ws://${location.host}`); 22 | socket.addEventListener("open", () => { 23 | location.reload(); 24 | }); 25 | }, 1000); 26 | }); 27 | 28 | const HMR_MISSING_DEPENDENCIES = "hmr_missing_dependencies"; 29 | function handleMissingDependencies({ message, dependencies }: { message: string[]; dependencies: string[][] }) { 30 | const div = document.createElement("div"); 31 | div.id = HMR_MISSING_DEPENDENCIES; 32 | div.innerHTML = ` 33 |
34 |

Missing dependencies

35 |
Reason:
36 |
37 | 40 |
41 |
Install them in your console:
42 | yarn add ${dependencies 43 | .map((dep) => dep[0]) 44 | .join(" ")} 45 |
46 | `; 47 | document.body.appendChild(div); 48 | } 49 | function handleMissingDependenciesDone() { 50 | const elem = document.querySelector("#" + HMR_MISSING_DEPENDENCIES); 51 | elem?.parentNode?.removeChild(elem); 52 | } 53 | -------------------------------------------------------------------------------- /src/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../../dist", 4 | "sourceMap": false, 5 | "target": "es2018", 6 | "moduleResolution": "node", 7 | "esModuleInterop": true, 8 | "declaration": true, 9 | "allowJs": false, 10 | "allowSyntheticDefaultImports": true, 11 | "noUnusedLocals": true, 12 | "strictNullChecks": true, 13 | "noImplicitAny": true, 14 | "removeComments": false, 15 | "module": "commonjs", 16 | "lib": ["es2018", "DOM"] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/node/init/index.ts: -------------------------------------------------------------------------------- 1 | import { promises as fs } from "fs"; 2 | import chalk from "chalk"; 3 | import path from "path"; 4 | import inquirer from "inquirer"; 5 | import { URLSearchParams } from "url"; 6 | import fetch from "node-fetch"; 7 | import { init, parse } from "es-module-lexer"; 8 | import { executeAsync } from "../utils/execute"; 9 | import ora from "ora"; 10 | 11 | const SVELTE_REPL = /^https:\/\/svelte.dev\/repl\/([0-9a-f]{32})(\?.*)?$/; 12 | 13 | export async function initSvelteApp(folderName: string | void) { 14 | const cwd = process.cwd(); 15 | let templateDirectory = path.join(__dirname, "template"); 16 | let targetDirectory: string; 17 | 18 | if (isSvelteRepl(folderName)) { 19 | // @ts-ignore 20 | const [_, replId, queryParams] = folderName.match(SVELTE_REPL); 21 | const query = new URLSearchParams(queryParams); 22 | const { files, name: description } = await getReplContent(replId); 23 | folderName = await askForFolderName(`repl-${replId}`); 24 | 25 | const spinner = ora(`Downloading Svelte REPL`).start(); 26 | 27 | targetDirectory = path.join(cwd, folderName); 28 | await fs.mkdir(targetDirectory); 29 | 30 | const dependencies = new Set(); 31 | for (const { name, source } of files) { 32 | await fs.writeFile(path.join(targetDirectory, name), source, "utf-8"); 33 | 34 | const deps = await getImportStatement(source); 35 | deps.forEach((dep) => dependencies.add(dep)); 36 | } 37 | await copyFile("index.html"); 38 | await copyFile("package.json", { "%%packageName%%": folderName, "%%description%%": description }); 39 | 40 | dependencies.add(`svelte${query.has("version") ? `@${query.get("version")}` : ""}`); 41 | 42 | spinner.text = "Installing dependencies"; 43 | 44 | await executeAsync(targetDirectory, `yarn add ${[...dependencies].join(" ")}`); 45 | 46 | spinner.succeed(`Initialised ${folderName} at ${targetDirectory}!`); 47 | printWelcome(folderName); 48 | return; 49 | } 50 | 51 | let shouldCreateFolder = true; 52 | if (!folderName) { 53 | // if the current folder is empty, 54 | // init the svelte app here and dont create a new folder 55 | if ((await fs.readdir(cwd)).length === 0) { 56 | folderName = path.basename(cwd); 57 | targetDirectory = cwd; 58 | shouldCreateFolder = false; 59 | } else { 60 | folderName = await askForFolderName(); 61 | targetDirectory = path.join(cwd, folderName); 62 | } 63 | } else { 64 | targetDirectory = path.join(cwd, folderName); 65 | } 66 | 67 | const spinner = ora(`Initialising`).start(); 68 | 69 | if (shouldCreateFolder) { 70 | try { 71 | await fs.mkdir(targetDirectory); 72 | } catch (e) { 73 | return spinner.fail(`Target directory "${folderName}" already exists.`); 74 | } 75 | } 76 | 77 | try { 78 | await copyFile("index.html"); 79 | await copyFile("App.svelte"); 80 | await copyFile("package.json", { "%%packageName%%": folderName, "%%description%%": "svelte-serve template" }); 81 | 82 | spinner.succeed(`Initialised ${folderName} at ${targetDirectory}!`); 83 | printWelcome(folderName); 84 | } catch (error) { 85 | return spinner.fail(error.message); 86 | } 87 | 88 | async function copyFile(filename: string, replacement?: Record) { 89 | let content = await fs.readFile(path.join(templateDirectory, filename), "utf-8"); 90 | if (replacement) { 91 | for (const key of Object.keys(replacement)) { 92 | const replacementRegex = new RegExp(key, "g"); 93 | content = content.replace(replacementRegex, replacement[key]); 94 | } 95 | } 96 | await fs.writeFile(path.join(targetDirectory, filename), content, "utf-8"); 97 | } 98 | } 99 | 100 | async function askForFolderName(defaultValue: string | void) { 101 | const { folderName = "svelte-app" } = await inquirer.prompt([ 102 | { 103 | type: "input", 104 | name: "folderName", 105 | message: "Please specify folder name:", 106 | default: defaultValue, 107 | validate(str) { 108 | return !!str; 109 | }, 110 | }, 111 | ]); 112 | return folderName; 113 | } 114 | 115 | function isSvelteRepl(url: string | void) { 116 | return !!url && SVELTE_REPL.test(url); 117 | } 118 | 119 | async function getReplContent(replId: string): Promise<{ files: Array<{ name: string; source: string }>; name: string; uid: string }> { 120 | const response = await fetch(`https://svelte.dev/repl/${replId}.json`); 121 | return await response.json(); 122 | } 123 | 124 | async function getImportStatement(source: string) { 125 | await init; 126 | 127 | let dependencies = new Set(); 128 | let match; 129 | const regex = /|([^]*?)<\/script>/gi; 130 | while ((match = regex.exec(source))) { 131 | const content = match[2]; 132 | if (content) { 133 | const [imports] = parse(content); 134 | for (const { s, e } of imports) { 135 | const importee = content.substring(s, e); 136 | if (!(importee === "svelte" || importee.startsWith("svelte/") || importee.startsWith("./"))) { 137 | dependencies.add(importee); 138 | } 139 | } 140 | } 141 | } 142 | return dependencies; 143 | } 144 | 145 | function printWelcome(folderName: string) { 146 | console.log(``); 147 | console.log(`To get started, we suggest that you begin by typing:`); 148 | console.log(``); 149 | console.log(` ${chalk.cyan(`cd ${folderName}`)}`); 150 | console.log(` ${chalk.cyan(`svelte-serve`)}`); 151 | console.log(``); 152 | console.log(`Happy hacking!`); 153 | } 154 | -------------------------------------------------------------------------------- /src/node/init/template/App.svelte: -------------------------------------------------------------------------------- 1 | 4 | 9 |

Hello {name}

10 | -------------------------------------------------------------------------------- /src/node/init/template/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/node/init/template/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "%%packageName%%", 3 | "version": "1.0.0", 4 | "description": "%%description%%" 5 | } 6 | -------------------------------------------------------------------------------- /src/node/preprocessors/index.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import type { TransformConfig, TransformResult } from "./types"; 3 | import { promptToInstall } from "./utils/installHelper"; 4 | import { broadcast } from "../serve/wss"; 5 | import chalk from "chalk"; 6 | import { or } from "./utils/or"; 7 | const TRANSFORMERS: { 8 | [key: string]: (config: TransformConfig) => TransformResult | Promise; 9 | } = {}; 10 | const TRANSFORMER_TARGET = new Map([ 11 | ["sass->style", "sass"], 12 | ["stylus->style", "stylus"], 13 | ["less->style", "less"], 14 | ["coffeescript->script", "coffeescript"], 15 | ["typescript->script", "typescript"], 16 | ]); 17 | const alias = new Map([ 18 | ["scss", "sass"], 19 | ["scss", "sass"], 20 | ["styl", "stylus"], 21 | ["coffee", "coffeescript"], 22 | ["ts", "typescript"], 23 | ]); 24 | 25 | export function getMissingDependenciesPreprocessor(root: string) { 26 | return { 27 | async markup({ content }: { content: string; filename?: string }) { 28 | let message: Array = []; 29 | let unformattedMessage: Array = []; 30 | let dependencies: Array> = []; 31 | let match; 32 | const scriptRegex = /|([^]*?)<\/script>/gi; 33 | const styleRegex = /|([^]*?)<\/style>/gi; 34 | 35 | function getMissingDependencies(transformer: any, tag: string, lang: any) { 36 | const deps: string[] = transformer.getMissingDependencies({ root }); 37 | if (!deps) return; 38 | dependencies.push(deps); 39 | message.push(`- ${or(deps.map((dep) => chalk.red(`"${dep}"`)))} is required for ${chalk.blue(`<${tag} ${lang.desc}>`)}`); 40 | unformattedMessage.push(`${or(deps.map((dep) => `"${dep}"`))} is required for <${tag} ${lang.desc}>`); 41 | } 42 | 43 | while ((match = scriptRegex.exec(content))) { 44 | const attributes = parse_attributes(match[1] || ''); 45 | const lang = getLang(attributes); 46 | if (!lang) continue; 47 | const transformer = await getTransformer(lang.from, "script", lang.desc); 48 | getMissingDependencies(transformer, "script", lang); 49 | } 50 | 51 | while ((match = styleRegex.exec(content))) { 52 | const attributes = parse_attributes(match[1] || ''); 53 | const lang = getLang(attributes); 54 | if (!lang) continue; 55 | const transformer = await getTransformer(lang.from, "style", lang.desc); 56 | getMissingDependencies(transformer, "style", lang); 57 | } 58 | 59 | if (dependencies.length > 0) { 60 | console.log(""); 61 | console.log(chalk.red(chalk.bold("Missing Dependencies"))); 62 | console.log(""); 63 | console.log(message.join("\n")); 64 | console.log(""); 65 | await new Promise((resolve) => setTimeout(resolve, 1000)); 66 | broadcast({ type: "missing_dependencies", dependencies, message: unformattedMessage }); 67 | await promptToInstall(root, dependencies); 68 | broadcast({ type: "missing_dependencies_done" }); 69 | } 70 | 71 | return { code: content }; 72 | }, 73 | }; 74 | } 75 | 76 | export function getTransformCodePreprocessor(root: string) { 77 | return { 78 | style: getPreprocessor({ root, to: "style" }), 79 | script: getPreprocessor({ root, to: "script" }), 80 | }; 81 | } 82 | 83 | export async function transform(transformConfig: TransformConfig) { 84 | let { from, to, desc } = transformConfig; 85 | const transformer = await getTransformer(from, to, desc); 86 | // @ts-ignore 87 | return await transformer.default(transformConfig); 88 | } 89 | 90 | async function getTransformer(from: string, to: string, desc: string) { 91 | from = from.toLowerCase(); 92 | from = alias.get(from) || from; 93 | const transformerName = TRANSFORMER_TARGET.get(`${from}->${to}`); 94 | if (!transformerName) { 95 | throw new Error(`<${to} ${desc}> not supported`); 96 | } 97 | 98 | // cache transformer 99 | if (!(transformerName in TRANSFORMERS)) { 100 | TRANSFORMERS[transformerName] = await import(path.join(__dirname, "./transformers/" + transformerName)); 101 | } 102 | return TRANSFORMERS[transformerName]; 103 | } 104 | 105 | function getPreprocessor({ root, to }: { root: string; to: string }) { 106 | return async function ({ 107 | content, 108 | attributes, 109 | filename, 110 | }: { 111 | content: string; 112 | attributes: Record; 113 | filename: string; 114 | }) { 115 | const lang = getLang(attributes); 116 | if (!lang) { 117 | return { code: content }; 118 | } 119 | return await transform({ 120 | ...lang, 121 | to, 122 | content, 123 | filename, 124 | root, 125 | }); 126 | }; 127 | } 128 | 129 | function getLang(attributes: Record) { 130 | if (typeof attributes.lang === "string") { 131 | return { 132 | from: attributes.lang, 133 | desc: `lang="${attributes.lang}"`, 134 | }; 135 | } 136 | if (typeof attributes.type === "string") { 137 | const lang = attributes.type.replace(/^(text|application)\/(.*)$/, "$2"); 138 | return { 139 | from: lang, 140 | desc: `type="${attributes.type}"`, 141 | }; 142 | } 143 | } 144 | 145 | function parse_attributes(str: string) { 146 | const attrs: Record = {}; 147 | str 148 | .split(/\s+/) 149 | .filter(Boolean) 150 | .forEach((attr) => { 151 | const p = attr.indexOf("="); 152 | if (p === -1) { 153 | attrs[attr] = true; 154 | } else { 155 | attrs[attr.slice(0, p)] = `'"`.includes(attr[p + 1]) ? attr.slice(p + 2, -1) : attr.slice(p + 1); 156 | } 157 | }); 158 | return attrs; 159 | } 160 | -------------------------------------------------------------------------------- /src/node/preprocessors/transformers/coffeescript.ts: -------------------------------------------------------------------------------- 1 | import type { TransformConfig } from "../types"; 2 | import { loadLib } from "../utils/loadLib"; 3 | import { resolveFrom } from "../utils/resolvedFrom"; 4 | 5 | let coffeeScript: any; 6 | 7 | export function getMissingDependencies({ root }: TransformConfig) { 8 | if (!resolveFrom(root, "coffeescript")) { 9 | return ["coffeescript"]; 10 | } 11 | } 12 | 13 | export default async function ({ to, desc, root, content, filename, options = {} }: TransformConfig) { 14 | if (!coffeeScript) { 15 | const coffeeLib = await loadLib(["coffeescript"], { 16 | errorMessage: `$1 are required for <${to} ${desc}>`, 17 | root, 18 | }); 19 | coffeeScript = coffeeLib.default; 20 | } 21 | 22 | const { js: code, sourceMap: map } = coffeeScript.compile(content, { 23 | filename, 24 | sourceMap: true, 25 | bare: false, 26 | ...options, 27 | }); 28 | 29 | return { 30 | code, 31 | map, 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /src/node/preprocessors/transformers/less.ts: -------------------------------------------------------------------------------- 1 | import type { TransformConfig } from "../types"; 2 | import path from "path"; 3 | import { loadLib } from "../utils/loadLib"; 4 | import { resolveFrom } from "../utils/resolvedFrom"; 5 | 6 | let less: any; 7 | 8 | export function getMissingDependencies({ root }: TransformConfig) { 9 | if (!resolveFrom(root, "less")) { 10 | return ["less"]; 11 | } 12 | } 13 | 14 | export default async function ({ to, desc, root, content, filename, options = {} }: TransformConfig) { 15 | if (!less) { 16 | const lessLib = await loadLib(["less"], { 17 | errorMessage: `$1 are required for <${to} ${desc}>`, 18 | root, 19 | }); 20 | less = lessLib.default; 21 | } 22 | 23 | const { css: code, map, imports: dependencies } = await less.render(content, { 24 | sourceMap: {}, 25 | filename, 26 | paths: [...(options.includePaths || []), "node_modules", path.dirname(filename)], 27 | ...options, 28 | }); 29 | return { 30 | code, 31 | map, 32 | dependencies, 33 | }; 34 | } 35 | -------------------------------------------------------------------------------- /src/node/preprocessors/transformers/sass.ts: -------------------------------------------------------------------------------- 1 | import { renderSync } from "sass"; 2 | import type { TransformConfig } from "../types"; 3 | import path from "path"; 4 | import { loadLib } from "../utils/loadLib"; 5 | import { resolveFrom } from "../utils/resolvedFrom"; 6 | 7 | let sass: { renderSync: typeof renderSync }; 8 | 9 | export function getMissingDependencies({ root }: TransformConfig) { 10 | if (!(resolveFrom(root, "sass") || resolveFrom(root, "node-sass"))) { 11 | return ["sass", "node-sass"]; 12 | } 13 | } 14 | 15 | export default async function ({ to, desc, root, content, filename, options = {} }: TransformConfig) { 16 | if (!sass) { 17 | const sassLib = await loadLib(["sass", "node-sass"], { 18 | errorMessage: `$1 are required for <${to} ${desc}>`, 19 | root, 20 | }); 21 | sass = sassLib.default; 22 | } 23 | 24 | const result = sass.renderSync({ 25 | sourceMap: true, 26 | ...options, 27 | data: content, 28 | includePaths: [...(options.includePaths || []), "node_modules", path.dirname(filename)], 29 | outFile: `${filename}.css`, 30 | }); 31 | return { 32 | code: result.css.toString(), 33 | map: result.map?.toString(), 34 | dependencies: result.stats.includedFiles, 35 | }; 36 | } 37 | -------------------------------------------------------------------------------- /src/node/preprocessors/transformers/stylus.ts: -------------------------------------------------------------------------------- 1 | import type { TransformConfig } from "../types"; 2 | import path from "path"; 3 | import { loadLib } from "../utils/loadLib"; 4 | import { resolveFrom } from "../utils/resolvedFrom"; 5 | 6 | let stylus: any; 7 | 8 | export function getMissingDependencies({ root }: TransformConfig) { 9 | if (!resolveFrom(root, "stylus")) { 10 | return ["stylus"]; 11 | } 12 | } 13 | 14 | export default async function ({ desc, to, root, content, filename, options = {} }: TransformConfig) { 15 | if (!stylus) { 16 | const stylusLib = await loadLib(["stylus"], { 17 | errorMessage: `$1 is required for <${to} ${desc}>`, 18 | root, 19 | }); 20 | stylus = stylusLib.default; 21 | } 22 | 23 | return new Promise((resolve, reject) => { 24 | const style = stylus(content, { 25 | filename, 26 | includePaths: [...(options.includePaths || []), "node_modules", path.dirname(filename)], 27 | ...options, 28 | }).set("sourcemap", { ...options.sourcemap }); 29 | 30 | style.render((err: Error, css: string) => { 31 | // istanbul ignore next 32 | if (err) reject(err); 33 | 34 | resolve({ 35 | code: css, 36 | map: style.sourcemap, 37 | // .map() necessary for windows compatibility 38 | dependencies: style.deps(filename).map((filePath: string) => path.resolve(filePath)), 39 | }); 40 | }); 41 | }); 42 | } 43 | -------------------------------------------------------------------------------- /src/node/preprocessors/transformers/typescript.ts: -------------------------------------------------------------------------------- 1 | import type { TransformConfig } from "../types"; 2 | import { loadLib } from "../utils/loadLib"; 3 | import { resolveFrom } from "../utils/resolvedFrom"; 4 | 5 | let ts: any; 6 | 7 | export function getMissingDependencies({ root }: TransformConfig) { 8 | if (!resolveFrom(root, "typescript")) { 9 | return ["typescript"]; 10 | } 11 | } 12 | 13 | export default async function ({ to, desc, root, content, filename, options = {} }: TransformConfig) { 14 | if (!ts) { 15 | const tsLib = await loadLib(["typescript"], { 16 | errorMessage: `$1 is required for <${to} ${desc}>`, 17 | root, 18 | }); 19 | ts = tsLib.default; 20 | } 21 | 22 | const compilerOptions = { 23 | ...options, 24 | moduleResolution: "node", 25 | target: "es6", 26 | allowNonTsExtensions: true, 27 | }; 28 | 29 | const { outputText: code, sourceMapText: map, diagnostics } = ts.transpileModule(content, { 30 | fileName: filename, 31 | compilerOptions: compilerOptions, 32 | // reportDiagnostics: true, //options.reportDiagnostics !== false, 33 | // transformers: TS_TRANSFORMERS, 34 | }); 35 | 36 | // TODO: 37 | diagnostics; 38 | 39 | return { 40 | code, 41 | map, 42 | }; 43 | } 44 | -------------------------------------------------------------------------------- /src/node/preprocessors/types.ts: -------------------------------------------------------------------------------- 1 | export interface TransformConfig { 2 | from: string; 3 | to: string; 4 | desc: string; 5 | content: string; 6 | filename: string; 7 | root: string; 8 | options?: { [key: string]: any }; 9 | } 10 | export interface TransformResult { 11 | code: string; 12 | map?: object | string; 13 | dependencies?: string[]; 14 | } 15 | -------------------------------------------------------------------------------- /src/node/preprocessors/utils/importAny.ts: -------------------------------------------------------------------------------- 1 | import { resolveFrom } from "./resolvedFrom"; 2 | 3 | export async function importAny(root: string, modules: string[]) { 4 | for (const mod of modules) { 5 | const resolvedPath = resolveFrom(root, mod); 6 | if (resolvedPath) { 7 | return await import(resolvedPath); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/node/preprocessors/utils/installHelper.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import inquirer from "inquirer"; 3 | import ora from "ora"; 4 | import { executeAsync } from "../../utils/execute"; 5 | import { or } from "./or"; 6 | 7 | type ModuleOption = string[]; 8 | export async function promptToInstall(root: string, modules: ModuleOption[]) { 9 | console.log(`To fix this, you need to install the following module${modules.length > 0 ? "s" : ""}:`); 10 | modules.forEach((mod) => { 11 | console.log("-", or(mod.map((m) => bold(m)))); 12 | }); 13 | console.log(""); 14 | const { install } = await prompt([{ type: "confirm", name: "install", default: true, message: "Do you want to install them now?" }]); 15 | if (install) { 16 | const modsToInstall = []; 17 | for (const mod of modules) { 18 | if (!Array.isArray(mod)) { 19 | modsToInstall.push(mod); 20 | } else if (mod.length === 1) { 21 | modsToInstall.push(mod[0]); 22 | } else { 23 | const { chosen } = await prompt([ 24 | { type: "rawlist", name: "chosen", choices: mod, default: 0, message: "Which one would you like to install?" }, 25 | ]); 26 | modsToInstall.push(chosen); 27 | } 28 | } 29 | 30 | const spinner = ora(`Installing ${modsToInstall.join(", ")}`).start(); 31 | await executeAsync(root, `yarn add --dev ${modsToInstall.join(" ")}`); 32 | spinner.succeed(`Installed ${modsToInstall.join(", ")}`); 33 | 34 | return true; 35 | } 36 | } 37 | 38 | function bold(str: string) { 39 | return chalk.bold('"' + str + '"'); 40 | } 41 | 42 | let close: Function; 43 | function prompt(questions: any): any { 44 | // cleanup previous inquirer 45 | if (typeof close === "function") { 46 | close(); 47 | } 48 | let promise = inquirer.prompt(questions); 49 | // @ts-ignore 50 | close = promise.ui.close.bind(promise.ui); 51 | return promise; 52 | } 53 | -------------------------------------------------------------------------------- /src/node/preprocessors/utils/loadLib.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import { importAny } from "./importAny"; 3 | import { promptToInstall } from "./installHelper"; 4 | 5 | export async function loadLib(libs: string[], { errorMessage, root }: { errorMessage: string; root: string }) { 6 | let lib = await importAny(root, libs); 7 | if (lib) return lib; 8 | 9 | console.error(chalk.red(errorMessage.replace("$1", libs.map((lib) => `"${lib}"`).join(", ")))); 10 | 11 | // attempt to install 12 | if (await promptToInstall(root, [libs])) { 13 | return await importAny(root, libs); 14 | } 15 | 16 | throw new Error("failed to load lib"); 17 | } 18 | -------------------------------------------------------------------------------- /src/node/preprocessors/utils/or.ts: -------------------------------------------------------------------------------- 1 | export function or(modules: string[]) { 2 | if (!Array.isArray(modules)) { 3 | return modules; 4 | } 5 | if (modules.length <= 2) { 6 | return modules.map((mod) => mod).join(" or "); 7 | } 8 | return `${modules 9 | .slice(0, -1) 10 | .map((mod) => mod) 11 | .join(", ")} or ${modules[modules.length - 1]}`; 12 | } 13 | -------------------------------------------------------------------------------- /src/node/preprocessors/utils/resolvedFrom.ts: -------------------------------------------------------------------------------- 1 | import { executeSync } from "../../utils/execute"; 2 | 3 | export function resolveFrom(fromDirectory: string, moduleId: string) { 4 | try { 5 | // require.resolve has cache that has no API to clear them 6 | // once it failed to resolve, it will always fail to resolve 7 | // this HACKERY allow us to install deps and resolve them again 8 | return executeSync(fromDirectory, `node -e "console.log(require.resolve('${moduleId}'))"`).trim(); 9 | } catch { 10 | return undefined; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/node/serve/hmrPlugin.ts: -------------------------------------------------------------------------------- 1 | import Koa from "koa"; 2 | import path from "path"; 3 | 4 | export default function ({ app }: { app: Koa; root: string }) { 5 | app.use(async (ctx, next) => { 6 | if (ctx.path === "/@hmr") { 7 | ctx.resolvedPath = path.join(__dirname, "../client.js"); 8 | } 9 | return next(); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /src/node/serve/htmlPlugin.ts: -------------------------------------------------------------------------------- 1 | import Koa from "koa"; 2 | import getStream from "get-stream"; 3 | // import path from 'path'; 4 | // import resolve from 'resolve-from'; 5 | // import chalk from 'chalk'; 6 | 7 | export default function ({ app, root }: { app: Koa; root: string }) { 8 | app.use(async (ctx, next) => { 9 | await next(); 10 | 11 | if (ctx.status === 304) { 12 | // Not modified 13 | return; 14 | } 15 | 16 | if (ctx.response.header["content-type"]?.indexOf("text/html") > -1) { 17 | const body = await getStream(ctx.body); 18 | ctx.body = '' + body; 19 | } 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /src/node/serve/index.ts: -------------------------------------------------------------------------------- 1 | import http from "http"; 2 | import Koa from "koa"; 3 | import chalk from "chalk"; 4 | import path from "path"; 5 | import modulePlugin from "./modulePlugin"; 6 | import servePlugin from "./servePlugin"; 7 | import sveltePlugin from "./sveltePlugin"; 8 | import htmlPlugin from "./htmlPlugin"; 9 | import hmrPlugin from "./hmrPlugin"; 10 | import { initialiseWebSocketServer } from "./wss"; 11 | 12 | export function startDevServer(root: string) { 13 | root = path.join(process.cwd(), root); 14 | 15 | const app = new Koa(); 16 | modulePlugin({ app, root }); 17 | hmrPlugin({ app, root }); 18 | sveltePlugin({ app, root }); 19 | htmlPlugin({ app, root }); 20 | servePlugin({ app, root }); 21 | 22 | const server = http.createServer(app.callback()); 23 | initialiseWebSocketServer(server); 24 | 25 | let port = 3000; 26 | 27 | server.on("error", (error) => { 28 | // @ts-ignore 29 | if (error.code === "EADDRINUSE") { 30 | setTimeout(() => { 31 | server.close(); 32 | server.listen(++port); 33 | }, 100); 34 | } else { 35 | console.log(chalk.red("server error:")); 36 | console.error(error); 37 | } 38 | }); 39 | server.on("listening", () => { 40 | console.log(chalk.green("Dev server running at:")); 41 | console.log(` > http://localhost:${port}`); 42 | console.log(" "); 43 | }); 44 | server.listen(port); 45 | } 46 | -------------------------------------------------------------------------------- /src/node/serve/modulePlugin.ts: -------------------------------------------------------------------------------- 1 | import Koa from "koa"; 2 | import path from "path"; 3 | import resolve from "resolve-from"; 4 | import chalk from "chalk"; 5 | import getStream from "get-stream"; 6 | import MagicString from "magic-string"; 7 | import { init, parse } from "es-module-lexer"; 8 | 9 | export default function ({ app, root }: { app: Koa; root: string }) { 10 | app.use(async (ctx, next) => { 11 | let resolvedPath; 12 | if (ctx.path.startsWith("/@modules/")) { 13 | const moduleName = ctx.path.replace("/@modules/", ""); 14 | 15 | if (!path.extname(moduleName)) { 16 | try { 17 | const pkgPath = resolve(root, moduleName + "/package.json"); 18 | const pkg = require(pkgPath); 19 | const entryPoint = pkg.svelte || pkg.module || pkg.main || "index.js"; 20 | return ctx.redirect(path.join(ctx.path, entryPoint)); 21 | } catch (error) { 22 | if (moduleName === "svelte" || moduleName.startsWith("svelte/")) { 23 | const pkgPath = resolve(__dirname, moduleName + "/package.json"); 24 | const pkg = require(pkgPath); 25 | const entryPoint = pkg.svelte || pkg.module || pkg.main || "index.js"; 26 | resolvedPath = path.resolve(path.dirname(pkgPath), entryPoint); 27 | } else { 28 | console.log(chalk.red(`Module not found: ${moduleName}`)); 29 | } 30 | } 31 | } else { 32 | resolvedPath = resolve(root, moduleName); 33 | } 34 | } else { 35 | resolvedPath = path.resolve(root, "." + ctx.path); 36 | } 37 | 38 | ctx.resolvedPath = resolvedPath; 39 | await next(); 40 | 41 | if (ctx.status === 304) { 42 | // Not modified 43 | return; 44 | } 45 | 46 | if (/\.(js|ts|mjs|svelte)$/.test(ctx.path)) { 47 | // console.log(typeof ctx.body); 48 | let jsCode = typeof ctx.body === "string" ? ctx.body : await getStream(ctx.body); 49 | await init; 50 | 51 | // jsCode = jsCode + `\n\n//# sourceMappingURL=${req.url}.map`; 52 | let magicJsCode = new MagicString(jsCode); 53 | const [imports] = parse(jsCode); 54 | for (const { s, e, d } of imports) { 55 | if (d > -1) { 56 | // TODO: dynamic import 57 | } 58 | const importee = jsCode.substring(s, e); 59 | if (!importee.startsWith("./") && !importee.startsWith("../")) { 60 | magicJsCode.overwrite(s, e, "/@modules/" + importee); 61 | } 62 | } 63 | ctx.body = magicJsCode.toString(); 64 | } 65 | }); 66 | } 67 | -------------------------------------------------------------------------------- /src/node/serve/servePlugin.ts: -------------------------------------------------------------------------------- 1 | import Koa from "koa"; 2 | import send from "koa-send"; 3 | 4 | export default function ({ app, root }: { app: Koa; root: string }) { 5 | app.use(require("koa-conditional-get")()); 6 | app.use(require("koa-etag")()); 7 | app.use((ctx) => { 8 | if (ctx.resolvedPath) { 9 | return send(ctx, ctx.resolvedPath, { 10 | root: "/", 11 | index: "index.html", 12 | // when installed in global, path will contain hidden files 13 | hidden: true, 14 | }); 15 | } 16 | ctx.status = 404; 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /src/node/serve/sveltePlugin.ts: -------------------------------------------------------------------------------- 1 | import Koa from "koa"; 2 | import path from "path"; 3 | import { compile, preprocess } from "svelte/compiler"; 4 | import getStream from "get-stream"; 5 | import { getMissingDependenciesPreprocessor, getTransformCodePreprocessor } from "../preprocessors"; 6 | 7 | export default function ({ app, root }: { app: Koa; root: string }) { 8 | app.use(async (ctx, next) => { 9 | if (!ctx.resolvedPath) return next(); 10 | if (!ctx.resolvedPath.endsWith(".svelte")) return next(); 11 | 12 | await next(); 13 | 14 | if (ctx.status === 304) { 15 | // Not modified 16 | return; 17 | } 18 | 19 | const svelteCode = await getStream(ctx.body); 20 | 21 | const { code: preprocessedCode, dependencies } = await preprocess( 22 | svelteCode, 23 | [getMissingDependenciesPreprocessor(root), getTransformCodePreprocessor(root)], 24 | { 25 | filename: path.basename(ctx.path), 26 | } 27 | ); 28 | const { js } = compile(preprocessedCode, {}); 29 | 30 | // TODO: watch these files too 31 | dependencies; 32 | 33 | // set sourcemap 34 | // cache.set(req.url + '.map', js.map); 35 | // jsCode = jsCode + `\n\n//# sourceMappingURL=${req.url}.map`; 36 | 37 | ctx.body = js.code; 38 | ctx.set("Content-Type", "text/javascript"); 39 | }); 40 | } 41 | -------------------------------------------------------------------------------- /src/node/serve/wss.ts: -------------------------------------------------------------------------------- 1 | import WebSocket from "ws"; 2 | import { Server } from "http"; 3 | import chalk from "chalk"; 4 | 5 | let wss; 6 | let id = 0; 7 | const sockets = new Map(); 8 | 9 | export function initialiseWebSocketServer(server: Server) { 10 | wss = new WebSocket.Server({ server }); 11 | wss.on("connection", (socket) => { 12 | let _id = id++; 13 | sockets.set(_id, socket); 14 | socket.send(JSON.stringify({ type: "connected", id: _id })); 15 | socket.on("close", () => { 16 | sockets.delete(_id); 17 | }); 18 | }); 19 | 20 | wss.on("error", (e: Error & { code: string }) => { 21 | if (e.code !== "EADDRINUSE") { 22 | console.error(chalk.red(`WebSocket server error:`)); 23 | console.error(e); 24 | } 25 | }); 26 | } 27 | 28 | export function broadcast(message: any) { 29 | const stringified = JSON.stringify(message, null, 2); 30 | // console.log(`broadcast message: ${stringified}`); 31 | 32 | sockets.forEach((s) => s.send(stringified)); 33 | } 34 | 35 | export function send(socketId: number, message: any) { 36 | const stringified = JSON.stringify(message, null, 2); 37 | // console.log(`send message to ${socketId}: ${stringified}`); 38 | // console.group(sockets); 39 | sockets.get(socketId)?.send(stringified); 40 | } 41 | -------------------------------------------------------------------------------- /src/node/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../../dist", 4 | "sourceMap": false, 5 | "target": "es2018", 6 | "moduleResolution": "node", 7 | "esModuleInterop": true, 8 | "declaration": true, 9 | "allowJs": false, 10 | "allowSyntheticDefaultImports": true, 11 | "noUnusedLocals": true, 12 | "strictNullChecks": true, 13 | "noImplicitAny": true, 14 | "removeComments": false, 15 | "module": "commonjs", 16 | "lib": ["es2018"] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/node/utils/execute.ts: -------------------------------------------------------------------------------- 1 | import { exec, execSync } from "child_process"; 2 | import { promisify } from "util"; 3 | 4 | const execAsync = promisify(exec); 5 | 6 | export function executeSync(cwd: string, command: string) { 7 | return execSync(command, { cwd, encoding: "utf8", stdio: "pipe" }); 8 | } 9 | 10 | export function executeAsync(cwd: string, command: string) { 11 | return execAsync(command, { cwd, encoding: "utf8" }); 12 | } 13 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/accepts@*": 6 | version "1.3.5" 7 | resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" 8 | integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== 9 | dependencies: 10 | "@types/node" "*" 11 | 12 | "@types/body-parser@*": 13 | version "1.19.0" 14 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" 15 | integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== 16 | dependencies: 17 | "@types/connect" "*" 18 | "@types/node" "*" 19 | 20 | "@types/color-name@^1.1.1": 21 | version "1.1.1" 22 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 23 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 24 | 25 | "@types/connect@*": 26 | version "3.4.33" 27 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" 28 | integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== 29 | dependencies: 30 | "@types/node" "*" 31 | 32 | "@types/content-disposition@*": 33 | version "0.5.3" 34 | resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" 35 | integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== 36 | 37 | "@types/cookies@*": 38 | version "0.7.4" 39 | resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.4.tgz#26dedf791701abc0e36b5b79a5722f40e455f87b" 40 | integrity sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw== 41 | dependencies: 42 | "@types/connect" "*" 43 | "@types/express" "*" 44 | "@types/keygrip" "*" 45 | "@types/node" "*" 46 | 47 | "@types/es-module-lexer@^0.3.0": 48 | version "0.3.0" 49 | resolved "https://registry.yarnpkg.com/@types/es-module-lexer/-/es-module-lexer-0.3.0.tgz#9fee3f19f64e6b3f999eeb3a70bd177a4d57a6cb" 50 | integrity sha512-XI3MGSejUQIJ3wzY0i5IHy5J3eb36M/ytgG8jIOssP08ovtRPcjpjXQqrx51AHBNBOisTS/NQNWJitI17+EwzQ== 51 | 52 | "@types/estree@^0.0.44": 53 | version "0.0.44" 54 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" 55 | integrity sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g== 56 | 57 | "@types/express-serve-static-core@*": 58 | version "4.17.5" 59 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz#a00ac7dadd746ae82477443e4d480a6a93ea083c" 60 | integrity sha512-578YH5Lt88AKoADy0b2jQGwJtrBxezXtVe/MBqWXKZpqx91SnC0pVkVCcxcytz3lWW+cHBYDi3Ysh0WXc+rAYw== 61 | dependencies: 62 | "@types/node" "*" 63 | "@types/range-parser" "*" 64 | 65 | "@types/express@*": 66 | version "4.17.6" 67 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e" 68 | integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w== 69 | dependencies: 70 | "@types/body-parser" "*" 71 | "@types/express-serve-static-core" "*" 72 | "@types/qs" "*" 73 | "@types/serve-static" "*" 74 | 75 | "@types/http-assert@*": 76 | version "1.5.1" 77 | resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" 78 | integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== 79 | 80 | "@types/inquirer@^6.5.0": 81 | version "6.5.0" 82 | resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-6.5.0.tgz#b83b0bf30b88b8be7246d40e51d32fe9d10e09be" 83 | integrity sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw== 84 | dependencies: 85 | "@types/through" "*" 86 | rxjs "^6.4.0" 87 | 88 | "@types/keygrip@*": 89 | version "1.0.2" 90 | resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" 91 | integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== 92 | 93 | "@types/koa-compose@*": 94 | version "3.2.5" 95 | resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" 96 | integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== 97 | dependencies: 98 | "@types/koa" "*" 99 | 100 | "@types/koa-send@^4.1.2": 101 | version "4.1.2" 102 | resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.2.tgz#978f8267ad116d12ac6a18fecd8f34c5657e09ad" 103 | integrity sha512-rfqKIv9bFds39Jxvsp8o3YJLnEQVPVriYA14AuO2OY65IHh/4UX4U/iMs5L0wATpcRmm1bbe0BNk23TRwx3VQQ== 104 | dependencies: 105 | "@types/koa" "*" 106 | 107 | "@types/koa@*", "@types/koa@^2.11.3": 108 | version "2.11.3" 109 | resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.3.tgz#540ece376581b12beadf9a417dd1731bc31c16ce" 110 | integrity sha512-ABxVkrNWa4O/Jp24EYI/hRNqEVRlhB9g09p48neQp4m3xL1TJtdWk2NyNQSMCU45ejeELMQZBYyfstyVvO2H3Q== 111 | dependencies: 112 | "@types/accepts" "*" 113 | "@types/content-disposition" "*" 114 | "@types/cookies" "*" 115 | "@types/http-assert" "*" 116 | "@types/keygrip" "*" 117 | "@types/koa-compose" "*" 118 | "@types/node" "*" 119 | 120 | "@types/mime@*": 121 | version "2.0.1" 122 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" 123 | integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 124 | 125 | "@types/node-fetch@^2.5.7": 126 | version "2.5.7" 127 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" 128 | integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== 129 | dependencies: 130 | "@types/node" "*" 131 | form-data "^3.0.0" 132 | 133 | "@types/node@*": 134 | version "13.13.4" 135 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" 136 | integrity sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA== 137 | 138 | "@types/qs@*": 139 | version "6.9.1" 140 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.1.tgz#937fab3194766256ee09fcd40b781740758617e7" 141 | integrity sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw== 142 | 143 | "@types/range-parser@*": 144 | version "1.2.3" 145 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 146 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 147 | 148 | "@types/sass@^1.16.0": 149 | version "1.16.0" 150 | resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.16.0.tgz#b41ac1c17fa68ffb57d43e2360486ef526b3d57d" 151 | integrity sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA== 152 | dependencies: 153 | "@types/node" "*" 154 | 155 | "@types/serve-static@*": 156 | version "1.13.3" 157 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1" 158 | integrity sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g== 159 | dependencies: 160 | "@types/express-serve-static-core" "*" 161 | "@types/mime" "*" 162 | 163 | "@types/through@*": 164 | version "0.0.30" 165 | resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" 166 | integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== 167 | dependencies: 168 | "@types/node" "*" 169 | 170 | "@types/ws@^7.2.4": 171 | version "7.2.4" 172 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.4.tgz#b3859f7b9c243b220efac9716ec42c716a72969d" 173 | integrity sha512-9S6Ask71vujkVyeEXKxjBSUV8ZUB0mjL5la4IncBoheu04bDaYyUKErh1BQcY9+WzOUOiKqz/OnpJHYckbMfNg== 174 | dependencies: 175 | "@types/node" "*" 176 | 177 | accepts@^1.3.5: 178 | version "1.3.7" 179 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 180 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 181 | dependencies: 182 | mime-types "~2.1.24" 183 | negotiator "0.6.2" 184 | 185 | ansi-escapes@^4.2.1: 186 | version "4.3.1" 187 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" 188 | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== 189 | dependencies: 190 | type-fest "^0.11.0" 191 | 192 | ansi-regex@^5.0.0: 193 | version "5.0.0" 194 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 195 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 196 | 197 | ansi-styles@^3.2.1: 198 | version "3.2.1" 199 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 200 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 201 | dependencies: 202 | color-convert "^1.9.0" 203 | 204 | ansi-styles@^4.1.0: 205 | version "4.2.1" 206 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 207 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 208 | dependencies: 209 | "@types/color-name" "^1.1.1" 210 | color-convert "^2.0.1" 211 | 212 | any-promise@^1.0.0, any-promise@^1.1.0: 213 | version "1.3.0" 214 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 215 | integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= 216 | 217 | asynckit@^0.4.0: 218 | version "0.4.0" 219 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 220 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 221 | 222 | balanced-match@^1.0.0: 223 | version "1.0.0" 224 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 225 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 226 | 227 | brace-expansion@^1.1.7: 228 | version "1.1.11" 229 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 230 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 231 | dependencies: 232 | balanced-match "^1.0.0" 233 | concat-map "0.0.1" 234 | 235 | cache-content-type@^1.0.0: 236 | version "1.0.1" 237 | resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" 238 | integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== 239 | dependencies: 240 | mime-types "^2.1.18" 241 | ylru "^1.2.0" 242 | 243 | chalk@^2.4.1, chalk@^2.4.2: 244 | version "2.4.2" 245 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 246 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 247 | dependencies: 248 | ansi-styles "^3.2.1" 249 | escape-string-regexp "^1.0.5" 250 | supports-color "^5.3.0" 251 | 252 | chalk@^3.0.0: 253 | version "3.0.0" 254 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 255 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 256 | dependencies: 257 | ansi-styles "^4.1.0" 258 | supports-color "^7.1.0" 259 | 260 | chalk@^4.0.0: 261 | version "4.0.0" 262 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" 263 | integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== 264 | dependencies: 265 | ansi-styles "^4.1.0" 266 | supports-color "^7.1.0" 267 | 268 | chardet@^0.7.0: 269 | version "0.7.0" 270 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 271 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 272 | 273 | cli-cursor@^3.1.0: 274 | version "3.1.0" 275 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 276 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 277 | dependencies: 278 | restore-cursor "^3.1.0" 279 | 280 | cli-spinners@^2.2.0: 281 | version "2.3.0" 282 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz#0632239a4b5aa4c958610142c34bb7a651fc8df5" 283 | integrity sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w== 284 | 285 | cli-width@^2.0.0: 286 | version "2.2.1" 287 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" 288 | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== 289 | 290 | clone@^1.0.2: 291 | version "1.0.4" 292 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 293 | integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= 294 | 295 | co@^4.6.0: 296 | version "4.6.0" 297 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 298 | integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= 299 | 300 | color-convert@^1.9.0: 301 | version "1.9.3" 302 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 303 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 304 | dependencies: 305 | color-name "1.1.3" 306 | 307 | color-convert@^2.0.1: 308 | version "2.0.1" 309 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 310 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 311 | dependencies: 312 | color-name "~1.1.4" 313 | 314 | color-name@1.1.3: 315 | version "1.1.3" 316 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 317 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 318 | 319 | color-name@~1.1.4: 320 | version "1.1.4" 321 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 322 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 323 | 324 | combined-stream@^1.0.8: 325 | version "1.0.8" 326 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 327 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 328 | dependencies: 329 | delayed-stream "~1.0.0" 330 | 331 | concat-map@0.0.1: 332 | version "0.0.1" 333 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 334 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 335 | 336 | content-disposition@~0.5.2: 337 | version "0.5.3" 338 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 339 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 340 | dependencies: 341 | safe-buffer "5.1.2" 342 | 343 | content-type@^1.0.4: 344 | version "1.0.4" 345 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 346 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 347 | 348 | cookies@~0.8.0: 349 | version "0.8.0" 350 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" 351 | integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== 352 | dependencies: 353 | depd "~2.0.0" 354 | keygrip "~1.1.0" 355 | 356 | cross-spawn@^6.0.5: 357 | version "6.0.5" 358 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 359 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 360 | dependencies: 361 | nice-try "^1.0.4" 362 | path-key "^2.0.1" 363 | semver "^5.5.0" 364 | shebang-command "^1.2.0" 365 | which "^1.2.9" 366 | 367 | debug@^3.1.0: 368 | version "3.2.6" 369 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 370 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 371 | dependencies: 372 | ms "^2.1.1" 373 | 374 | debug@~3.1.0: 375 | version "3.1.0" 376 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 377 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 378 | dependencies: 379 | ms "2.0.0" 380 | 381 | deep-equal@~1.0.1: 382 | version "1.0.1" 383 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 384 | integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= 385 | 386 | defaults@^1.0.3: 387 | version "1.0.3" 388 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 389 | integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= 390 | dependencies: 391 | clone "^1.0.2" 392 | 393 | define-properties@^1.1.2, define-properties@^1.1.3: 394 | version "1.1.3" 395 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 396 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 397 | dependencies: 398 | object-keys "^1.0.12" 399 | 400 | delayed-stream@~1.0.0: 401 | version "1.0.0" 402 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 403 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 404 | 405 | delegates@^1.0.0: 406 | version "1.0.0" 407 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 408 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 409 | 410 | depd@^1.1.2, depd@~1.1.2: 411 | version "1.1.2" 412 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 413 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 414 | 415 | depd@~2.0.0: 416 | version "2.0.0" 417 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 418 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 419 | 420 | destroy@^1.0.4: 421 | version "1.0.4" 422 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 423 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 424 | 425 | ee-first@1.1.1: 426 | version "1.1.1" 427 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 428 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 429 | 430 | emoji-regex@^8.0.0: 431 | version "8.0.0" 432 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 433 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 434 | 435 | encodeurl@^1.0.2: 436 | version "1.0.2" 437 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 438 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 439 | 440 | end-of-stream@^1.1.0: 441 | version "1.4.4" 442 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 443 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 444 | dependencies: 445 | once "^1.4.0" 446 | 447 | error-ex@^1.3.1: 448 | version "1.3.2" 449 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 450 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 451 | dependencies: 452 | is-arrayish "^0.2.1" 453 | 454 | error-inject@^1.0.0: 455 | version "1.0.0" 456 | resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 457 | integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= 458 | 459 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 460 | version "1.17.5" 461 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 462 | integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== 463 | dependencies: 464 | es-to-primitive "^1.2.1" 465 | function-bind "^1.1.1" 466 | has "^1.0.3" 467 | has-symbols "^1.0.1" 468 | is-callable "^1.1.5" 469 | is-regex "^1.0.5" 470 | object-inspect "^1.7.0" 471 | object-keys "^1.1.1" 472 | object.assign "^4.1.0" 473 | string.prototype.trimleft "^2.1.1" 474 | string.prototype.trimright "^2.1.1" 475 | 476 | es-module-lexer@^0.3.18: 477 | version "0.3.18" 478 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.3.18.tgz#b1a16f8166806c705216acb4517175bdb27d16b5" 479 | integrity sha512-xu/9M+womMLsLbr6SVRfVYvGfgUJjZcDtz9c2DdE4ip9s7OhpLpyJcyLofLnI6E1fbqv9LuYGWKBcRK6B6lBFA== 480 | 481 | es-to-primitive@^1.2.1: 482 | version "1.2.1" 483 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 484 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 485 | dependencies: 486 | is-callable "^1.1.4" 487 | is-date-object "^1.0.1" 488 | is-symbol "^1.0.2" 489 | 490 | escape-html@^1.0.3: 491 | version "1.0.3" 492 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 493 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 494 | 495 | escape-string-regexp@^1.0.5: 496 | version "1.0.5" 497 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 498 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 499 | 500 | estree-walker@^2.0.1: 501 | version "2.0.1" 502 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0" 503 | integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg== 504 | 505 | etag@^1.3.0: 506 | version "1.8.1" 507 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 508 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 509 | 510 | external-editor@^3.0.3: 511 | version "3.1.0" 512 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 513 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 514 | dependencies: 515 | chardet "^0.7.0" 516 | iconv-lite "^0.4.24" 517 | tmp "^0.0.33" 518 | 519 | figures@^3.0.0: 520 | version "3.2.0" 521 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" 522 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 523 | dependencies: 524 | escape-string-regexp "^1.0.5" 525 | 526 | form-data@^3.0.0: 527 | version "3.0.0" 528 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" 529 | integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== 530 | dependencies: 531 | asynckit "^0.4.0" 532 | combined-stream "^1.0.8" 533 | mime-types "^2.1.12" 534 | 535 | fresh@~0.5.2: 536 | version "0.5.2" 537 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 538 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 539 | 540 | function-bind@^1.1.1: 541 | version "1.1.1" 542 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 543 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 544 | 545 | get-stream@^5.1.0: 546 | version "5.1.0" 547 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" 548 | integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== 549 | dependencies: 550 | pump "^3.0.0" 551 | 552 | graceful-fs@^4.1.2: 553 | version "4.2.4" 554 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 555 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 556 | 557 | has-flag@^3.0.0: 558 | version "3.0.0" 559 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 560 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 561 | 562 | has-flag@^4.0.0: 563 | version "4.0.0" 564 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 565 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 566 | 567 | has-symbols@^1.0.0, has-symbols@^1.0.1: 568 | version "1.0.1" 569 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 570 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 571 | 572 | has@^1.0.3: 573 | version "1.0.3" 574 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 575 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 576 | dependencies: 577 | function-bind "^1.1.1" 578 | 579 | hosted-git-info@^2.1.4: 580 | version "2.8.8" 581 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 582 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 583 | 584 | http-assert@^1.3.0: 585 | version "1.4.1" 586 | resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878" 587 | integrity sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw== 588 | dependencies: 589 | deep-equal "~1.0.1" 590 | http-errors "~1.7.2" 591 | 592 | http-errors@^1.6.3, http-errors@~1.7.2: 593 | version "1.7.3" 594 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 595 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 596 | dependencies: 597 | depd "~1.1.2" 598 | inherits "2.0.4" 599 | setprototypeof "1.1.1" 600 | statuses ">= 1.5.0 < 2" 601 | toidentifier "1.0.0" 602 | 603 | http-errors@~1.6.2: 604 | version "1.6.3" 605 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 606 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 607 | dependencies: 608 | depd "~1.1.2" 609 | inherits "2.0.3" 610 | setprototypeof "1.1.0" 611 | statuses ">= 1.4.0 < 2" 612 | 613 | iconv-lite@^0.4.24: 614 | version "0.4.24" 615 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 616 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 617 | dependencies: 618 | safer-buffer ">= 2.1.2 < 3" 619 | 620 | inherits@2.0.3: 621 | version "2.0.3" 622 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 623 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 624 | 625 | inherits@2.0.4: 626 | version "2.0.4" 627 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 628 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 629 | 630 | inquirer@^7.1.0: 631 | version "7.1.0" 632 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" 633 | integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== 634 | dependencies: 635 | ansi-escapes "^4.2.1" 636 | chalk "^3.0.0" 637 | cli-cursor "^3.1.0" 638 | cli-width "^2.0.0" 639 | external-editor "^3.0.3" 640 | figures "^3.0.0" 641 | lodash "^4.17.15" 642 | mute-stream "0.0.8" 643 | run-async "^2.4.0" 644 | rxjs "^6.5.3" 645 | string-width "^4.1.0" 646 | strip-ansi "^6.0.0" 647 | through "^2.3.6" 648 | 649 | is-arrayish@^0.2.1: 650 | version "0.2.1" 651 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 652 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 653 | 654 | is-callable@^1.1.4, is-callable@^1.1.5: 655 | version "1.1.5" 656 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 657 | integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== 658 | 659 | is-date-object@^1.0.1: 660 | version "1.0.2" 661 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 662 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 663 | 664 | is-fullwidth-code-point@^3.0.0: 665 | version "3.0.0" 666 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 667 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 668 | 669 | is-generator-function@^1.0.7: 670 | version "1.0.7" 671 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" 672 | integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw== 673 | 674 | is-interactive@^1.0.0: 675 | version "1.0.0" 676 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" 677 | integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== 678 | 679 | is-regex@^1.0.5: 680 | version "1.0.5" 681 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 682 | integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== 683 | dependencies: 684 | has "^1.0.3" 685 | 686 | is-symbol@^1.0.2: 687 | version "1.0.3" 688 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 689 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 690 | dependencies: 691 | has-symbols "^1.0.1" 692 | 693 | isexe@^2.0.0: 694 | version "2.0.0" 695 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 696 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 697 | 698 | json-parse-better-errors@^1.0.1: 699 | version "1.0.2" 700 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 701 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 702 | 703 | keygrip@~1.1.0: 704 | version "1.1.0" 705 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" 706 | integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== 707 | dependencies: 708 | tsscmp "1.0.6" 709 | 710 | koa-compose@^3.0.0: 711 | version "3.2.1" 712 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" 713 | integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec= 714 | dependencies: 715 | any-promise "^1.1.0" 716 | 717 | koa-compose@^4.1.0: 718 | version "4.1.0" 719 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" 720 | integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== 721 | 722 | koa-conditional-get@^2.0.0: 723 | version "2.0.0" 724 | resolved "https://registry.yarnpkg.com/koa-conditional-get/-/koa-conditional-get-2.0.0.tgz#a43f3723c1d014b730a34ece8adf30b93c8233f2" 725 | integrity sha1-pD83I8HQFLcwo07Oit8wuTyCM/I= 726 | 727 | koa-convert@^1.2.0: 728 | version "1.2.0" 729 | resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" 730 | integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA= 731 | dependencies: 732 | co "^4.6.0" 733 | koa-compose "^3.0.0" 734 | 735 | koa-etag@^3.0.0: 736 | version "3.0.0" 737 | resolved "https://registry.yarnpkg.com/koa-etag/-/koa-etag-3.0.0.tgz#9ef7382ddd5a82ab0deb153415c915836f771d3f" 738 | integrity sha1-nvc4Ld1agqsN6xU0FckVg293HT8= 739 | dependencies: 740 | etag "^1.3.0" 741 | mz "^2.1.0" 742 | 743 | koa-send@^5.0.0: 744 | version "5.0.0" 745 | resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.0.tgz#5e8441e07ef55737734d7ced25b842e50646e7eb" 746 | integrity sha512-90ZotV7t0p3uN9sRwW2D484rAaKIsD8tAVtypw/aBU+ryfV+fR2xrcAwhI8Wl6WRkojLUs/cB9SBSCuIb+IanQ== 747 | dependencies: 748 | debug "^3.1.0" 749 | http-errors "^1.6.3" 750 | mz "^2.7.0" 751 | resolve-path "^1.4.0" 752 | 753 | koa-static@^5.0.0: 754 | version "5.0.0" 755 | resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" 756 | integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== 757 | dependencies: 758 | debug "^3.1.0" 759 | koa-send "^5.0.0" 760 | 761 | koa@^2.11.0: 762 | version "2.11.0" 763 | resolved "https://registry.yarnpkg.com/koa/-/koa-2.11.0.tgz#fe5a51c46f566d27632dd5dc8fd5d7dd44f935a4" 764 | integrity sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA== 765 | dependencies: 766 | accepts "^1.3.5" 767 | cache-content-type "^1.0.0" 768 | content-disposition "~0.5.2" 769 | content-type "^1.0.4" 770 | cookies "~0.8.0" 771 | debug "~3.1.0" 772 | delegates "^1.0.0" 773 | depd "^1.1.2" 774 | destroy "^1.0.4" 775 | encodeurl "^1.0.2" 776 | error-inject "^1.0.0" 777 | escape-html "^1.0.3" 778 | fresh "~0.5.2" 779 | http-assert "^1.3.0" 780 | http-errors "^1.6.3" 781 | is-generator-function "^1.0.7" 782 | koa-compose "^4.1.0" 783 | koa-convert "^1.2.0" 784 | on-finished "^2.3.0" 785 | only "~0.0.2" 786 | parseurl "^1.3.2" 787 | statuses "^1.5.0" 788 | type-is "^1.6.16" 789 | vary "^1.1.2" 790 | 791 | load-json-file@^4.0.0: 792 | version "4.0.0" 793 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" 794 | integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= 795 | dependencies: 796 | graceful-fs "^4.1.2" 797 | parse-json "^4.0.0" 798 | pify "^3.0.0" 799 | strip-bom "^3.0.0" 800 | 801 | lodash@^4.17.15: 802 | version "4.17.15" 803 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 804 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 805 | 806 | log-symbols@^3.0.0: 807 | version "3.0.0" 808 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 809 | integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== 810 | dependencies: 811 | chalk "^2.4.2" 812 | 813 | lru-cache@^5.1.1: 814 | version "5.1.1" 815 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 816 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 817 | dependencies: 818 | yallist "^3.0.2" 819 | 820 | magic-string@^0.25.7: 821 | version "0.25.7" 822 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" 823 | integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== 824 | dependencies: 825 | sourcemap-codec "^1.4.4" 826 | 827 | media-typer@0.3.0: 828 | version "0.3.0" 829 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 830 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 831 | 832 | memorystream@^0.3.1: 833 | version "0.3.1" 834 | resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" 835 | integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= 836 | 837 | mime-db@1.44.0: 838 | version "1.44.0" 839 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 840 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 841 | 842 | mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24: 843 | version "2.1.27" 844 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 845 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 846 | dependencies: 847 | mime-db "1.44.0" 848 | 849 | mimic-fn@^2.1.0: 850 | version "2.1.0" 851 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 852 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 853 | 854 | minimatch@^3.0.4: 855 | version "3.0.4" 856 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 857 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 858 | dependencies: 859 | brace-expansion "^1.1.7" 860 | 861 | ms@2.0.0: 862 | version "2.0.0" 863 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 864 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 865 | 866 | ms@^2.1.1: 867 | version "2.1.2" 868 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 869 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 870 | 871 | mute-stream@0.0.8: 872 | version "0.0.8" 873 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 874 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 875 | 876 | mz@^2.1.0, mz@^2.7.0: 877 | version "2.7.0" 878 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 879 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 880 | dependencies: 881 | any-promise "^1.0.0" 882 | object-assign "^4.0.1" 883 | thenify-all "^1.0.0" 884 | 885 | negotiator@0.6.2: 886 | version "0.6.2" 887 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 888 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 889 | 890 | nice-try@^1.0.4: 891 | version "1.0.5" 892 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 893 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 894 | 895 | node-fetch@^2.6.0: 896 | version "2.6.0" 897 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" 898 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 899 | 900 | normalize-package-data@^2.3.2: 901 | version "2.5.0" 902 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 903 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 904 | dependencies: 905 | hosted-git-info "^2.1.4" 906 | resolve "^1.10.0" 907 | semver "2 || 3 || 4 || 5" 908 | validate-npm-package-license "^3.0.1" 909 | 910 | npm-run-all@^4.1.5: 911 | version "4.1.5" 912 | resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" 913 | integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== 914 | dependencies: 915 | ansi-styles "^3.2.1" 916 | chalk "^2.4.1" 917 | cross-spawn "^6.0.5" 918 | memorystream "^0.3.1" 919 | minimatch "^3.0.4" 920 | pidtree "^0.3.0" 921 | read-pkg "^3.0.0" 922 | shell-quote "^1.6.1" 923 | string.prototype.padend "^3.0.0" 924 | 925 | object-assign@^4.0.1: 926 | version "4.1.1" 927 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 928 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 929 | 930 | object-inspect@^1.7.0: 931 | version "1.7.0" 932 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 933 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 934 | 935 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 936 | version "1.1.1" 937 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 938 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 939 | 940 | object.assign@^4.1.0: 941 | version "4.1.0" 942 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 943 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 944 | dependencies: 945 | define-properties "^1.1.2" 946 | function-bind "^1.1.1" 947 | has-symbols "^1.0.0" 948 | object-keys "^1.0.11" 949 | 950 | on-finished@^2.3.0: 951 | version "2.3.0" 952 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 953 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 954 | dependencies: 955 | ee-first "1.1.1" 956 | 957 | once@^1.3.1, once@^1.4.0: 958 | version "1.4.0" 959 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 960 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 961 | dependencies: 962 | wrappy "1" 963 | 964 | onetime@^5.1.0: 965 | version "5.1.0" 966 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 967 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 968 | dependencies: 969 | mimic-fn "^2.1.0" 970 | 971 | only@~0.0.2: 972 | version "0.0.2" 973 | resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 974 | integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= 975 | 976 | ora@^4.0.4: 977 | version "4.0.4" 978 | resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d" 979 | integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww== 980 | dependencies: 981 | chalk "^3.0.0" 982 | cli-cursor "^3.1.0" 983 | cli-spinners "^2.2.0" 984 | is-interactive "^1.0.0" 985 | log-symbols "^3.0.0" 986 | mute-stream "0.0.8" 987 | strip-ansi "^6.0.0" 988 | wcwidth "^1.0.1" 989 | 990 | os-tmpdir@~1.0.2: 991 | version "1.0.2" 992 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 993 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 994 | 995 | parse-json@^4.0.0: 996 | version "4.0.0" 997 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 998 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 999 | dependencies: 1000 | error-ex "^1.3.1" 1001 | json-parse-better-errors "^1.0.1" 1002 | 1003 | parseurl@^1.3.2: 1004 | version "1.3.3" 1005 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1006 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1007 | 1008 | path-is-absolute@1.0.1: 1009 | version "1.0.1" 1010 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1011 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1012 | 1013 | path-key@^2.0.1: 1014 | version "2.0.1" 1015 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1016 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1017 | 1018 | path-parse@^1.0.6: 1019 | version "1.0.6" 1020 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1021 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1022 | 1023 | path-type@^3.0.0: 1024 | version "3.0.0" 1025 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" 1026 | integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== 1027 | dependencies: 1028 | pify "^3.0.0" 1029 | 1030 | pidtree@^0.3.0: 1031 | version "0.3.1" 1032 | resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" 1033 | integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== 1034 | 1035 | pify@^3.0.0: 1036 | version "3.0.0" 1037 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1038 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1039 | 1040 | pump@^3.0.0: 1041 | version "3.0.0" 1042 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1043 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1044 | dependencies: 1045 | end-of-stream "^1.1.0" 1046 | once "^1.3.1" 1047 | 1048 | read-pkg@^3.0.0: 1049 | version "3.0.0" 1050 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" 1051 | integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= 1052 | dependencies: 1053 | load-json-file "^4.0.0" 1054 | normalize-package-data "^2.3.2" 1055 | path-type "^3.0.0" 1056 | 1057 | resolve-from@^5.0.0: 1058 | version "5.0.0" 1059 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1060 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1061 | 1062 | resolve-path@^1.4.0: 1063 | version "1.4.0" 1064 | resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" 1065 | integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= 1066 | dependencies: 1067 | http-errors "~1.6.2" 1068 | path-is-absolute "1.0.1" 1069 | 1070 | resolve@^1.10.0: 1071 | version "1.17.0" 1072 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1073 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1074 | dependencies: 1075 | path-parse "^1.0.6" 1076 | 1077 | restore-cursor@^3.1.0: 1078 | version "3.1.0" 1079 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1080 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1081 | dependencies: 1082 | onetime "^5.1.0" 1083 | signal-exit "^3.0.2" 1084 | 1085 | run-async@^2.4.0: 1086 | version "2.4.1" 1087 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 1088 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 1089 | 1090 | rxjs@^6.4.0, rxjs@^6.5.3: 1091 | version "6.5.5" 1092 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" 1093 | integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== 1094 | dependencies: 1095 | tslib "^1.9.0" 1096 | 1097 | safe-buffer@5.1.2: 1098 | version "5.1.2" 1099 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1100 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1101 | 1102 | "safer-buffer@>= 2.1.2 < 3": 1103 | version "2.1.2" 1104 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1105 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1106 | 1107 | "semver@2 || 3 || 4 || 5", semver@^5.5.0: 1108 | version "5.7.1" 1109 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1110 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1111 | 1112 | setprototypeof@1.1.0: 1113 | version "1.1.0" 1114 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 1115 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 1116 | 1117 | setprototypeof@1.1.1: 1118 | version "1.1.1" 1119 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1120 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1121 | 1122 | shebang-command@^1.2.0: 1123 | version "1.2.0" 1124 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1125 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1126 | dependencies: 1127 | shebang-regex "^1.0.0" 1128 | 1129 | shebang-regex@^1.0.0: 1130 | version "1.0.0" 1131 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1132 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1133 | 1134 | shell-quote@^1.6.1: 1135 | version "1.7.2" 1136 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" 1137 | integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== 1138 | 1139 | signal-exit@^3.0.2: 1140 | version "3.0.3" 1141 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1142 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1143 | 1144 | sourcemap-codec@^1.4.4: 1145 | version "1.4.8" 1146 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 1147 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1148 | 1149 | spdx-correct@^3.0.0: 1150 | version "3.1.0" 1151 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 1152 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 1153 | dependencies: 1154 | spdx-expression-parse "^3.0.0" 1155 | spdx-license-ids "^3.0.0" 1156 | 1157 | spdx-exceptions@^2.1.0: 1158 | version "2.3.0" 1159 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1160 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1161 | 1162 | spdx-expression-parse@^3.0.0: 1163 | version "3.0.0" 1164 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1165 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 1166 | dependencies: 1167 | spdx-exceptions "^2.1.0" 1168 | spdx-license-ids "^3.0.0" 1169 | 1170 | spdx-license-ids@^3.0.0: 1171 | version "3.0.5" 1172 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1173 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 1174 | 1175 | "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: 1176 | version "1.5.0" 1177 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1178 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1179 | 1180 | string-width@^4.1.0: 1181 | version "4.2.0" 1182 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1183 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1184 | dependencies: 1185 | emoji-regex "^8.0.0" 1186 | is-fullwidth-code-point "^3.0.0" 1187 | strip-ansi "^6.0.0" 1188 | 1189 | string.prototype.padend@^3.0.0: 1190 | version "3.1.0" 1191 | resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3" 1192 | integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA== 1193 | dependencies: 1194 | define-properties "^1.1.3" 1195 | es-abstract "^1.17.0-next.1" 1196 | 1197 | string.prototype.trimend@^1.0.0: 1198 | version "1.0.1" 1199 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1200 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 1201 | dependencies: 1202 | define-properties "^1.1.3" 1203 | es-abstract "^1.17.5" 1204 | 1205 | string.prototype.trimleft@^2.1.1: 1206 | version "2.1.2" 1207 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 1208 | integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== 1209 | dependencies: 1210 | define-properties "^1.1.3" 1211 | es-abstract "^1.17.5" 1212 | string.prototype.trimstart "^1.0.0" 1213 | 1214 | string.prototype.trimright@^2.1.1: 1215 | version "2.1.2" 1216 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 1217 | integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== 1218 | dependencies: 1219 | define-properties "^1.1.3" 1220 | es-abstract "^1.17.5" 1221 | string.prototype.trimend "^1.0.0" 1222 | 1223 | string.prototype.trimstart@^1.0.0: 1224 | version "1.0.1" 1225 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1226 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 1227 | dependencies: 1228 | define-properties "^1.1.3" 1229 | es-abstract "^1.17.5" 1230 | 1231 | strip-ansi@^6.0.0: 1232 | version "6.0.0" 1233 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1234 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1235 | dependencies: 1236 | ansi-regex "^5.0.0" 1237 | 1238 | strip-bom@^3.0.0: 1239 | version "3.0.0" 1240 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1241 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1242 | 1243 | supports-color@^5.3.0: 1244 | version "5.5.0" 1245 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1246 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1247 | dependencies: 1248 | has-flag "^3.0.0" 1249 | 1250 | supports-color@^7.1.0: 1251 | version "7.1.0" 1252 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1253 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1254 | dependencies: 1255 | has-flag "^4.0.0" 1256 | 1257 | svelte-hmr@^0.7.0: 1258 | version "0.7.0" 1259 | resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.7.0.tgz#a287ad8b1bec984fbd08e882e34b297a66c7194e" 1260 | integrity sha512-FEKgu6TwqHdKisQq7PtBgexBA+0FDyyB2uSfg0vcEP4E8XQv++xaOVfz/ZwTlouj4p/au1D7oxgJwNEzqpcclg== 1261 | 1262 | svelte@^3.21.0: 1263 | version "3.21.0" 1264 | resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.21.0.tgz#e326591cb92267e90b4fb5b961d80d9763792551" 1265 | integrity sha512-smh3LZKPCGJ+UXa0iZvUmuDctPYCwPY1opmClTWTm+l6e4y9FHLoCZMiue8YIeyc9JvlGT/EK0xry0diXjFDZQ== 1266 | 1267 | thenify-all@^1.0.0: 1268 | version "1.6.0" 1269 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 1270 | integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 1271 | dependencies: 1272 | thenify ">= 3.1.0 < 4" 1273 | 1274 | "thenify@>= 3.1.0 < 4": 1275 | version "3.3.0" 1276 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" 1277 | integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= 1278 | dependencies: 1279 | any-promise "^1.0.0" 1280 | 1281 | through@^2.3.6: 1282 | version "2.3.8" 1283 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1284 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1285 | 1286 | tmp@^0.0.33: 1287 | version "0.0.33" 1288 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1289 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1290 | dependencies: 1291 | os-tmpdir "~1.0.2" 1292 | 1293 | toidentifier@1.0.0: 1294 | version "1.0.0" 1295 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1296 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1297 | 1298 | tslib@^1.9.0: 1299 | version "1.11.1" 1300 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" 1301 | integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== 1302 | 1303 | tsscmp@1.0.6: 1304 | version "1.0.6" 1305 | resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" 1306 | integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== 1307 | 1308 | type-fest@^0.11.0: 1309 | version "0.11.0" 1310 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" 1311 | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== 1312 | 1313 | type-is@^1.6.16: 1314 | version "1.6.18" 1315 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1316 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1317 | dependencies: 1318 | media-typer "0.3.0" 1319 | mime-types "~2.1.24" 1320 | 1321 | typescript@^3.8.3: 1322 | version "3.8.3" 1323 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" 1324 | integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== 1325 | 1326 | validate-npm-package-license@^3.0.1: 1327 | version "3.0.4" 1328 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1329 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1330 | dependencies: 1331 | spdx-correct "^3.0.0" 1332 | spdx-expression-parse "^3.0.0" 1333 | 1334 | vary@^1.1.2: 1335 | version "1.1.2" 1336 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1337 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1338 | 1339 | wcwidth@^1.0.1: 1340 | version "1.0.1" 1341 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 1342 | integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= 1343 | dependencies: 1344 | defaults "^1.0.3" 1345 | 1346 | which@^1.2.9: 1347 | version "1.3.1" 1348 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1349 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1350 | dependencies: 1351 | isexe "^2.0.0" 1352 | 1353 | wrappy@1: 1354 | version "1.0.2" 1355 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1356 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1357 | 1358 | ws@^7.2.5: 1359 | version "7.2.5" 1360 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.5.tgz#abb1370d4626a5a9cd79d8de404aa18b3465d10d" 1361 | integrity sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA== 1362 | 1363 | yallist@^3.0.2: 1364 | version "3.1.1" 1365 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1366 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1367 | 1368 | ylru@^1.2.0: 1369 | version "1.2.1" 1370 | resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" 1371 | integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== 1372 | --------------------------------------------------------------------------------