├── .gitignore ├── favicon.png ├── package.json ├── .eslintrc.json ├── worker.js ├── README.md ├── LICENSE ├── index.html ├── bf2wasm.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verdie-g/brainfuck2wasm/HEAD/favicon.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "eslint": "^4.18.2", 4 | "eslint-config-airbnb-base": "^12.1.0", 5 | "eslint-plugin-import": "^2.9.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true 4 | }, 5 | "extends": "airbnb-base", 6 | "rules": { 7 | "func-names": "off", 8 | "max-len": "off", 9 | "no-bitwise": "off", 10 | "no-param-reassign": "off", 11 | "strict": "off" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /worker.js: -------------------------------------------------------------------------------- 1 | importScripts('bf2wasm.js'); 2 | 3 | onmessage = e => { 4 | const bf = e.data; 5 | const wasm = bfToWasm(bf); 6 | const memory = new WebAssembly.Memory({ initial: 2 }); 7 | const imports = { imports: { memory: memory } }; 8 | WebAssembly.instantiate(wasm, imports).then((instance) => 9 | postMessage(new Int32Array(memory.buffer.slice(0, 65536))) 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # brainfuck2wasm 2 | 3 | Compile brainfuck to webassembly. 4 | 5 | ```ts 6 | function bfToWasm(bfStr: string, optimize: boolean): Uint8Array 7 | ``` 8 | 9 | Two pages of the linear memory are used. Each page is 64 KiB. The first one is 10 | for the output and the second one is for the brainfuck's array which is an 11 | array of 16384 4 byte wide cells. 12 | 13 | Brainfuck's result is output in two format : string and array of int32. 14 | 15 | ## TODO 16 | - Optimize brainfuck 17 | - Input instruction 18 | - Grow brainfuck's memory dynamically 19 | - Error handling 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Grégoire Verdier 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | bf2wasm 16 | 17 | 18 |
19 |
20 |
21 |

bf2wasm

22 |
23 |
24 | 25 |
26 |
27 |
28 |
29 | 30 | 65 |
66 |
67 | 68 |
69 |

70 | 71 |

