├── .gitignore ├── test ├── main.js ├── index.html └── test.vue ├── bin └── vue-dev-server.js ├── readSource.js ├── loadPkg.js ├── transformModuleImports.js ├── package.json ├── LICENSE ├── README.md ├── middleware.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | -------------------------------------------------------------------------------- /test/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './test.vue' 3 | 4 | new Vue({ 5 | render: h => h(App) 6 | }).$mount('#app') 7 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Vue Dev Server 6 | 7 | 8 |
9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /test/test.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /bin/vue-dev-server.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const express = require('express') 4 | const { vueMiddleware } = require('../middleware') 5 | 6 | const app = express() 7 | const root = process.cwd(); 8 | 9 | app.use(vueMiddleware()) 10 | 11 | app.use(express.static(root)) 12 | 13 | app.listen(3000, () => { 14 | console.log('server running at http://localhost:3000') 15 | }) 16 | -------------------------------------------------------------------------------- /readSource.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const fs = require('fs') 3 | const readFile = require('util').promisify(fs.readFile) 4 | const stat = require('util').promisify(fs.stat) 5 | const parseUrl = require('parseurl') 6 | const root = process.cwd() 7 | 8 | async function readSource(req) { 9 | const { pathname } = parseUrl(req) 10 | const filepath = path.resolve(root, pathname.replace(/^\//, '')) 11 | return { 12 | filepath, 13 | source: await readFile(filepath, 'utf-8'), 14 | updateTime: (await stat(filepath)).mtime.getTime() 15 | } 16 | } 17 | 18 | exports.readSource = readSource 19 | -------------------------------------------------------------------------------- /loadPkg.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const readFile = require('util').promisify(fs.readFile) 4 | 5 | async function loadPkg(pkg) { 6 | if (pkg === 'vue') { 7 | const dir = path.dirname(require.resolve('vue')) 8 | const filepath = path.join(dir, 'vue.esm.browser.js') 9 | return readFile(filepath) 10 | } 11 | else { 12 | // TODO 13 | // check if the package has a browser es module that can be used 14 | // otherwise bundle it with rollup on the fly? 15 | throw new Error('npm imports support are not ready yet.') 16 | } 17 | } 18 | 19 | exports.loadPkg = loadPkg 20 | -------------------------------------------------------------------------------- /transformModuleImports.js: -------------------------------------------------------------------------------- 1 | const recast = require('recast') 2 | const isPkg = require('validate-npm-package-name') 3 | 4 | function transformModuleImports(code) { 5 | const ast = recast.parse(code) 6 | recast.types.visit(ast, { 7 | visitImportDeclaration(path) { 8 | const source = path.node.source.value 9 | if (!/^\.\/?/.test(source) && isPkg(source)) { 10 | path.node.source = recast.types.builders.literal(`/__modules/${source}`) 11 | } 12 | this.traverse(path) 13 | } 14 | }) 15 | return recast.print(ast).code 16 | } 17 | 18 | exports.transformModuleImports = transformModuleImports 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@vue/dev-server", 3 | "version": "0.1.1", 4 | "description": "Instant dev server for Vue single file components", 5 | "main": "middleware.js", 6 | "bin": { 7 | "vue-dev-server": "./bin/vue-dev-server.js" 8 | }, 9 | "scripts": { 10 | "test": "cd test && node ../bin/vue-dev-server.js" 11 | }, 12 | "author": "Evan You", 13 | "license": "MIT", 14 | "dependencies": { 15 | "@vue/component-compiler": "^3.6.0", 16 | "express": "^4.16.4", 17 | "lru-cache": "^5.1.1", 18 | "recast": "^0.17.3", 19 | "validate-npm-package-name": "^3.0.0", 20 | "vue": "^2.6.8", 21 | "vue-template-compiler": "^2.6.8" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Evan You 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @vue/dev-server 2 | 3 | > **This is a proof of concept.** 4 | > 5 | > Imagine you can import Vue single-file components natively in your browser... without a build step. 6 | 7 | In an directory, create an `index.html`: 8 | 9 | ``` html 10 |
11 | 19 | ``` 20 | 21 | In `App.vue`: 22 | 23 | ``` vue 24 | 27 | 28 | 37 | 38 | 43 | ``` 44 | 45 | Then: 46 | 47 | ``` bash 48 | npm i @vue/dev-server 49 | npx vue-dev-server 50 | ``` 51 | 52 | ## How It Works 53 | 54 | - Imports are requested by the browser as native ES module imports - there's no bundling. 55 | 56 | - The server intercepts requests to `*.vue` files, compiles them on the fly, and sends them back as JavaScript. 57 | 58 | - For libraries that provide ES modules builds that work in browsers, just directly import them from a CDN. 59 | 60 | - Imports to npm packages inside `.js` files (package name only) are re-written on the fly to point to locally installed files. Currently, only `vue` is supported as a special case. Other packages will likely need to be transformed to be exposed as a native browser-targeting ES module. 61 | 62 | ## TODOs 63 | 64 | - [x] Caching 65 | - [ ] NPM module imports 66 | - [ ] Pre-processors 67 | -------------------------------------------------------------------------------- /middleware.js: -------------------------------------------------------------------------------- 1 | const vueCompiler = require('@vue/component-compiler') 2 | const fs = require('fs') 3 | const stat = require('util').promisify(fs.stat) 4 | const root = process.cwd() 5 | const path = require('path') 6 | const parseUrl = require('parseurl') 7 | const { transformModuleImports } = require('./transformModuleImports') 8 | const { loadPkg } = require('./loadPkg') 9 | const { readSource } = require('./readSource') 10 | 11 | const defaultOptions = { 12 | cache: true 13 | } 14 | 15 | const vueMiddleware = (options = defaultOptions) => { 16 | let cache 17 | let time = {} 18 | if (options.cache) { 19 | const LRU = require('lru-cache') 20 | 21 | cache = new LRU({ 22 | max: 500, 23 | length: function (n, key) { return n * 2 + key.length } 24 | }) 25 | } 26 | 27 | const compiler = vueCompiler.createDefaultCompiler() 28 | 29 | function send(res, source, mime) { 30 | res.setHeader('Content-Type', mime) 31 | res.end(source) 32 | } 33 | 34 | function injectSourceMapToBlock (block, lang) { 35 | const map = Base64.toBase64( 36 | JSON.stringify(block.map) 37 | ) 38 | let mapInject 39 | 40 | switch (lang) { 41 | case 'js': mapInject = `//# sourceMappingURL=data:application/json;base64,${map}\n`; break; 42 | case 'css': mapInject = `/*# sourceMappingURL=data:application/json;base64,${map}*/\n`; break; 43 | default: break; 44 | } 45 | 46 | return { 47 | ...block, 48 | code: mapInject + block.code 49 | } 50 | } 51 | 52 | function injectSourceMapToScript (script) { 53 | return injectSourceMapToBlock(script, 'js') 54 | } 55 | 56 | function injectSourceMapsToStyles (styles) { 57 | return styles.map(style => injectSourceMapToBlock(style, 'css')) 58 | } 59 | 60 | async function tryCache (key, checkUpdateTime = true) { 61 | const data = cache.get(key) 62 | 63 | if (checkUpdateTime) { 64 | const cacheUpdateTime = time[key] 65 | const fileUpdateTime = (await stat(path.resolve(root, key.replace(/^\//, '')))).mtime.getTime() 66 | if (cacheUpdateTime < fileUpdateTime) return null 67 | } 68 | 69 | return data 70 | } 71 | 72 | function cacheData (key, data, updateTime) { 73 | const old = cache.peek(key) 74 | 75 | if (old != data) { 76 | cache.set(key, data) 77 | if (updateTime) time[key] = updateTime 78 | return true 79 | } else return false 80 | } 81 | 82 | async function bundleSFC (req) { 83 | const { filepath, source, updateTime } = await readSource(req) 84 | const descriptorResult = compiler.compileToDescriptor(filepath, source) 85 | const assembledResult = vueCompiler.assemble(compiler, filepath, { 86 | ...descriptorResult, 87 | script: injectSourceMapToScript(descriptorResult.script), 88 | styles: injectSourceMapsToStyles(descriptorResult.styles) 89 | }) 90 | return { ...assembledResult, updateTime } 91 | } 92 | 93 | return async (req, res, next) => { 94 | if (req.path.endsWith('.vue')) { 95 | const key = parseUrl(req).pathname 96 | let out = await tryCache(key) 97 | 98 | if (!out) { 99 | // Bundle Single-File Component 100 | const result = await bundleSFC(req) 101 | out = result 102 | cacheData(key, out, result.updateTime) 103 | } 104 | 105 | send(res, out.code, 'application/javascript') 106 | } else if (req.path.endsWith('.js')) { 107 | const key = parseUrl(req).pathname 108 | let out = await tryCache(key) 109 | 110 | if (!out) { 111 | // transform import statements 112 | const result = await readSource(req) 113 | out = transformModuleImports(result.source) 114 | cacheData(key, out, result.updateTime) 115 | } 116 | 117 | send(res, out, 'application/javascript') 118 | } else if (req.path.startsWith('/__modules/')) { 119 | const key = parseUrl(req).pathname 120 | const pkg = req.path.replace(/^\/__modules\//, '') 121 | 122 | let out = await tryCache(key, false) // Do not outdate modules 123 | if (!out) { 124 | out = (await loadPkg(pkg)).toString() 125 | cacheData(key, out, false) // Do not outdate modules 126 | } 127 | 128 | send(res, out, 'application/javascript') 129 | } else { 130 | next() 131 | } 132 | } 133 | } 134 | 135 | exports.vueMiddleware = vueMiddleware 136 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@vue/component-compiler-utils@^2.1.0": 6 | version "2.6.0" 7 | resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz#aa46d2a6f7647440b0b8932434d22f12371e543b" 8 | integrity sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw== 9 | dependencies: 10 | consolidate "^0.15.1" 11 | hash-sum "^1.0.2" 12 | lru-cache "^4.1.2" 13 | merge-source-map "^1.1.0" 14 | postcss "^7.0.14" 15 | postcss-selector-parser "^5.0.0" 16 | prettier "1.16.3" 17 | source-map "~0.6.1" 18 | vue-template-es2015-compiler "^1.9.0" 19 | 20 | "@vue/component-compiler@^3.6.0": 21 | version "3.6.0" 22 | resolved "https://registry.yarnpkg.com/@vue/component-compiler/-/component-compiler-3.6.0.tgz#8db313e50eaa2903cef5aac68c37a09364dba79d" 23 | integrity sha512-NIA0vmOI4zbtJAn69iZls8IJ8VxmguswAuiUdu8TcR+YYTYzntfw290HUCSFjzAdRg+FUWZv8r+wc3TzJ/IjwA== 24 | dependencies: 25 | "@vue/component-compiler-utils" "^2.1.0" 26 | clean-css "^4.1.11" 27 | hash-sum "^1.0.2" 28 | postcss-modules-sync "^1.0.0" 29 | source-map "0.6.*" 30 | 31 | accepts@~1.3.5: 32 | version "1.3.5" 33 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 34 | integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= 35 | dependencies: 36 | mime-types "~2.1.18" 37 | negotiator "0.6.1" 38 | 39 | ansi-regex@^2.0.0: 40 | version "2.1.1" 41 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 42 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 43 | 44 | ansi-styles@^2.2.1: 45 | version "2.2.1" 46 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 47 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 48 | 49 | ansi-styles@^3.2.1: 50 | version "3.2.1" 51 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 52 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 53 | dependencies: 54 | color-convert "^1.9.0" 55 | 56 | array-flatten@1.1.1: 57 | version "1.1.1" 58 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 59 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 60 | 61 | ast-types@0.12.2: 62 | version "0.12.2" 63 | resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.2.tgz#341656049ee328ac03fc805c156b49ebab1e4462" 64 | integrity sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg== 65 | 66 | big.js@^3.1.3: 67 | version "3.2.0" 68 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" 69 | integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== 70 | 71 | bluebird@^3.1.1: 72 | version "3.5.3" 73 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" 74 | integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== 75 | 76 | body-parser@1.18.3: 77 | version "1.18.3" 78 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 79 | integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= 80 | dependencies: 81 | bytes "3.0.0" 82 | content-type "~1.0.4" 83 | debug "2.6.9" 84 | depd "~1.1.2" 85 | http-errors "~1.6.3" 86 | iconv-lite "0.4.23" 87 | on-finished "~2.3.0" 88 | qs "6.5.2" 89 | raw-body "2.3.3" 90 | type-is "~1.6.16" 91 | 92 | builtins@^1.0.3: 93 | version "1.0.3" 94 | resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" 95 | integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= 96 | 97 | bytes@3.0.0: 98 | version "3.0.0" 99 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 100 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 101 | 102 | chalk@^1.1.3: 103 | version "1.1.3" 104 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 105 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 106 | dependencies: 107 | ansi-styles "^2.2.1" 108 | escape-string-regexp "^1.0.2" 109 | has-ansi "^2.0.0" 110 | strip-ansi "^3.0.0" 111 | supports-color "^2.0.0" 112 | 113 | chalk@^2.4.1, chalk@^2.4.2: 114 | version "2.4.2" 115 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 116 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 117 | dependencies: 118 | ansi-styles "^3.2.1" 119 | escape-string-regexp "^1.0.5" 120 | supports-color "^5.3.0" 121 | 122 | clean-css@^4.1.11: 123 | version "4.2.1" 124 | resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" 125 | integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== 126 | dependencies: 127 | source-map "~0.6.0" 128 | 129 | color-convert@^1.9.0: 130 | version "1.9.3" 131 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 132 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 133 | dependencies: 134 | color-name "1.1.3" 135 | 136 | color-name@1.1.3: 137 | version "1.1.3" 138 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 139 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 140 | 141 | consolidate@^0.15.1: 142 | version "0.15.1" 143 | resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" 144 | integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== 145 | dependencies: 146 | bluebird "^3.1.1" 147 | 148 | content-disposition@0.5.2: 149 | version "0.5.2" 150 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 151 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 152 | 153 | content-type@~1.0.4: 154 | version "1.0.4" 155 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 156 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 157 | 158 | cookie-signature@1.0.6: 159 | version "1.0.6" 160 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 161 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 162 | 163 | cookie@0.3.1: 164 | version "0.3.1" 165 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 166 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 167 | 168 | css-selector-tokenizer@^0.7.0: 169 | version "0.7.1" 170 | resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" 171 | integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== 172 | dependencies: 173 | cssesc "^0.1.0" 174 | fastparse "^1.1.1" 175 | regexpu-core "^1.0.0" 176 | 177 | cssesc@^0.1.0: 178 | version "0.1.0" 179 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" 180 | integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= 181 | 182 | cssesc@^2.0.0: 183 | version "2.0.0" 184 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" 185 | integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== 186 | 187 | de-indent@^1.0.2: 188 | version "1.0.2" 189 | resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" 190 | integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= 191 | 192 | debug@2.6.9: 193 | version "2.6.9" 194 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 195 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 196 | dependencies: 197 | ms "2.0.0" 198 | 199 | depd@~1.1.2: 200 | version "1.1.2" 201 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 202 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 203 | 204 | destroy@~1.0.4: 205 | version "1.0.4" 206 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 207 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 208 | 209 | ee-first@1.1.1: 210 | version "1.1.1" 211 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 212 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 213 | 214 | emojis-list@^2.0.0: 215 | version "2.1.0" 216 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 217 | integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= 218 | 219 | encodeurl@~1.0.2: 220 | version "1.0.2" 221 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 222 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 223 | 224 | escape-html@~1.0.3: 225 | version "1.0.3" 226 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 227 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 228 | 229 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 230 | version "1.0.5" 231 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 232 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 233 | 234 | esprima@~4.0.0: 235 | version "4.0.1" 236 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 237 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 238 | 239 | etag@~1.8.1: 240 | version "1.8.1" 241 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 242 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 243 | 244 | express@^4.16.4: 245 | version "4.16.4" 246 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" 247 | integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== 248 | dependencies: 249 | accepts "~1.3.5" 250 | array-flatten "1.1.1" 251 | body-parser "1.18.3" 252 | content-disposition "0.5.2" 253 | content-type "~1.0.4" 254 | cookie "0.3.1" 255 | cookie-signature "1.0.6" 256 | debug "2.6.9" 257 | depd "~1.1.2" 258 | encodeurl "~1.0.2" 259 | escape-html "~1.0.3" 260 | etag "~1.8.1" 261 | finalhandler "1.1.1" 262 | fresh "0.5.2" 263 | merge-descriptors "1.0.1" 264 | methods "~1.1.2" 265 | on-finished "~2.3.0" 266 | parseurl "~1.3.2" 267 | path-to-regexp "0.1.7" 268 | proxy-addr "~2.0.4" 269 | qs "6.5.2" 270 | range-parser "~1.2.0" 271 | safe-buffer "5.1.2" 272 | send "0.16.2" 273 | serve-static "1.13.2" 274 | setprototypeof "1.1.0" 275 | statuses "~1.4.0" 276 | type-is "~1.6.16" 277 | utils-merge "1.0.1" 278 | vary "~1.1.2" 279 | 280 | fastparse@^1.1.1: 281 | version "1.1.2" 282 | resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" 283 | integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== 284 | 285 | finalhandler@1.1.1: 286 | version "1.1.1" 287 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 288 | integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== 289 | dependencies: 290 | debug "2.6.9" 291 | encodeurl "~1.0.2" 292 | escape-html "~1.0.3" 293 | on-finished "~2.3.0" 294 | parseurl "~1.3.2" 295 | statuses "~1.4.0" 296 | unpipe "~1.0.0" 297 | 298 | forwarded@~0.1.2: 299 | version "0.1.2" 300 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 301 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 302 | 303 | fresh@0.5.2: 304 | version "0.5.2" 305 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 306 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 307 | 308 | generic-names@^1.0.2: 309 | version "1.0.3" 310 | resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-1.0.3.tgz#2d786a121aee508876796939e8e3bff836c20917" 311 | integrity sha1-LXhqEhruUIh2eWk56OO/+DbCCRc= 312 | dependencies: 313 | loader-utils "^0.2.16" 314 | 315 | has-ansi@^2.0.0: 316 | version "2.0.0" 317 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 318 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 319 | dependencies: 320 | ansi-regex "^2.0.0" 321 | 322 | has-flag@^1.0.0: 323 | version "1.0.0" 324 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 325 | integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= 326 | 327 | has-flag@^3.0.0: 328 | version "3.0.0" 329 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 330 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 331 | 332 | hash-sum@^1.0.2: 333 | version "1.0.2" 334 | resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" 335 | integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= 336 | 337 | he@^1.1.0: 338 | version "1.2.0" 339 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 340 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 341 | 342 | http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 343 | version "1.6.3" 344 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 345 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 346 | dependencies: 347 | depd "~1.1.2" 348 | inherits "2.0.3" 349 | setprototypeof "1.1.0" 350 | statuses ">= 1.4.0 < 2" 351 | 352 | iconv-lite@0.4.23: 353 | version "0.4.23" 354 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 355 | integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== 356 | dependencies: 357 | safer-buffer ">= 2.1.2 < 3" 358 | 359 | icss-replace-symbols@^1.0.2: 360 | version "1.1.0" 361 | resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" 362 | integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= 363 | 364 | indexes-of@^1.0.1: 365 | version "1.0.1" 366 | resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" 367 | integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= 368 | 369 | inherits@2.0.3: 370 | version "2.0.3" 371 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 372 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 373 | 374 | ipaddr.js@1.8.0: 375 | version "1.8.0" 376 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" 377 | integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= 378 | 379 | js-base64@^2.1.9: 380 | version "2.5.1" 381 | resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" 382 | integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== 383 | 384 | jsesc@~0.5.0: 385 | version "0.5.0" 386 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 387 | integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= 388 | 389 | json5@^0.5.0: 390 | version "0.5.1" 391 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 392 | integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= 393 | 394 | loader-utils@^0.2.16: 395 | version "0.2.17" 396 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" 397 | integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= 398 | dependencies: 399 | big.js "^3.1.3" 400 | emojis-list "^2.0.0" 401 | json5 "^0.5.0" 402 | object-assign "^4.0.1" 403 | 404 | lru-cache@^4.1.2: 405 | version "4.1.5" 406 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 407 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 408 | dependencies: 409 | pseudomap "^1.0.2" 410 | yallist "^2.1.2" 411 | 412 | lru-cache@^5.1.1: 413 | version "5.1.1" 414 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 415 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 416 | dependencies: 417 | yallist "^3.0.2" 418 | 419 | media-typer@0.3.0: 420 | version "0.3.0" 421 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 422 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 423 | 424 | merge-descriptors@1.0.1: 425 | version "1.0.1" 426 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 427 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 428 | 429 | merge-source-map@^1.1.0: 430 | version "1.1.0" 431 | resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" 432 | integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== 433 | dependencies: 434 | source-map "^0.6.1" 435 | 436 | methods@~1.1.2: 437 | version "1.1.2" 438 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 439 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 440 | 441 | mime-db@~1.38.0: 442 | version "1.38.0" 443 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" 444 | integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== 445 | 446 | mime-types@~2.1.18: 447 | version "2.1.22" 448 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" 449 | integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== 450 | dependencies: 451 | mime-db "~1.38.0" 452 | 453 | mime@1.4.1: 454 | version "1.4.1" 455 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 456 | integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== 457 | 458 | ms@2.0.0: 459 | version "2.0.0" 460 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 461 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 462 | 463 | negotiator@0.6.1: 464 | version "0.6.1" 465 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 466 | integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 467 | 468 | object-assign@^4.0.1: 469 | version "4.1.1" 470 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 471 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 472 | 473 | on-finished@~2.3.0: 474 | version "2.3.0" 475 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 476 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 477 | dependencies: 478 | ee-first "1.1.1" 479 | 480 | parseurl@~1.3.2: 481 | version "1.3.2" 482 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 483 | integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= 484 | 485 | path-to-regexp@0.1.7: 486 | version "0.1.7" 487 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 488 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 489 | 490 | postcss-modules-local-by-default@^1.1.1: 491 | version "1.2.0" 492 | resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" 493 | integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= 494 | dependencies: 495 | css-selector-tokenizer "^0.7.0" 496 | postcss "^6.0.1" 497 | 498 | postcss-modules-scope@^1.0.2: 499 | version "1.1.0" 500 | resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" 501 | integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= 502 | dependencies: 503 | css-selector-tokenizer "^0.7.0" 504 | postcss "^6.0.1" 505 | 506 | postcss-modules-sync@^1.0.0: 507 | version "1.0.0" 508 | resolved "https://registry.yarnpkg.com/postcss-modules-sync/-/postcss-modules-sync-1.0.0.tgz#619a719cf78dd16a4834135140b324cf77334be1" 509 | integrity sha1-YZpxnPeN0WpINBNRQLMkz3czS+E= 510 | dependencies: 511 | generic-names "^1.0.2" 512 | icss-replace-symbols "^1.0.2" 513 | postcss "^5.2.5" 514 | postcss-modules-local-by-default "^1.1.1" 515 | postcss-modules-scope "^1.0.2" 516 | string-hash "^1.1.0" 517 | 518 | postcss-selector-parser@^5.0.0: 519 | version "5.0.0" 520 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" 521 | integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== 522 | dependencies: 523 | cssesc "^2.0.0" 524 | indexes-of "^1.0.1" 525 | uniq "^1.0.1" 526 | 527 | postcss@^5.2.5: 528 | version "5.2.18" 529 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" 530 | integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== 531 | dependencies: 532 | chalk "^1.1.3" 533 | js-base64 "^2.1.9" 534 | source-map "^0.5.6" 535 | supports-color "^3.2.3" 536 | 537 | postcss@^6.0.1: 538 | version "6.0.23" 539 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" 540 | integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== 541 | dependencies: 542 | chalk "^2.4.1" 543 | source-map "^0.6.1" 544 | supports-color "^5.4.0" 545 | 546 | postcss@^7.0.14: 547 | version "7.0.14" 548 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" 549 | integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== 550 | dependencies: 551 | chalk "^2.4.2" 552 | source-map "^0.6.1" 553 | supports-color "^6.1.0" 554 | 555 | prettier@1.16.3: 556 | version "1.16.3" 557 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d" 558 | integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw== 559 | 560 | private@^0.1.8: 561 | version "0.1.8" 562 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 563 | integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 564 | 565 | proxy-addr@~2.0.4: 566 | version "2.0.4" 567 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" 568 | integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== 569 | dependencies: 570 | forwarded "~0.1.2" 571 | ipaddr.js "1.8.0" 572 | 573 | pseudomap@^1.0.2: 574 | version "1.0.2" 575 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 576 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 577 | 578 | qs@6.5.2: 579 | version "6.5.2" 580 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 581 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 582 | 583 | range-parser@~1.2.0: 584 | version "1.2.0" 585 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 586 | integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= 587 | 588 | raw-body@2.3.3: 589 | version "2.3.3" 590 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 591 | integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== 592 | dependencies: 593 | bytes "3.0.0" 594 | http-errors "1.6.3" 595 | iconv-lite "0.4.23" 596 | unpipe "1.0.0" 597 | 598 | recast@^0.17.3: 599 | version "0.17.3" 600 | resolved "https://registry.yarnpkg.com/recast/-/recast-0.17.3.tgz#f49a9c9a64c59b55f6c93b5a53e3cffd7a13354d" 601 | integrity sha512-NwQguXPwHqaVb6M7tsY11+8RDoAKHGRdymPGDxHJrsxOlNADQh0b08uz/MgYp1R1wmHuSBK4A4I5Oq+cE1J40g== 602 | dependencies: 603 | ast-types "0.12.2" 604 | esprima "~4.0.0" 605 | private "^0.1.8" 606 | source-map "~0.6.1" 607 | 608 | regenerate@^1.2.1: 609 | version "1.4.0" 610 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" 611 | integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== 612 | 613 | regexpu-core@^1.0.0: 614 | version "1.0.0" 615 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" 616 | integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= 617 | dependencies: 618 | regenerate "^1.2.1" 619 | regjsgen "^0.2.0" 620 | regjsparser "^0.1.4" 621 | 622 | regjsgen@^0.2.0: 623 | version "0.2.0" 624 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 625 | integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= 626 | 627 | regjsparser@^0.1.4: 628 | version "0.1.5" 629 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 630 | integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= 631 | dependencies: 632 | jsesc "~0.5.0" 633 | 634 | safe-buffer@5.1.2: 635 | version "5.1.2" 636 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 637 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 638 | 639 | "safer-buffer@>= 2.1.2 < 3": 640 | version "2.1.2" 641 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 642 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 643 | 644 | send@0.16.2: 645 | version "0.16.2" 646 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 647 | integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== 648 | dependencies: 649 | debug "2.6.9" 650 | depd "~1.1.2" 651 | destroy "~1.0.4" 652 | encodeurl "~1.0.2" 653 | escape-html "~1.0.3" 654 | etag "~1.8.1" 655 | fresh "0.5.2" 656 | http-errors "~1.6.2" 657 | mime "1.4.1" 658 | ms "2.0.0" 659 | on-finished "~2.3.0" 660 | range-parser "~1.2.0" 661 | statuses "~1.4.0" 662 | 663 | serve-static@1.13.2: 664 | version "1.13.2" 665 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 666 | integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== 667 | dependencies: 668 | encodeurl "~1.0.2" 669 | escape-html "~1.0.3" 670 | parseurl "~1.3.2" 671 | send "0.16.2" 672 | 673 | setprototypeof@1.1.0: 674 | version "1.1.0" 675 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 676 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 677 | 678 | source-map@0.6.*, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: 679 | version "0.6.1" 680 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 681 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 682 | 683 | source-map@^0.5.6: 684 | version "0.5.7" 685 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 686 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 687 | 688 | "statuses@>= 1.4.0 < 2": 689 | version "1.5.0" 690 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 691 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 692 | 693 | statuses@~1.4.0: 694 | version "1.4.0" 695 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 696 | integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== 697 | 698 | string-hash@^1.1.0: 699 | version "1.1.3" 700 | resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" 701 | integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= 702 | 703 | strip-ansi@^3.0.0: 704 | version "3.0.1" 705 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 706 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 707 | dependencies: 708 | ansi-regex "^2.0.0" 709 | 710 | supports-color@^2.0.0: 711 | version "2.0.0" 712 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 713 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 714 | 715 | supports-color@^3.2.3: 716 | version "3.2.3" 717 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 718 | integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= 719 | dependencies: 720 | has-flag "^1.0.0" 721 | 722 | supports-color@^5.3.0, supports-color@^5.4.0: 723 | version "5.5.0" 724 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 725 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 726 | dependencies: 727 | has-flag "^3.0.0" 728 | 729 | supports-color@^6.1.0: 730 | version "6.1.0" 731 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 732 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 733 | dependencies: 734 | has-flag "^3.0.0" 735 | 736 | type-is@~1.6.16: 737 | version "1.6.16" 738 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 739 | integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== 740 | dependencies: 741 | media-typer "0.3.0" 742 | mime-types "~2.1.18" 743 | 744 | uniq@^1.0.1: 745 | version "1.0.1" 746 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 747 | integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= 748 | 749 | unpipe@1.0.0, unpipe@~1.0.0: 750 | version "1.0.0" 751 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 752 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 753 | 754 | utils-merge@1.0.1: 755 | version "1.0.1" 756 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 757 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 758 | 759 | validate-npm-package-name@^3.0.0: 760 | version "3.0.0" 761 | resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" 762 | integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= 763 | dependencies: 764 | builtins "^1.0.3" 765 | 766 | vary@~1.1.2: 767 | version "1.1.2" 768 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 769 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 770 | 771 | vue-template-compiler@^2.6.8: 772 | version "2.6.8" 773 | resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.8.tgz#750802604595134775b9c53141b9850b35255e1c" 774 | integrity sha512-SwWKANE5ee+oJg+dEJmsdxsxWYICPsNwk68+1AFjOS8l0O/Yz2845afuJtFqf3UjS/vXG7ECsPeHHEAD65Cjng== 775 | dependencies: 776 | de-indent "^1.0.2" 777 | he "^1.1.0" 778 | 779 | vue-template-es2015-compiler@^1.9.0: 780 | version "1.9.1" 781 | resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" 782 | integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== 783 | 784 | vue@^2.6.8: 785 | version "2.6.8" 786 | resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.8.tgz#f21cbc536bfc14f7d1d792a137bb12f69e60ea91" 787 | integrity sha512-+vp9lEC2Kt3yom673pzg1J7T1NVGuGzO9j8Wxno+rQN2WYVBX2pyo/RGQ3fXCLh2Pk76Skw/laAPCuBuEQ4diw== 788 | 789 | yallist@^2.1.2: 790 | version "2.1.2" 791 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 792 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 793 | 794 | yallist@^3.0.2: 795 | version "3.0.3" 796 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 797 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 798 | --------------------------------------------------------------------------------