72 |
73 |
74 | 75 |
76 |
77 |
78 | 79 | 80 |
81 |
82 | 83 |
84 |
85 | 86 | 87 |
88 |
89 |
90 |
91 | 92 |
93 |
94 | 95 |
96 |
97 |
98 | 99 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /bf2wasm.js: -------------------------------------------------------------------------------- 1 | const bfToWasm = (function() { 2 | 'use strict'; 3 | 4 | const CELL_SIZE = 4; 5 | const PAGE_SIZE = 65536; 6 | 7 | const section = { 8 | type: 0x01, 9 | import: 0x02, 10 | func: 0x03, 11 | table: 0x04, 12 | memory: 0x05, 13 | global: 0x06, 14 | export: 0x07, 15 | start: 0x08, 16 | elem: 0x09, 17 | code: 0x0a, 18 | }; 19 | 20 | const type = { 21 | block: 0x40, 22 | func: 0x60, 23 | anyfunc: 0x70, 24 | i32: 0x7f, 25 | i64: 0x7e, 26 | f32: 0x7d, 27 | f64: 0x7c, 28 | }; 29 | 30 | const wasmInstr = { 31 | block: 0x02, 32 | loop: 0x03, 33 | end: 0x0b, 34 | br: 0x0c, 35 | br_if: 0x0d, 36 | getLocal: 0x20, 37 | setLocal: 0x21, 38 | i32load: 0x28, 39 | i32store: 0x36, 40 | i32const: 0x41, 41 | i32eqz: 0x45, 42 | i32add: 0x6a, 43 | i32sub: 0x6b, 44 | }; 45 | 46 | // local 0 : brainfuck array index 47 | // local 1 : output array index 48 | const instrToWasm = { 49 | '>': () => [ 50 | wasmInstr.getLocal, 0x00, 51 | wasmInstr.i32const, CELL_SIZE, 52 | wasmInstr.i32add, 53 | wasmInstr.setLocal, 0x00, 54 | ], 55 | '<': () => [ 56 | wasmInstr.getLocal, 0x00, 57 | wasmInstr.i32const, CELL_SIZE, 58 | wasmInstr.i32sub, 59 | wasmInstr.setLocal, 0x00, 60 | ], 61 | '+': () => [ 62 | wasmInstr.getLocal, 0x00, 63 | wasmInstr.getLocal, 0x00, 64 | wasmInstr.i32load, 0x02, 0x00, 65 | wasmInstr.i32const, 0x01, 66 | wasmInstr.i32add, 67 | wasmInstr.i32store, 0x02, 0x00, 68 | ], 69 | '-': () => [ 70 | wasmInstr.getLocal, 0x00, 71 | wasmInstr.getLocal, 0x00, 72 | wasmInstr.i32load, 0x02, 0x00, 73 | wasmInstr.i32const, 0x01, 74 | wasmInstr.i32sub, 75 | wasmInstr.i32store, 0x02, 0x00, 76 | ], 77 | ',': () => [ 78 | 79 | ], 80 | '.': () => [ 81 | wasmInstr.getLocal, 0x01, 82 | wasmInstr.getLocal, 0x00, 83 | wasmInstr.i32load, 0x02, 0x00, 84 | wasmInstr.i32store, 0x02, 0x00, 85 | 86 | wasmInstr.getLocal, 0x01, 87 | wasmInstr.i32const, CELL_SIZE, 88 | wasmInstr.i32add, 89 | wasmInstr.setLocal, 0x01, 90 | ], 91 | '[': () => [ 92 | wasmInstr.block, 93 | type.block, 94 | wasmInstr.loop, 95 | type.block, 96 | ], 97 | ']': () => [ 98 | wasmInstr.getLocal, 0x00, 99 | wasmInstr.i32load, 0x02, 0x00, 100 | wasmInstr.i32eqz, 101 | wasmInstr.br_if, 0x01, 102 | wasmInstr.br, 0x00, 103 | wasmInstr.end, 104 | wasmInstr.end, 105 | ], 106 | }; 107 | 108 | function BfInstr(instrSymbol, toWasm, extraParams) { 109 | this.instrSymbol = instrSymbol; 110 | this.toWasm = toWasm; 111 | this.extraParams = extraParams || []; 112 | } 113 | 114 | function stripComments(bfStr) { 115 | const notInstrExp = /[^<>+\-,.[\]]/g; 116 | return bfStr.replace(notInstrExp, ''); 117 | } 118 | 119 | function parseBf(bfStr) { 120 | const instrs = []; 121 | for (let i = 0; i < bfStr.length; i += 1) { 122 | const toWasm = instrToWasm[bfStr[i]]; 123 | instrs.push(new BfInstr(bfStr[i], toWasm)); 124 | } 125 | return instrs; 126 | } 127 | 128 | function optimizeInstrs(instrs) { 129 | return instrs; 130 | } 131 | 132 | function intToVarint(n) { 133 | const buffer = []; 134 | let more = true; 135 | while (more) { 136 | let byte = n & 0x7F; 137 | n >>>= 7; 138 | if ((n === 0 && (byte & 0x40) === 0) || (n === -1 && (byte & 0x40) !== 0)) { 139 | more = false; 140 | } else { 141 | byte |= 0x80; 142 | } 143 | buffer.push(byte); 144 | } 145 | return buffer; 146 | } 147 | 148 | function intToVaruint(n) { 149 | const buffer = []; 150 | do { 151 | let byte = n & 0x7F; 152 | n >>>= 7; 153 | if (n !== 0) { 154 | byte |= 0x80; 155 | } 156 | buffer.push(byte); 157 | } while (n !== 0); 158 | return buffer; 159 | } 160 | 161 | function createSection(sectionType, ...data) { 162 | const flatData = [].concat(...data); 163 | return [section[sectionType], ...intToVaruint(flatData.length), ...flatData]; 164 | } 165 | 166 | function getStrBytes(str) { 167 | const bytes = []; 168 | for (let i = 0; i < str.length; i += 1) { 169 | bytes.push(str.charCodeAt(i)); 170 | } 171 | return bytes; 172 | } 173 | 174 | function compileToWasm(instrs) { 175 | const magicNumber = [0x00, 0x61, 0x73, 0x6d]; 176 | const version = [0x01, 0x00, 0x00, 0x00]; 177 | 178 | const functionsCount = 0x01; 179 | const startFuncIndex = 0x00; 180 | 181 | const startFunctionSignature = [type.func, 0x00, 0x00]; 182 | const typeSection = createSection('type', functionsCount, startFunctionSignature); 183 | 184 | const importsCount = 0x01; 185 | const importModuleName = getStrBytes('imports'); 186 | const importExportName = getStrBytes('memory'); 187 | const importMemoryKind = 0x02; 188 | const memoryDesc = [0x00, 0x02]; 189 | const importSection = createSection('import', importsCount, importModuleName.length, importModuleName, importExportName.length, importExportName, importMemoryKind, memoryDesc); 190 | 191 | const funcSection = createSection('func', functionsCount, startFuncIndex); 192 | 193 | const startSection = createSection('start', startFuncIndex); 194 | 195 | const localEntriesCount = 0x01; 196 | const i32VarCount = 0x02; 197 | const initOutputIndex = [wasmInstr.i32const, ...intToVarint(PAGE_SIZE), wasmInstr.setLocal, 0x00]; 198 | const functionBody = instrs.reduce((res, instr) => res.concat(instr.toWasm(...instr.extraParams)), initOutputIndex); 199 | functionBody.push(wasmInstr.end); 200 | const functionLength = intToVaruint(functionBody.length + 3); 201 | const codeSection = createSection('code', functionsCount, ...functionLength, localEntriesCount, i32VarCount, type.i32, functionBody); 202 | 203 | const buffer = [...magicNumber, ...version, ...typeSection, ...importSection, ...funcSection, ...startSection, ...codeSection]; 204 | return Uint8Array.from(buffer); 205 | } 206 | 207 | return function (bfStr, optimize = false) { 208 | if (bfStr == null) { 209 | throw new Error('Argument 0 cannot be null'); 210 | } 211 | 212 | if (typeof (bfStr) !== 'string') { 213 | throw new Error('Expected string for argument 0'); 214 | } 215 | 216 | if (typeof (optimize) !== 'boolean') { 217 | throw new Error('Expected boolean for argument 1'); 218 | } 219 | 220 | const bfNoComment = stripComments(bfStr); 221 | let instrs = parseBf(bfNoComment); 222 | if (optimize) { 223 | instrs = optimizeInstrs(instrs); 224 | } 225 | return compileToWasm(instrs); 226 | }; 227 | })(); 228 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | dependencies: 9 | acorn "^3.0.4" 10 | 11 | acorn@^3.0.4: 12 | version "3.3.0" 13 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 14 | 15 | acorn@^5.5.0: 16 | version "5.5.1" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.1.tgz#84e05a9ea0acbe131227da50301e62464dc9c1d8" 18 | 19 | ajv-keywords@^2.1.0: 20 | version "2.1.1" 21 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 22 | 23 | ajv@^5.2.3, ajv@^5.3.0: 24 | version "5.5.2" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 26 | dependencies: 27 | co "^4.6.0" 28 | fast-deep-equal "^1.0.0" 29 | fast-json-stable-stringify "^2.0.0" 30 | json-schema-traverse "^0.3.0" 31 | 32 | ansi-escapes@^3.0.0: 33 | version "3.0.0" 34 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" 35 | 36 | ansi-regex@^2.0.0: 37 | version "2.1.1" 38 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 39 | 40 | ansi-regex@^3.0.0: 41 | version "3.0.0" 42 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 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 | 48 | ansi-styles@^3.2.1: 49 | version "3.2.1" 50 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 51 | dependencies: 52 | color-convert "^1.9.0" 53 | 54 | argparse@^1.0.7: 55 | version "1.0.10" 56 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 57 | dependencies: 58 | sprintf-js "~1.0.2" 59 | 60 | array-union@^1.0.1: 61 | version "1.0.2" 62 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 63 | dependencies: 64 | array-uniq "^1.0.1" 65 | 66 | array-uniq@^1.0.1: 67 | version "1.0.3" 68 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 69 | 70 | arrify@^1.0.0: 71 | version "1.0.1" 72 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 73 | 74 | babel-code-frame@^6.22.0: 75 | version "6.26.0" 76 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 77 | dependencies: 78 | chalk "^1.1.3" 79 | esutils "^2.0.2" 80 | js-tokens "^3.0.2" 81 | 82 | balanced-match@^1.0.0: 83 | version "1.0.0" 84 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 85 | 86 | brace-expansion@^1.1.7: 87 | version "1.1.11" 88 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 89 | dependencies: 90 | balanced-match "^1.0.0" 91 | concat-map "0.0.1" 92 | 93 | builtin-modules@^1.0.0, builtin-modules@^1.1.1: 94 | version "1.1.1" 95 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 96 | 97 | caller-path@^0.1.0: 98 | version "0.1.0" 99 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 100 | dependencies: 101 | callsites "^0.2.0" 102 | 103 | callsites@^0.2.0: 104 | version "0.2.0" 105 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 106 | 107 | chalk@^1.1.3: 108 | version "1.1.3" 109 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 110 | dependencies: 111 | ansi-styles "^2.2.1" 112 | escape-string-regexp "^1.0.2" 113 | has-ansi "^2.0.0" 114 | strip-ansi "^3.0.0" 115 | supports-color "^2.0.0" 116 | 117 | chalk@^2.0.0, chalk@^2.1.0: 118 | version "2.3.2" 119 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" 120 | dependencies: 121 | ansi-styles "^3.2.1" 122 | escape-string-regexp "^1.0.5" 123 | supports-color "^5.3.0" 124 | 125 | chardet@^0.4.0: 126 | version "0.4.2" 127 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 128 | 129 | circular-json@^0.3.1: 130 | version "0.3.3" 131 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 132 | 133 | cli-cursor@^2.1.0: 134 | version "2.1.0" 135 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 136 | dependencies: 137 | restore-cursor "^2.0.0" 138 | 139 | cli-width@^2.0.0: 140 | version "2.2.0" 141 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 142 | 143 | co@^4.6.0: 144 | version "4.6.0" 145 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 146 | 147 | color-convert@^1.9.0: 148 | version "1.9.1" 149 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 150 | dependencies: 151 | color-name "^1.1.1" 152 | 153 | color-name@^1.1.1: 154 | version "1.1.3" 155 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 156 | 157 | concat-map@0.0.1: 158 | version "0.0.1" 159 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 160 | 161 | concat-stream@^1.6.0: 162 | version "1.6.1" 163 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26" 164 | dependencies: 165 | inherits "^2.0.3" 166 | readable-stream "^2.2.2" 167 | typedarray "^0.0.6" 168 | 169 | contains-path@^0.1.0: 170 | version "0.1.0" 171 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 172 | 173 | core-util-is@~1.0.0: 174 | version "1.0.2" 175 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 176 | 177 | cross-spawn@^5.1.0: 178 | version "5.1.0" 179 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 180 | dependencies: 181 | lru-cache "^4.0.1" 182 | shebang-command "^1.2.0" 183 | which "^1.2.9" 184 | 185 | debug@^2.6.8, debug@^2.6.9: 186 | version "2.6.9" 187 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 188 | dependencies: 189 | ms "2.0.0" 190 | 191 | debug@^3.1.0: 192 | version "3.1.0" 193 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 194 | dependencies: 195 | ms "2.0.0" 196 | 197 | deep-is@~0.1.3: 198 | version "0.1.3" 199 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 200 | 201 | del@^2.0.2: 202 | version "2.2.2" 203 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 204 | dependencies: 205 | globby "^5.0.0" 206 | is-path-cwd "^1.0.0" 207 | is-path-in-cwd "^1.0.0" 208 | object-assign "^4.0.1" 209 | pify "^2.0.0" 210 | pinkie-promise "^2.0.0" 211 | rimraf "^2.2.8" 212 | 213 | doctrine@1.5.0: 214 | version "1.5.0" 215 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 216 | dependencies: 217 | esutils "^2.0.2" 218 | isarray "^1.0.0" 219 | 220 | doctrine@^2.1.0: 221 | version "2.1.0" 222 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 223 | dependencies: 224 | esutils "^2.0.2" 225 | 226 | error-ex@^1.2.0: 227 | version "1.3.1" 228 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 229 | dependencies: 230 | is-arrayish "^0.2.1" 231 | 232 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 233 | version "1.0.5" 234 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 235 | 236 | eslint-config-airbnb-base@^12.1.0: 237 | version "12.1.0" 238 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" 239 | dependencies: 240 | eslint-restricted-globals "^0.1.1" 241 | 242 | eslint-import-resolver-node@^0.3.1: 243 | version "0.3.2" 244 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" 245 | dependencies: 246 | debug "^2.6.9" 247 | resolve "^1.5.0" 248 | 249 | eslint-module-utils@^2.1.1: 250 | version "2.1.1" 251 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" 252 | dependencies: 253 | debug "^2.6.8" 254 | pkg-dir "^1.0.0" 255 | 256 | eslint-plugin-import@^2.9.0: 257 | version "2.9.0" 258 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz#26002efbfca5989b7288ac047508bd24f217b169" 259 | dependencies: 260 | builtin-modules "^1.1.1" 261 | contains-path "^0.1.0" 262 | debug "^2.6.8" 263 | doctrine "1.5.0" 264 | eslint-import-resolver-node "^0.3.1" 265 | eslint-module-utils "^2.1.1" 266 | has "^1.0.1" 267 | lodash "^4.17.4" 268 | minimatch "^3.0.3" 269 | read-pkg-up "^2.0.0" 270 | 271 | eslint-restricted-globals@^0.1.1: 272 | version "0.1.1" 273 | resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" 274 | 275 | eslint-scope@^3.7.1: 276 | version "3.7.1" 277 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 278 | dependencies: 279 | esrecurse "^4.1.0" 280 | estraverse "^4.1.1" 281 | 282 | eslint-visitor-keys@^1.0.0: 283 | version "1.0.0" 284 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 285 | 286 | eslint@^4.18.2: 287 | version "4.18.2" 288 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" 289 | dependencies: 290 | ajv "^5.3.0" 291 | babel-code-frame "^6.22.0" 292 | chalk "^2.1.0" 293 | concat-stream "^1.6.0" 294 | cross-spawn "^5.1.0" 295 | debug "^3.1.0" 296 | doctrine "^2.1.0" 297 | eslint-scope "^3.7.1" 298 | eslint-visitor-keys "^1.0.0" 299 | espree "^3.5.2" 300 | esquery "^1.0.0" 301 | esutils "^2.0.2" 302 | file-entry-cache "^2.0.0" 303 | functional-red-black-tree "^1.0.1" 304 | glob "^7.1.2" 305 | globals "^11.0.1" 306 | ignore "^3.3.3" 307 | imurmurhash "^0.1.4" 308 | inquirer "^3.0.6" 309 | is-resolvable "^1.0.0" 310 | js-yaml "^3.9.1" 311 | json-stable-stringify-without-jsonify "^1.0.1" 312 | levn "^0.3.0" 313 | lodash "^4.17.4" 314 | minimatch "^3.0.2" 315 | mkdirp "^0.5.1" 316 | natural-compare "^1.4.0" 317 | optionator "^0.8.2" 318 | path-is-inside "^1.0.2" 319 | pluralize "^7.0.0" 320 | progress "^2.0.0" 321 | require-uncached "^1.0.3" 322 | semver "^5.3.0" 323 | strip-ansi "^4.0.0" 324 | strip-json-comments "~2.0.1" 325 | table "4.0.2" 326 | text-table "~0.2.0" 327 | 328 | espree@^3.5.2: 329 | version "3.5.4" 330 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 331 | dependencies: 332 | acorn "^5.5.0" 333 | acorn-jsx "^3.0.0" 334 | 335 | esprima@^4.0.0: 336 | version "4.0.1" 337 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 338 | 339 | esquery@^1.0.0: 340 | version "1.0.0" 341 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 342 | dependencies: 343 | estraverse "^4.0.0" 344 | 345 | esrecurse@^4.1.0: 346 | version "4.2.1" 347 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 348 | dependencies: 349 | estraverse "^4.1.0" 350 | 351 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 352 | version "4.2.0" 353 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 354 | 355 | esutils@^2.0.2: 356 | version "2.0.2" 357 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 358 | 359 | external-editor@^2.0.4: 360 | version "2.1.0" 361 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" 362 | dependencies: 363 | chardet "^0.4.0" 364 | iconv-lite "^0.4.17" 365 | tmp "^0.0.33" 366 | 367 | fast-deep-equal@^1.0.0: 368 | version "1.1.0" 369 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 370 | 371 | fast-json-stable-stringify@^2.0.0: 372 | version "2.0.0" 373 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 374 | 375 | fast-levenshtein@~2.0.4: 376 | version "2.0.6" 377 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 378 | 379 | figures@^2.0.0: 380 | version "2.0.0" 381 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 382 | dependencies: 383 | escape-string-regexp "^1.0.5" 384 | 385 | file-entry-cache@^2.0.0: 386 | version "2.0.0" 387 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 388 | dependencies: 389 | flat-cache "^1.2.1" 390 | object-assign "^4.0.1" 391 | 392 | find-up@^1.0.0: 393 | version "1.1.2" 394 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 395 | dependencies: 396 | path-exists "^2.0.0" 397 | pinkie-promise "^2.0.0" 398 | 399 | find-up@^2.0.0: 400 | version "2.1.0" 401 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 402 | dependencies: 403 | locate-path "^2.0.0" 404 | 405 | flat-cache@^1.2.1: 406 | version "1.3.0" 407 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 408 | dependencies: 409 | circular-json "^0.3.1" 410 | del "^2.0.2" 411 | graceful-fs "^4.1.2" 412 | write "^0.2.1" 413 | 414 | fs.realpath@^1.0.0: 415 | version "1.0.0" 416 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 417 | 418 | function-bind@^1.0.2: 419 | version "1.1.1" 420 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 421 | 422 | functional-red-black-tree@^1.0.1: 423 | version "1.0.1" 424 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 425 | 426 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 427 | version "7.1.2" 428 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 429 | dependencies: 430 | fs.realpath "^1.0.0" 431 | inflight "^1.0.4" 432 | inherits "2" 433 | minimatch "^3.0.4" 434 | once "^1.3.0" 435 | path-is-absolute "^1.0.0" 436 | 437 | globals@^11.0.1: 438 | version "11.3.0" 439 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" 440 | 441 | globby@^5.0.0: 442 | version "5.0.0" 443 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 444 | dependencies: 445 | array-union "^1.0.1" 446 | arrify "^1.0.0" 447 | glob "^7.0.3" 448 | object-assign "^4.0.1" 449 | pify "^2.0.0" 450 | pinkie-promise "^2.0.0" 451 | 452 | graceful-fs@^4.1.2: 453 | version "4.1.11" 454 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 455 | 456 | has-ansi@^2.0.0: 457 | version "2.0.0" 458 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 459 | dependencies: 460 | ansi-regex "^2.0.0" 461 | 462 | has-flag@^3.0.0: 463 | version "3.0.0" 464 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 465 | 466 | has@^1.0.1: 467 | version "1.0.1" 468 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 469 | dependencies: 470 | function-bind "^1.0.2" 471 | 472 | hosted-git-info@^2.1.4: 473 | version "2.5.0" 474 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 475 | 476 | iconv-lite@^0.4.17: 477 | version "0.4.19" 478 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 479 | 480 | ignore@^3.3.3: 481 | version "3.3.7" 482 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" 483 | 484 | imurmurhash@^0.1.4: 485 | version "0.1.4" 486 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 487 | 488 | inflight@^1.0.4: 489 | version "1.0.6" 490 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 491 | dependencies: 492 | once "^1.3.0" 493 | wrappy "1" 494 | 495 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 496 | version "2.0.3" 497 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 498 | 499 | inquirer@^3.0.6: 500 | version "3.3.0" 501 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 502 | dependencies: 503 | ansi-escapes "^3.0.0" 504 | chalk "^2.0.0" 505 | cli-cursor "^2.1.0" 506 | cli-width "^2.0.0" 507 | external-editor "^2.0.4" 508 | figures "^2.0.0" 509 | lodash "^4.3.0" 510 | mute-stream "0.0.7" 511 | run-async "^2.2.0" 512 | rx-lite "^4.0.8" 513 | rx-lite-aggregates "^4.0.8" 514 | string-width "^2.1.0" 515 | strip-ansi "^4.0.0" 516 | through "^2.3.6" 517 | 518 | is-arrayish@^0.2.1: 519 | version "0.2.1" 520 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 521 | 522 | is-builtin-module@^1.0.0: 523 | version "1.0.0" 524 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 525 | dependencies: 526 | builtin-modules "^1.0.0" 527 | 528 | is-fullwidth-code-point@^2.0.0: 529 | version "2.0.0" 530 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 531 | 532 | is-path-cwd@^1.0.0: 533 | version "1.0.0" 534 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 535 | 536 | is-path-in-cwd@^1.0.0: 537 | version "1.0.0" 538 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 539 | dependencies: 540 | is-path-inside "^1.0.0" 541 | 542 | is-path-inside@^1.0.0: 543 | version "1.0.1" 544 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 545 | dependencies: 546 | path-is-inside "^1.0.1" 547 | 548 | is-promise@^2.1.0: 549 | version "2.1.0" 550 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 551 | 552 | is-resolvable@^1.0.0: 553 | version "1.1.0" 554 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 555 | 556 | isarray@^1.0.0, isarray@~1.0.0: 557 | version "1.0.0" 558 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 559 | 560 | isexe@^2.0.0: 561 | version "2.0.0" 562 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 563 | 564 | js-tokens@^3.0.2: 565 | version "3.0.2" 566 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 567 | 568 | js-yaml@^3.9.1: 569 | version "3.13.1" 570 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 571 | dependencies: 572 | argparse "^1.0.7" 573 | esprima "^4.0.0" 574 | 575 | json-schema-traverse@^0.3.0: 576 | version "0.3.1" 577 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 578 | 579 | json-stable-stringify-without-jsonify@^1.0.1: 580 | version "1.0.1" 581 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 582 | 583 | levn@^0.3.0, levn@~0.3.0: 584 | version "0.3.0" 585 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 586 | dependencies: 587 | prelude-ls "~1.1.2" 588 | type-check "~0.3.2" 589 | 590 | load-json-file@^2.0.0: 591 | version "2.0.0" 592 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 593 | dependencies: 594 | graceful-fs "^4.1.2" 595 | parse-json "^2.2.0" 596 | pify "^2.0.0" 597 | strip-bom "^3.0.0" 598 | 599 | locate-path@^2.0.0: 600 | version "2.0.0" 601 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 602 | dependencies: 603 | p-locate "^2.0.0" 604 | path-exists "^3.0.0" 605 | 606 | lodash@^4.17.4, lodash@^4.3.0: 607 | version "4.17.15" 608 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 609 | 610 | lru-cache@^4.0.1: 611 | version "4.1.1" 612 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 613 | dependencies: 614 | pseudomap "^1.0.2" 615 | yallist "^2.1.2" 616 | 617 | mimic-fn@^1.0.0: 618 | version "1.2.0" 619 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 620 | 621 | minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 622 | version "3.0.4" 623 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 624 | dependencies: 625 | brace-expansion "^1.1.7" 626 | 627 | minimist@0.0.8: 628 | version "0.0.8" 629 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 630 | 631 | mkdirp@^0.5.1: 632 | version "0.5.1" 633 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 634 | dependencies: 635 | minimist "0.0.8" 636 | 637 | ms@2.0.0: 638 | version "2.0.0" 639 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 640 | 641 | mute-stream@0.0.7: 642 | version "0.0.7" 643 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 644 | 645 | natural-compare@^1.4.0: 646 | version "1.4.0" 647 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 648 | 649 | normalize-package-data@^2.3.2: 650 | version "2.4.0" 651 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 652 | dependencies: 653 | hosted-git-info "^2.1.4" 654 | is-builtin-module "^1.0.0" 655 | semver "2 || 3 || 4 || 5" 656 | validate-npm-package-license "^3.0.1" 657 | 658 | object-assign@^4.0.1: 659 | version "4.1.1" 660 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 661 | 662 | once@^1.3.0: 663 | version "1.4.0" 664 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 665 | dependencies: 666 | wrappy "1" 667 | 668 | onetime@^2.0.0: 669 | version "2.0.1" 670 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 671 | dependencies: 672 | mimic-fn "^1.0.0" 673 | 674 | optionator@^0.8.2: 675 | version "0.8.2" 676 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 677 | dependencies: 678 | deep-is "~0.1.3" 679 | fast-levenshtein "~2.0.4" 680 | levn "~0.3.0" 681 | prelude-ls "~1.1.2" 682 | type-check "~0.3.2" 683 | wordwrap "~1.0.0" 684 | 685 | os-tmpdir@~1.0.2: 686 | version "1.0.2" 687 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 688 | 689 | p-limit@^1.1.0: 690 | version "1.2.0" 691 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" 692 | dependencies: 693 | p-try "^1.0.0" 694 | 695 | p-locate@^2.0.0: 696 | version "2.0.0" 697 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 698 | dependencies: 699 | p-limit "^1.1.0" 700 | 701 | p-try@^1.0.0: 702 | version "1.0.0" 703 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 704 | 705 | parse-json@^2.2.0: 706 | version "2.2.0" 707 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 708 | dependencies: 709 | error-ex "^1.2.0" 710 | 711 | path-exists@^2.0.0: 712 | version "2.1.0" 713 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 714 | dependencies: 715 | pinkie-promise "^2.0.0" 716 | 717 | path-exists@^3.0.0: 718 | version "3.0.0" 719 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 720 | 721 | path-is-absolute@^1.0.0: 722 | version "1.0.1" 723 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 724 | 725 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 726 | version "1.0.2" 727 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 728 | 729 | path-parse@^1.0.5: 730 | version "1.0.5" 731 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 732 | 733 | path-type@^2.0.0: 734 | version "2.0.0" 735 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 736 | dependencies: 737 | pify "^2.0.0" 738 | 739 | pify@^2.0.0: 740 | version "2.3.0" 741 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 742 | 743 | pinkie-promise@^2.0.0: 744 | version "2.0.1" 745 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 746 | dependencies: 747 | pinkie "^2.0.0" 748 | 749 | pinkie@^2.0.0: 750 | version "2.0.4" 751 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 752 | 753 | pkg-dir@^1.0.0: 754 | version "1.0.0" 755 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 756 | dependencies: 757 | find-up "^1.0.0" 758 | 759 | pluralize@^7.0.0: 760 | version "7.0.0" 761 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 762 | 763 | prelude-ls@~1.1.2: 764 | version "1.1.2" 765 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 766 | 767 | process-nextick-args@~2.0.0: 768 | version "2.0.0" 769 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 770 | 771 | progress@^2.0.0: 772 | version "2.0.0" 773 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 774 | 775 | pseudomap@^1.0.2: 776 | version "1.0.2" 777 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 778 | 779 | read-pkg-up@^2.0.0: 780 | version "2.0.0" 781 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 782 | dependencies: 783 | find-up "^2.0.0" 784 | read-pkg "^2.0.0" 785 | 786 | read-pkg@^2.0.0: 787 | version "2.0.0" 788 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 789 | dependencies: 790 | load-json-file "^2.0.0" 791 | normalize-package-data "^2.3.2" 792 | path-type "^2.0.0" 793 | 794 | readable-stream@^2.2.2: 795 | version "2.3.5" 796 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" 797 | dependencies: 798 | core-util-is "~1.0.0" 799 | inherits "~2.0.3" 800 | isarray "~1.0.0" 801 | process-nextick-args "~2.0.0" 802 | safe-buffer "~5.1.1" 803 | string_decoder "~1.0.3" 804 | util-deprecate "~1.0.1" 805 | 806 | require-uncached@^1.0.3: 807 | version "1.0.3" 808 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 809 | dependencies: 810 | caller-path "^0.1.0" 811 | resolve-from "^1.0.0" 812 | 813 | resolve-from@^1.0.0: 814 | version "1.0.1" 815 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 816 | 817 | resolve@^1.5.0: 818 | version "1.5.0" 819 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 820 | dependencies: 821 | path-parse "^1.0.5" 822 | 823 | restore-cursor@^2.0.0: 824 | version "2.0.0" 825 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 826 | dependencies: 827 | onetime "^2.0.0" 828 | signal-exit "^3.0.2" 829 | 830 | rimraf@^2.2.8: 831 | version "2.6.2" 832 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 833 | dependencies: 834 | glob "^7.0.5" 835 | 836 | run-async@^2.2.0: 837 | version "2.3.0" 838 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 839 | dependencies: 840 | is-promise "^2.1.0" 841 | 842 | rx-lite-aggregates@^4.0.8: 843 | version "4.0.8" 844 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 845 | dependencies: 846 | rx-lite "*" 847 | 848 | rx-lite@*, rx-lite@^4.0.8: 849 | version "4.0.8" 850 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 851 | 852 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 853 | version "5.1.1" 854 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 855 | 856 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 857 | version "5.5.0" 858 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 859 | 860 | shebang-command@^1.2.0: 861 | version "1.2.0" 862 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 863 | dependencies: 864 | shebang-regex "^1.0.0" 865 | 866 | shebang-regex@^1.0.0: 867 | version "1.0.0" 868 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 869 | 870 | signal-exit@^3.0.2: 871 | version "3.0.2" 872 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 873 | 874 | slice-ansi@1.0.0: 875 | version "1.0.0" 876 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 877 | dependencies: 878 | is-fullwidth-code-point "^2.0.0" 879 | 880 | spdx-correct@^3.0.0: 881 | version "3.0.0" 882 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 883 | dependencies: 884 | spdx-expression-parse "^3.0.0" 885 | spdx-license-ids "^3.0.0" 886 | 887 | spdx-exceptions@^2.1.0: 888 | version "2.1.0" 889 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 890 | 891 | spdx-expression-parse@^3.0.0: 892 | version "3.0.0" 893 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 894 | dependencies: 895 | spdx-exceptions "^2.1.0" 896 | spdx-license-ids "^3.0.0" 897 | 898 | spdx-license-ids@^3.0.0: 899 | version "3.0.0" 900 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" 901 | 902 | sprintf-js@~1.0.2: 903 | version "1.0.3" 904 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 905 | 906 | string-width@^2.1.0, string-width@^2.1.1: 907 | version "2.1.1" 908 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 909 | dependencies: 910 | is-fullwidth-code-point "^2.0.0" 911 | strip-ansi "^4.0.0" 912 | 913 | string_decoder@~1.0.3: 914 | version "1.0.3" 915 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 916 | dependencies: 917 | safe-buffer "~5.1.0" 918 | 919 | strip-ansi@^3.0.0: 920 | version "3.0.1" 921 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 922 | dependencies: 923 | ansi-regex "^2.0.0" 924 | 925 | strip-ansi@^4.0.0: 926 | version "4.0.0" 927 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 928 | dependencies: 929 | ansi-regex "^3.0.0" 930 | 931 | strip-bom@^3.0.0: 932 | version "3.0.0" 933 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 934 | 935 | strip-json-comments@~2.0.1: 936 | version "2.0.1" 937 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 938 | 939 | supports-color@^2.0.0: 940 | version "2.0.0" 941 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 942 | 943 | supports-color@^5.3.0: 944 | version "5.3.0" 945 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" 946 | dependencies: 947 | has-flag "^3.0.0" 948 | 949 | table@4.0.2: 950 | version "4.0.2" 951 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 952 | dependencies: 953 | ajv "^5.2.3" 954 | ajv-keywords "^2.1.0" 955 | chalk "^2.1.0" 956 | lodash "^4.17.4" 957 | slice-ansi "1.0.0" 958 | string-width "^2.1.1" 959 | 960 | text-table@~0.2.0: 961 | version "0.2.0" 962 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 963 | 964 | through@^2.3.6: 965 | version "2.3.8" 966 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 967 | 968 | tmp@^0.0.33: 969 | version "0.0.33" 970 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 971 | dependencies: 972 | os-tmpdir "~1.0.2" 973 | 974 | type-check@~0.3.2: 975 | version "0.3.2" 976 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 977 | dependencies: 978 | prelude-ls "~1.1.2" 979 | 980 | typedarray@^0.0.6: 981 | version "0.0.6" 982 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 983 | 984 | util-deprecate@~1.0.1: 985 | version "1.0.2" 986 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 987 | 988 | validate-npm-package-license@^3.0.1: 989 | version "3.0.3" 990 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" 991 | dependencies: 992 | spdx-correct "^3.0.0" 993 | spdx-expression-parse "^3.0.0" 994 | 995 | which@^1.2.9: 996 | version "1.3.0" 997 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 998 | dependencies: 999 | isexe "^2.0.0" 1000 | 1001 | wordwrap@~1.0.0: 1002 | version "1.0.0" 1003 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1004 | 1005 | wrappy@1: 1006 | version "1.0.2" 1007 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1008 | 1009 | write@^0.2.1: 1010 | version "0.2.1" 1011 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1012 | dependencies: 1013 | mkdirp "^0.5.1" 1014 | 1015 | yallist@^2.1.2: 1016 | version "2.1.2" 1017 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1018 | --------------------------------------------------------------------------------