├── .babelrc ├── .eslintrc ├── .gitignore ├── .node_version ├── .npmignore ├── .nvmrc ├── .travis.yml ├── LICENSE ├── README.md ├── TODO.md ├── bin └── uiscript ├── doc ├── examples.md ├── grammar.txt └── sequences.md ├── examples ├── .gitkeep ├── buttonExpand │ ├── example.ui │ └── index.html ├── childScope │ ├── example.ui │ └── index.html ├── click │ ├── example.ui │ └── index.html ├── complex │ └── example.ui ├── error │ └── example.ui ├── example.css ├── index.html ├── singleLine │ ├── example.ui │ └── index.html ├── variables │ ├── example.ui │ └── index.html └── verticalNav │ ├── example.ui │ └── index.html ├── package.json ├── rollup.config.js ├── src ├── browser.js ├── errors.js ├── lexer.js ├── nodes │ ├── block.js │ ├── index.js │ ├── receiver.js │ ├── target.js │ └── trigger.js ├── parser.js ├── runner.js ├── scopeStack.js ├── templates │ └── wrapper.js ├── tree.js └── utils │ ├── futils.js │ └── range.js ├── test └── .opts └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015"] 3 | } 4 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | root: true 2 | 3 | env: 4 | node: true 5 | browser: true 6 | es6: true 7 | 8 | parserOptions: 9 | sourceType: "module" 10 | 11 | globals: 12 | # these are all for mocha 13 | describe: false 14 | it: false 15 | beforeEach: false 16 | before: false 17 | context: false 18 | 19 | rules: 20 | indent: [2, 2] 21 | block-spacing: 2 22 | brace-style: [2, "1tbs", { "allowSingleLine": true }] 23 | camelcase: [2, { properties: "never" }] 24 | callback-return: [2, ["cb", "callback", "next"]] 25 | comma-spacing: 2 26 | comma-style: [2, "last"] 27 | consistent-return: 2 28 | curly: [2, "all"] 29 | default-case: 2 30 | dot-notation: [2, { allowKeywords: true }] 31 | eol-last: 2 32 | eqeqeq: 2 33 | guard-for-in: 2 34 | key-spacing: [2, { beforeColon: false, afterColon: true }] 35 | new-cap: 2 36 | new-parens: 2 37 | no-alert: 2 38 | no-array-constructor: 2 39 | no-caller: 2 40 | no-delete-var: 2 41 | no-eval: 2 42 | no-extend-native: 2 43 | no-extra-bind: 2 44 | no-fallthrough: 2 45 | no-floating-decimal: 2 46 | no-implied-eval: 2 47 | no-invalid-this: 2 48 | no-iterator: 2 49 | no-label-var: 2 50 | no-labels: 2 51 | no-lone-blocks: 2 52 | no-loop-func: 2 53 | no-mixed-spaces-and-tabs: [2, false] 54 | no-multi-spaces: 2 55 | no-multi-str: 2 56 | no-native-reassign: 2 57 | no-nested-ternary: 0 58 | no-new: 2 59 | no-new-func: 2 60 | no-new-object: 2 61 | no-new-wrappers: 2 62 | no-octal: 2 63 | no-octal-escape: 2 64 | no-process-exit: 2 65 | no-proto: 2 66 | no-redeclare: 2 67 | no-return-assign: 2 68 | no-script-url: 2 69 | no-sequences: 2 70 | no-shadow: 2 71 | no-shadow-restricted-names: 2 72 | no-spaced-func: 2 73 | no-trailing-spaces: 2 74 | no-undef: 2 75 | no-undef-init: 2 76 | no-undefined: 2 77 | no-underscore-dangle: 2 78 | no-unused-expressions: 2 79 | no-unused-vars: [2, {vars: "all", args: "after-used"}] 80 | no-use-before-define: 2 81 | no-useless-concat: 2 82 | no-with: 2 83 | quotes: [2, "single"] 84 | radix: 2 85 | semi: [2, "never"] 86 | space-before-blocks: 2 87 | space-before-function-paren: [2, "never"] 88 | space-infix-ops: 2 89 | keyword-spacing: 2 90 | space-unary-ops: [2, {words: true, nonwords: false}] 91 | spaced-comment: [2, "always", { exceptions: ["-"]}] 92 | strict: [2, "global"] 93 | wrap-iife: 2 94 | yoda: [2, "never"] 95 | 96 | # Previously on by default in node environment 97 | no-catch-shadow: 0 98 | no-console: 0 99 | no-mixed-requires: 2 100 | no-new-require: 2 101 | no-path-concat: 2 102 | global-strict: [0, "always"] 103 | handle-callback-err: [2, "err"] 104 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Misc 6 | .DS_Store 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | coverage 17 | node_modules 18 | 19 | examples/**/*.js 20 | 21 | # Transpiled js should not be present and should instead be run at installation 22 | dist 23 | -------------------------------------------------------------------------------- /.node_version: -------------------------------------------------------------------------------- 1 | 5 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | test 3 | .travis.yml 4 | .eslintrc 5 | .nvmrc 6 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 6.0 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "8.9" 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Connor Atherton 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 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # uiscript ![Build Status](https://api.travis-ci.org/ConnorAtherton/uiscript.svg) 2 | 3 | A web UI manipulation language for humans. 4 | 5 | uiscript is a simple language that compiles to JavaScript that allows you to create 6 | complex user interface behaviours in an understandable way. To do this, it follows these 7 | principles of how this kind of animation should be built using web technologies: 8 | 9 | - Animation states should be declared in CSS using stateful classes (.is-open, .has-hovered). 10 | - Event management and DOM attributes management should be handled by JavaScript. 11 | 12 | ## Installing 13 | 14 | Install it globally through npm. 15 | 16 | ``` 17 | npm install -g uiscript 18 | ``` 19 | 20 | ## Running 21 | 22 | A uiscript file should have the file extension `.ui`. 23 | 24 | ``` 25 | $ uiscript example.ui 26 | > example.ui => example.js 27 | > 28 | > 1 file finished 29 | ``` 30 | 31 | ## Syntax 32 | 33 | The full grammar is available in `doc/grammar.txt`. 34 | 35 | Here is a simple example to toggle the `is-active` class on any node matching the selector 36 | `.Menu__trigger` when clicked. 37 | 38 | ``` 39 | // Single line syntax. Notice the terminating period (.). 40 | when I "click" on ".Menu__trigger" then toggle "is-active". 41 | ``` 42 | 43 | Following the second principle above, we allow JavaScript to handle the event logic and we change 44 | the visual presentation of the element by leveraging CSS. Here I am using a state class combined 45 | with a CSS transition. 46 | 47 | ```css 48 | .Menu__Trigger { 49 | border: 1px solid gray; 50 | } 51 | 52 | .Menu__trigger ~ .Menu__body { 53 | opacity: 0; 54 | transition: opacity 200ms linear; 55 | } 56 | 57 | .Menu__trigger.is-active { 58 | border: 1px solid blue; 59 | } 60 | 61 | .Menu__trigger.is-active ~ .Menu__body { 62 | opacity: 1; 63 | } 64 | ``` 65 | 66 | ### Delegation 67 | 68 | Interactions can trigger multiple different events. For example, let's say we want to expand an 69 | information section when we click a button and also show that the button has been clicked. We can 70 | make this work using the `on` keyword inside the declaration block. 71 | 72 | ``` 73 | when I "click" on ".Button--cta" then 74 | // [trigger] [classSelector] on [element] 75 | add "is-expanded" on ".Information-section" 76 | add "Button--active" 77 | end 78 | ``` 79 | 80 | The element can be a string selector or a cached variable (see below). 81 | 82 | In the above examples, the `on ` can be omitted and uiscript will implicitly 83 | assume any actions you take will be related to the event target. 84 | 85 | ### Caching variables 86 | 87 | We can cache variables to avoid querying the DOM for targetevery time an event fires. 88 | 89 | This is most useful when animating static elements that aren't dyanamically added or removed from 90 | the DOM during the lifecycle of the page. 91 | 92 | We declare a variable using an assignment syntax that you are likely familiar with from 93 | other popular languages: the left hand side is the variable name, followed by an `=` 94 | operator and the only valid value is a string to be matched against the DOM. 95 | 96 | ``` 97 | @variableElement = ".Message" 98 | 99 | when I "dblclick" on "button" then 100 | toggle "is-visible" on @variableElement 101 | end 102 | ``` 103 | 104 | ### Scopes 105 | 106 | Opening a new block using the `then` keyword will create a new variable scope within the block. 107 | 108 | ``` 109 | // Caches every anchor node 110 | @links = "a" 111 | 112 | // Add an event on a cached DOM element 113 | when I "dblclick" on @links then 114 | @links = "a.special" // fetch all active links 115 | 116 | // a.special is the target 117 | toggle "is-clicked" on @links 118 | end 119 | ``` 120 | 121 | ### Supported events 122 | 123 | This is an initial list that will be expanded in future releases. I'm hoping to add support 124 | for other events fired by the browser that aren't initiated by an explicit user interaction, e.g. 125 | `DOMContentReady`. 126 | 127 | - `click` 128 | - `doubleclick` 129 | - `mouseup` 130 | - `mousedown` 131 | - `mouseover` 132 | 133 | ### Transforms 134 | 135 | You can also pass optional cli arguments to `uiscript` that will transform the output. 136 | 137 | ``` 138 | -m, --minify Minify all js output 139 | ``` 140 | 141 | ### Contributing 142 | 143 | Pull requests and issue submissions are encouraged. I've added some example tasks in the `TODO.md` 144 | but feel free to work on anything that interests you. 145 | 146 | To start working on the project you must have rollup installed. After that, open a new terminal and 147 | run `rollup -cw` to start watching for file changes either to the browser bundle or the node bundle. 148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | 3 | - Better examples 4 | - Tests 5 | - Create a specific node/browser bundle 6 | - aliases for events: e.g. 'doubleclick' <=> 'dblclick' 7 | - Chained sequence animations (doc/sequences.md) 8 | - Support `in` keyword for delays: `toggle 'class' on 'elements' in '200ms'` 9 | - Support for multi-assignment classes `add 'isActive' on @button and @body` 10 | 11 | -------------------------------------------------------------------------------- /bin/uiscript: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const cli = require('commander') 4 | const { glob } = require('glob') 5 | const pkg = require('../package.json') 6 | const run = require('../dist/runner') 7 | 8 | cli 9 | .version(pkg.version) 10 | .description(pkg.description) 11 | .usage(' [options]') 12 | .option('-o, --out', 'List output destination.') 13 | .option('-w, --watch', 'Recompile files on changes.') 14 | .option('-m, --minify', 'Minify output.') 15 | .parse(process.argv) 16 | 17 | if (!cli.args.length) { 18 | cli.help() 19 | } 20 | 21 | const input = cli.args.reduce((globs, pattern) => { 22 | let files = glob(pattern) 23 | if (!files.length) { files = [pattern] } 24 | return globs.concat(files) 25 | }, []) 26 | 27 | run(input, cli) 28 | -------------------------------------------------------------------------------- /doc/examples.md: -------------------------------------------------------------------------------- 1 | - http://codepen.io/Volorf/pen/rxgMZp 2 | -------------------------------------------------------------------------------- /doc/grammar.txt: -------------------------------------------------------------------------------- 1 | # Grammar 2 | 3 | The following is a context-free grammar for the uiscript language 4 | written in extended Backus-Naur form. 5 | 6 | : 7 | 8 | 9 | : 10 | 11 | 12 | 13 | : 14 | = 15 | 16 | : 17 | 18 | 19 | 20 | : 21 | @/[a-zA-Z]+/ 22 | 23 | : 24 | when [] 25 | 26 | : 27 | (I | on) 28 | 29 | : 30 | then 31 | 32 | : 33 | {, } 34 | 35 | : 36 | [ ] 37 | 38 | : 39 | (click | hover | doubleclick) 40 | 41 | : 42 | (end | .) 43 | -------------------------------------------------------------------------------- /doc/sequences.md: -------------------------------------------------------------------------------- 1 | ### Sequences 2 | 3 | [TODO] 4 | 5 | Sequences are a linear conbination of actions. 6 | 7 | Use sequences when: 8 | - You want to re-use the same steps across multiple different 9 | events (think global actions, like updating a notification counter). 10 | - An animation is complex and you want to extract it from the 11 | event declaration for clarity. As a rule of thumb, any action 12 | that is 10 lines or more should be split into a sequence. 13 | 14 | ``` 15 | // The @ syntax declares the sequence name 16 | @logged_in_animation then 17 | add 'erer' to 'sdsdsd' 18 | end 19 | ``` 20 | 21 | Use the `run` keyword to start a sequence. 22 | 23 | ``` 24 | // run a trigger using the run keyword 25 | when I 'click' on @menu_item then 26 | // run a named sequence 27 | // NOTE: will throw an error if no sequence exists with the name 28 | run @logged_in_animation 29 | end 30 | ``` 31 | 32 | -------------------------------------------------------------------------------- /examples/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ConnorAtherton/uiscript/9eb290c1cc091c8e4e2d8258625e9378720bbe38/examples/.gitkeep -------------------------------------------------------------------------------- /examples/buttonExpand/example.ui: -------------------------------------------------------------------------------- 1 | when I "click" on ".Button--cta" then 2 | // on 3 | add "is-expanded" on ".Information-section" 4 | add "Button--active" 5 | end 6 | -------------------------------------------------------------------------------- /examples/buttonExpand/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | uiscript example 5 | 32 | 33 | 34 | 35 |
36 | Closed. 37 |
38 | And exanded. 39 |
40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /examples/childScope/example.ui: -------------------------------------------------------------------------------- 1 | // 2 | // An example of using scopes. 3 | // This isn't a good idea for common events that fire a lot 4 | // since it looks for the nodes on every event. 5 | // 6 | 7 | // Caches every anchor node 8 | @links = "a" 9 | 10 | // Add an event on a cached DOM element 11 | when I "mouseenter" on @links then 12 | @links = "a.special" 13 | 14 | // a.special is the target here 15 | toggle "has-mouseenter" on @links 16 | end 17 | -------------------------------------------------------------------------------- /examples/childScope/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | uiscript example 5 | 22 | 23 | 24 | Normal 25 | Normal 26 | Normal 27 | Normal 28 | Special 29 | Special 30 | Special 31 | Special 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /examples/click/example.ui: -------------------------------------------------------------------------------- 1 | // 2 | // A simple click using explicit element variable 3 | // 4 | 5 | when I "click" on "button" then 6 | add "is-clicked-once" 7 | toggle "is-active" 8 | end 9 | -------------------------------------------------------------------------------- /examples/click/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | uiscript example 5 | 6 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /examples/complex/example.ui: -------------------------------------------------------------------------------- 1 | // 2 | // Test file 3 | // 4 | 5 | // Every variable represents a DOM element present at the time 6 | // the JavaScript output is executed. 7 | @first = "string" 8 | @camelCase = "test" 9 | 10 | when I "click" on ".div > text" then 11 | @inBlock = ".scopeTest" 12 | 13 | // implicit reference 14 | add ".implicit" 15 | 16 | // inner scope 17 | remove ".inner-scope" on @inBlock 18 | 19 | // outer scope 20 | toggle ".outer-scope" on @first 21 | 22 | // selector 23 | add ".selector" on "body" 24 | end 25 | 26 | 27 | -------------------------------------------------------------------------------- /examples/error/example.ui: -------------------------------------------------------------------------------- 1 | // 2 | // Used for testing the error messages in the console 3 | // 4 | 5 | @2323 = "test" 6 | 7 | // when I "dblclick" "button" then toggle "is-active". 8 | -------------------------------------------------------------------------------- /examples/example.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | html, 6 | body { 7 | margin: 0; 8 | width: 100vw; 9 | height: 100vh; 10 | background: #2dd7aa; 11 | padding: 0; 12 | color: #fff; 13 | position: relative; 14 | transition: all .3s ease-in-out; 15 | font-family: -apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif; 16 | } 17 | 18 | ul { 19 | padding: 0; 20 | } 21 | 22 | a { 23 | text-decoration: none; 24 | color: inherit; 25 | } 26 | 27 | /* Helpers */ 28 | 29 | .p100 { 30 | padding: 100px; 31 | } 32 | 33 | /* Lists */ 34 | .list--light { 35 | color: #fff; 36 | transition: all .25s ease; 37 | } 38 | 39 | .list-item { 40 | display: block; 41 | cursor: pointer; 42 | font-size: 14px; 43 | font-weight: 500; 44 | padding: 20px 0; 45 | opacity: .5; 46 | position: relative; 47 | -webkit-user-select: none; 48 | -ms-user-select: none; 49 | user-select: none; 50 | } 51 | 52 | .list-item.isActive, 53 | .list-item:hover { 54 | opacity: 1; 55 | } 56 | -------------------------------------------------------------------------------- /examples/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Vertical Navigation 5 | 6 | 7 | 8 |

Examples

9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /examples/singleLine/example.ui: -------------------------------------------------------------------------------- 1 | // 2 | // There is also a shorthand single line syntax 3 | // than can be terminated with a period (.). 4 | // 5 | 6 | when I "dblclick" on "button" then toggle "is-active". 7 | -------------------------------------------------------------------------------- /examples/singleLine/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | uiscript example 5 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /examples/variables/example.ui: -------------------------------------------------------------------------------- 1 | // 2 | // A simple click using explicit element variable 3 | // 4 | 5 | @buttons = "button" 6 | 7 | when I "click" on @buttons then 8 | toggle "is-active" // Inline comment now 9 | end 10 | -------------------------------------------------------------------------------- /examples/variables/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | uiscript example 5 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /examples/verticalNav/example.ui: -------------------------------------------------------------------------------- 1 | @body = ".content-body" 2 | @navLinks = ".nav-item" 3 | @marker = ".nav-marker" 4 | 5 | // 6 | // TODO: Being able to do @marker.reset!, possibly? 7 | // 8 | // Ideally, we have a set number of states the component can appear 9 | // in and that should be known before the user does anything to interact 10 | // with the component. To remove all existing states, we could add some 11 | // to make clearing easier. Maybe some kind of enum-like syntax then? 12 | // 13 | // list @states = 14 | // "first" 15 | // "second" 16 | // "third" 17 | // 18 | // remove @states on @marker 19 | // 20 | when I "click" on @navLinks then 21 | // First, mark none as active and mark the current as active 22 | remove "isActive" on @navLinks 23 | add "isActive" 24 | end 25 | 26 | when I "click" on ".nav-item:nth-child(1)" then 27 | remove "second" on @marker 28 | remove "third" on @marker 29 | remove "second" on @body 30 | remove "third" on @body 31 | 32 | add "first" on @marker 33 | add "first" on @body 34 | end 35 | 36 | when I "click" on ".nav-item:nth-child(2)" then 37 | remove "first" on @marker 38 | remove "third" on @marker 39 | remove "first" on @body 40 | remove "third" on @body 41 | 42 | add "second" on @marker 43 | add "second" on @body 44 | end 45 | 46 | when I "click" on ".nav-item:nth-child(3)" then 47 | remove "first" on @marker 48 | remove "second" on @marker 49 | remove "first" on @body 50 | remove "second" on @body 51 | 52 | add "third" on @marker 53 | add "third" on @body 54 | end 55 | -------------------------------------------------------------------------------- /examples/verticalNav/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Vertical Navigation 5 | 6 | 57 | 58 | 59 |
60 |
61 |

1

62 |
63 |
64 |

2

65 |
66 |
67 |

3

68 |
69 |
70 | 71 | 77 | 78 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "uiscript", 3 | "version": "0.2.1", 4 | "description": "A human-readable web ui manipulation language", 5 | "main": "dist/runner", 6 | "bin": "bin/uiscript", 7 | "browser": "dist/uiscript.js", 8 | "scripts": { 9 | "test": "yarn lint", 10 | "prepublish": "yarn test", 11 | "lint": "eslint src/ test/" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/ConnorAtherton/uiscript.git" 16 | }, 17 | "keywords": [ 18 | "ui", 19 | "script", 20 | "animation" 21 | ], 22 | "author": "Connor Atherton ", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/ConnorAtherton/uiscript/issues" 26 | }, 27 | "homepage": "https://github.com/ConnorAtherton/uiscript#readme", 28 | "dependencies": { 29 | "chokidar": "^1.6.0", 30 | "commander": "2.9.0", 31 | "glob": "7.1.1", 32 | "headway": "0.3.0", 33 | "minimist": "^1.2.0", 34 | "uglify-js": "^2.7.4" 35 | }, 36 | "devDependencies": { 37 | "eslint": "^3.10.0", 38 | "mocha": "^3.1", 39 | "rollup": "^0.51.7" 40 | }, 41 | "files": [ 42 | "bin", 43 | "dist", 44 | "LICENSE", 45 | "README.md" 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | name: 'uiscript', 4 | input: './src/browser.js', 5 | output: { 6 | file: './dist/uiscript.js', 7 | format: 'iife' 8 | } 9 | }, 10 | { 11 | input: './src/runner.js', 12 | external: ['path', 'fs', 'headway', 'chokidar', 'uglify-js'], 13 | output: { 14 | file: './dist/runner.js', 15 | format: 'cjs' 16 | } 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /src/browser.js: -------------------------------------------------------------------------------- 1 | import Lexer from './lexer' 2 | import Parser from './parser' 3 | import template from './templates/wrapper' 4 | 5 | const uiscriptTypes = ['text/uiscript'] 6 | 7 | const initializeUiscript = () => { 8 | const scripts = [].slice.call(document.getElementsByTagName('script')) 9 | .filter(s => uiscriptTypes.includes(s.type)) 10 | .reduce((acc, s) => `${acc}\n\n${s.innerText}`, '') 11 | 12 | const lexer = new Lexer(scripts) 13 | const parser = new Parser(lexer) 14 | 15 | parser.parse() 16 | 17 | const script = document.createElement('script') 18 | script.innerHTML = template(parser.ast.toString()) 19 | document.body.appendChild(script) 20 | } 21 | 22 | window.addEventListener('DOMContentLoaded', initializeUiscript, false) 23 | -------------------------------------------------------------------------------- /src/errors.js: -------------------------------------------------------------------------------- 1 | const error = (name) => { 2 | return class UIScriptError extends Error { 3 | constructor(message) { 4 | super(`[uiscript] ${name}: ${message}`) 5 | } 6 | } 7 | } 8 | 9 | export const Errors = { 10 | UnexpectedToken: error('UnexpectedToken') 11 | } 12 | -------------------------------------------------------------------------------- /src/lexer.js: -------------------------------------------------------------------------------- 1 | import range from './utils/range' 2 | 3 | // 4 | // NOTE: Passthrough for now until I split out the node from the browser stuff 5 | // TODO: Create browser version of headway to print out colors 6 | // 7 | const hw = { 8 | log() {} 9 | } 10 | 11 | export const formats = { 12 | variableName: range('lowercase', 'uppercase'), 13 | whitespace: ' \t\r\n', 14 | } 15 | 16 | export const keywords = [ 17 | 'then', 'end', 'add', 18 | 'remove', 'toggle', 'when', 19 | 'I', 'on' 20 | ] 21 | 22 | // 23 | // Each keyword should respond to a type 24 | // 25 | 26 | // Since each Symbol is unique we need to share some here 27 | // so we can use two alternate lexemes to represent a single 28 | // node type. 29 | const declarationBlockEndSymbol = Symbol('UI_DECLARATION_BLOCK_END') 30 | 31 | export const types = { 32 | variableName: Symbol('UI_VARIABLE_NAME'), 33 | string: Symbol('UI_STRING'), 34 | declarationStart: Symbol('UI_DECLARATION_START'), 35 | declarationBlockStart: Symbol('UI_DECLARATION_BLOCK_START'), 36 | declarationBlockEnd: declarationBlockEndSymbol, 37 | '.': declarationBlockEndSymbol, 38 | trigger: Symbol('UI_TRIGGER'), 39 | '=': Symbol('UI_ASSIGNMENT'), 40 | // these tokens are just to keep the language sounding natural for 41 | // humans and the they are optional for the parser 42 | naturalLang: Symbol('UI_NATURAL_LANG'), 43 | 44 | // Special lexeme type 45 | EOF: Symbol('UI_EOF'), 46 | } 47 | 48 | // 49 | // Keyword types mappings 50 | // 51 | // Keep these distinct from the actual types to make it easier 52 | // to modify the keywords later on. 53 | // 54 | types.then = types.declarationBlockStart 55 | types.end = types.declarationBlockEnd 56 | types.add = types.trigger 57 | types.remove = types.trigger 58 | types.toggle = types.trigger 59 | types.when = types.declarationStart 60 | types.I = types.naturalLang 61 | types.on = types.naturalLang 62 | types.assignment = types['='] 63 | 64 | // 65 | // Lexer 66 | // 67 | // This is the class responsible for breaking up the 68 | // input stream into tokens that the parser can recognize 69 | // and use to run the program. 70 | // 71 | export default class Lexer { 72 | // @param {Buffer} source 73 | constructor(source) { 74 | console.log('Creating new lexer') 75 | 76 | // Force the source into a string so we can accept 77 | // a Buffer object as an input too 78 | this.source = source.toString() 79 | this.sourceLength = source.length 80 | 81 | // TODO: Support a debug flag to optionally enable this functionality. 82 | // Means we store the source twice in memory and make 2 passes instead of 1. 83 | this.linesForDebug = this.source.split('\n') 84 | 85 | // holds the position of the current character 86 | this.line = 1 87 | this.lineCharacter = 1 88 | 89 | // holds the position in the source string 90 | this.index = -1 91 | 92 | // stores all the tokens from the source 93 | this.tokens = [] 94 | 95 | // Reference the current token the parse is considering 96 | this.activeToken = null 97 | } 98 | 99 | get position() { 100 | return { 101 | line: this.line, 102 | character: this.lineCharacter 103 | } 104 | } 105 | 106 | // 107 | // Increments to the next character in the token stream 108 | // and moves the increments the index pointer 109 | // 110 | next() { 111 | if (this.willOverflow()) { return null } 112 | 113 | let character = this.source[++this.index] 114 | 115 | if (character === '\n') { 116 | this.line++ 117 | this.lineCharacter = 0 118 | } else { 119 | this.lineCharacter++ 120 | } 121 | 122 | return character 123 | } 124 | 125 | // 126 | // returns the character currently pointed at 127 | // without advancing the index 128 | // 129 | peek() { 130 | if (this.willOverflow()) { return null } 131 | return this.source[this.index + 1] 132 | } 133 | 134 | // 135 | // Shows the character at the current pointer position 136 | // 137 | current() { 138 | return this.source[this.index] 139 | } 140 | 141 | // Check that we don't try and advance the index 142 | // past the end of the file. 143 | willOverflow() { 144 | return this.index >= this.sourceLength - 1 145 | } 146 | 147 | skipWhitespace() { 148 | while (~formats.whitespace.indexOf(this.peek())) { this.next() } 149 | } 150 | 151 | skipLine() { 152 | while (this.next() !== '\n') {} 153 | } 154 | 155 | // Should be called after the tokens have been created 156 | nextToken() { 157 | this.activeToken = this.tokens.shift() 158 | return this.activeToken 159 | } 160 | 161 | nextTokenType() { 162 | return this.tokens[0].type 163 | } 164 | 165 | empty() { 166 | return !this.tokens.length 167 | } 168 | 169 | // 170 | // We'll do this using two passes and build the token stream 171 | // before the parser constructs the AST 172 | // 173 | lex() { 174 | while (!this.willOverflow()) { 175 | this.tokens.push(this.tokenize()) 176 | } 177 | 178 | return this.tokens 179 | } 180 | 181 | // Finds and returns the next non-whitespace token in the input 182 | // string. Will throw an error if the token is malformed. 183 | tokenize() { 184 | let character = this.next() 185 | 186 | if (character === '@') { 187 | return this.lexVariableName() 188 | } else if (character === null) { 189 | return { val: null, type: types.EOF, position: this.position } 190 | } else if (character === '"' || character === "'") { // eslint-disable-line quotes 191 | return this.lexString() 192 | } else if (character === '/') { 193 | this.lexComment() 194 | return this.tokenize() 195 | } else if (~'=.'.indexOf(character)) { 196 | return this.lexSingle() 197 | } else if (~formats.whitespace.indexOf(character)) { 198 | this.skipWhitespace() 199 | return this.tokenize() 200 | } else if (this.keywordStart(character)) { 201 | return this.lexKeyword() 202 | throw Error 203 | } else { 204 | return console.error('unknown character', character) 205 | } 206 | } 207 | 208 | // returns all keywords that have *character* at the 209 | // *index* position 210 | keywordIndexMatch(character, index, keywordSet = keywords) { 211 | let acc = [] 212 | 213 | for (let keyword of keywordSet) { 214 | // index out of bounds for the keyword 215 | if (index > keyword.length - 1) { continue } 216 | // character equality 217 | if (character === keyword[index]) { acc.push(keyword) } 218 | } 219 | 220 | return acc 221 | } 222 | 223 | // returns true if the character is the start of any keywords 224 | // in the language 225 | keywordStart(character) { 226 | return !!this.keywordIndexMatch(character, 0).length 227 | } 228 | 229 | lexKeyword() { 230 | let startPosition = this.position 231 | let index = 0 232 | let matches = this.keywordIndexMatch(this.current(), index) 233 | let finalMatch 234 | 235 | // tokens must be surrounded by whitespace 236 | while (matches.length && !~formats.whitespace.indexOf(this.peek())) { 237 | // increment both pointers at the same time 238 | this.next() 239 | index++ 240 | 241 | // limit possible keywords to those already matched at lower indices 242 | matches = this.keywordIndexMatch(this.current(), index, matches) 243 | } 244 | 245 | finalMatch = matches[0] 246 | 247 | // if we have reached a space but the keyword isn't valid 248 | if (!finalMatch) { this.errorExpected('keyword', startPosition) } 249 | 250 | return { 251 | type: types[finalMatch], 252 | value: finalMatch, 253 | position: startPosition 254 | } 255 | } 256 | 257 | lexSingle() { 258 | let single = this.current() 259 | 260 | // this.assertType(single) 261 | 262 | return { 263 | type: types[single], 264 | value: single, 265 | position: this.position 266 | } 267 | } 268 | 269 | lexVariableName() { 270 | let startPosition = this.position 271 | let varName = this.next() 272 | 273 | // NOTE: ignore the initial @ symbol 274 | // but expect the next character to be valid 275 | if (!~formats.variableName.indexOf(varName)) { 276 | this.errorExpected('a valid variable name character') 277 | } 278 | 279 | while (~formats.variableName.indexOf(this.peek())) { 280 | varName += this.next() 281 | } 282 | 283 | return { 284 | type: types.variableName, 285 | value: varName, 286 | position: startPosition 287 | } 288 | } 289 | 290 | lexString() { 291 | // NOTE: This allows strings to use " or ' 292 | const strOpen = this.current() 293 | let startPosition = this.position 294 | let string = this.next() 295 | 296 | while (this.peek() && this.peek() !== strOpen) { 297 | string += this.next() 298 | } 299 | 300 | if (this.next() !== strOpen) { this.errorExpected(strOpen) } 301 | 302 | return { 303 | value: string, 304 | type: types.string, 305 | position: startPosition 306 | } 307 | } 308 | 309 | // 310 | // NOTE: Comments are allowed at the end of a line too 311 | // 312 | lexComment() { 313 | this.assert(this.peek(), '/', () => { 314 | this.errorExpected('/') 315 | }) 316 | 317 | // consume the next token and skip the rest of the line 318 | this.next() 319 | this.skipLine() 320 | } 321 | 322 | // asserts the equality of two values 323 | assert(actual, expected, func = function() {}) { 324 | if (actual !== expected) { 325 | func() 326 | return false 327 | } 328 | 329 | return true 330 | } 331 | 332 | error(message) { 333 | throw new Error(message) 334 | } 335 | 336 | errorExpected(expectStr, position = this.position) { 337 | console.log('tokenize =>', this.source, this.peek()) 338 | 339 | hw.log('{_bold}' + this.linesForDebug[this.position.line - 1]) 340 | hw.log('{red}' + ' '.repeat(this.position.character - 1) + '⇑') 341 | this.error(`Expected ${expectStr} at ${this.formatPosition(position)}`) 342 | } 343 | 344 | formatPosition(position = this.position) { 345 | return `L${position.line} C${position.character}` 346 | } 347 | } 348 | -------------------------------------------------------------------------------- /src/nodes/block.js: -------------------------------------------------------------------------------- 1 | export default class BlockNode { 2 | // @param [String] action 3 | // @param [TargetNode] target 4 | constructor(action, target) { 5 | this.action = action 6 | this.target = target 7 | this.triggers = [] 8 | this.scope = null 9 | } 10 | 11 | requireNewTarget() { 12 | return this.target.type === 'selector' 13 | } 14 | 15 | toString() { 16 | let scopeVariables = '' 17 | 18 | for (let key of Object.keys(this.scope)) { 19 | scopeVariables += ` var $${key} = query('${this.scope[key]}')\n` 20 | } 21 | 22 | const body = this.triggers.map(t => t.toString()).join('\n') 23 | const newTarget = ` var $__target__ = query('${this.target.value}')` 24 | const eventTarget = this.requireNewTarget() ? '$__target__' : `$${this.target.value}` 25 | 26 | return `\n;(function() { 27 | ${this.requireNewTarget() ? newTarget : ''} 28 | root.ui.events.addEvent(${eventTarget}, '${this.action}', function(e) { 29 | ${scopeVariables} 30 | ${body} 31 | }) 32 | })()\n` 33 | } 34 | 35 | addStatement(triggerNode) { 36 | this.triggers.push(triggerNode) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/nodes/index.js: -------------------------------------------------------------------------------- 1 | import BlockNode from './block' 2 | import TriggerNode from './trigger' 3 | import ReceiverNode from './receiver' 4 | import TargetNode from './target' 5 | 6 | export { 7 | BlockNode, 8 | TriggerNode, 9 | ReceiverNode, 10 | TargetNode 11 | } 12 | -------------------------------------------------------------------------------- /src/nodes/receiver.js: -------------------------------------------------------------------------------- 1 | export default class ReceiverNode { 2 | constructor(type, value = 'e.currentTarget') { 3 | this.type = type 4 | this.value = value 5 | } 6 | 7 | toString() { 8 | switch (this.type) { 9 | case 'variable': 10 | return `$${this.value}` 11 | break 12 | case 'selector': 13 | return `query('${this.value}')` 14 | break 15 | case 'implicit': 16 | return this.value 17 | default: 18 | return console.error('Unexpected node type') 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/nodes/target.js: -------------------------------------------------------------------------------- 1 | export default class TargetNode { 2 | // @param [String] type 3 | // @param [String] value 4 | constructor(type, value) { 5 | this.type = type 6 | this.value = value 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/nodes/trigger.js: -------------------------------------------------------------------------------- 1 | export default class TriggerNode { 2 | // @param [String] triggerType 3 | // Holds what event should happen once this trigger is invoked 4 | // @param [String] selector 5 | // The selector passed to the trigger 6 | // @param [ReceiverNode] receiver 7 | // The element that receives the trigger 8 | constructor(triggerType, selector, receiver) { 9 | this.triggerType = triggerType 10 | this.selector = selector 11 | this.receiver = receiver 12 | } 13 | 14 | toString() { 15 | return ` root.ui.dom['${this.triggerType}'](${this.receiver.toString()}, '${this.selector}')` 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/parser.js: -------------------------------------------------------------------------------- 1 | import { types } from './lexer' 2 | import Tree from './tree' 3 | import { 4 | BlockNode, 5 | TriggerNode, 6 | ReceiverNode, 7 | TargetNode 8 | } from './nodes/index.js' 9 | 10 | const supportedActions = [ 11 | 'click', 'dblclick', 'mouseover', 'mouseenter', 'mouseexit' 12 | ] 13 | 14 | const supportedTriggers = [ 15 | 'add', 'remove', 'toggle' 16 | ] 17 | 18 | export default class Parser { 19 | constructor(lexer) { 20 | this.lexer = lexer 21 | 22 | // list of block nodes for the program 23 | this.ast = new Tree() 24 | 25 | // holds all block declarations for the current block in scope 26 | this.blockStatements = [] 27 | 28 | // split into tokens 29 | this.lexer.lex() 30 | } 31 | 32 | // Should always be called first 33 | // Each line should only begin with one of 3 tokens. 34 | // This is for top level staments only - scope blocks are treated 35 | // differently 36 | parse() { 37 | if (this.lexer.empty()) { return } 38 | 39 | // we know we have at least once token so don't need to type check 40 | let type = this.lexer.nextTokenType() 41 | 42 | while (type) { 43 | // @name ... 44 | if (type === types.variableName) { 45 | this.parseVariableAssignment() 46 | // when ... 47 | } else if (type === types.declarationStart) { 48 | this.parseUiDeclaration() 49 | } else if (type === types.EOF) { 50 | // reached the end 51 | break 52 | } else { 53 | this.unexpectedError() 54 | } 55 | 56 | // fetch the next token if there is one 57 | type = this.lexer.empty() ? null : this.lexer.nextTokenType() 58 | } 59 | } 60 | 61 | // 62 | // Parses the variable and binds it with the current scope object 63 | // 64 | parseVariableAssignment() { 65 | let varName = this.lexer.nextToken() 66 | this.assert(varName.type, types.variableName) 67 | 68 | this.assert(this.lexer.nextToken().type, types.assignment) 69 | 70 | let varValue = this.lexer.nextToken() 71 | this.assert(varValue.type, types.string) 72 | 73 | this.ast.scopes.add(varName.value, varValue.value) 74 | } 75 | 76 | parseUiDeclaration() { 77 | this.assert(this.lexer.nextToken().type, types.declarationStart) 78 | this.assert(this.lexer.nextToken().type, types.naturalLang) 79 | 80 | let action = this.lexer.nextToken() 81 | this.assert(action.type, types.string) 82 | this.assertSupportedAction(action.value) 83 | 84 | this.assert(this.lexer.nextToken().type, types.naturalLang) 85 | 86 | let target = this.lexer.nextToken() 87 | this.assert(target.type, [types.string, types.variableName]) 88 | let type = target.type === types.string ? 'selector' : 'variable' 89 | let targetNode = new TargetNode(type, target.value) 90 | 91 | // Scope gate 92 | this.ast.scopes.addScope() 93 | 94 | this.parseBlock() 95 | 96 | let blockNode = new BlockNode(action.value, targetNode) 97 | 98 | while (this.blockStatements.length) { 99 | blockNode.addStatement(this.blockStatements.shift()) 100 | } 101 | 102 | blockNode.scope = this.ast.scopes.removeScope() 103 | this.ast.push(blockNode) 104 | } 105 | 106 | parseBlock() { 107 | this.assert(this.lexer.nextToken().type, types.declarationBlockStart) 108 | let type = this.lexer.nextTokenType() 109 | 110 | // can I wrap this while inside a generator to automatically grab the next 111 | // token? 112 | while (type) { 113 | // @name ... 114 | if (type === types.variableName) { 115 | this.parseVariableAssignment() 116 | // add, remove, toggle ... 117 | } else if (type = types.trigger) { 118 | this.parseTriggerStatement() 119 | } else { 120 | // unexpected token 121 | // TODO: create method to throw unexpected token error 122 | this.error() 123 | } 124 | 125 | // fetch the next token if there is one 126 | type = this.lexer.empty() ? null : this.lexer.nextTokenType() 127 | 128 | // we need to escape out of this loop 129 | if (type === types.declarationBlockEnd) { break } 130 | } 131 | 132 | this.assert(this.lexer.nextToken().type, types.declarationBlockEnd) 133 | } 134 | 135 | // (? on ) 136 | // toggle ".is-open" 137 | // toggle ".is-open" on @element 138 | // toggle ".is-open" on ".different-element" 139 | parseTriggerStatement() { 140 | let receiver = null 141 | 142 | let trigger = this.lexer.nextToken() 143 | this.assert(trigger.type, types.trigger) 144 | this.assertSupportedTrigger(trigger.value) 145 | 146 | let selector = this.lexer.nextToken() 147 | this.assert(selector.type, types.string) 148 | 149 | // Optional on clause 150 | if (this.lexer.nextTokenType() === types.naturalLang) { 151 | this.assert(this.lexer.nextToken().type, types.naturalLang) 152 | 153 | if (this.lexer.nextTokenType() === types.variableName) { 154 | let reference = this.lexer.nextToken().value 155 | receiver = this.ast.scopes.fetch(reference) 156 | 157 | if (receiver === null) { 158 | this.error(`Found an unbound variable reference @${reference}`, reference) 159 | } 160 | 161 | receiver = new ReceiverNode('variable', reference) 162 | } else if (this.lexer.nextTokenType() === types.string) { 163 | receiver = new ReceiverNode('selector', this.lexer.nextToken().value) 164 | } else { 165 | this.unexpectedError() 166 | } 167 | } 168 | 169 | // bind any events to the current element in this block if no explicit reference given 170 | receiver = receiver || new ReceiverNode('implicit') 171 | 172 | let triggerNode = new TriggerNode(trigger.value, selector.value, receiver) 173 | this.blockStatements.push(triggerNode) 174 | } 175 | 176 | assertSupportedAction(action) { 177 | if (~supportedActions.indexOf(action)) { return } 178 | this.unexpectedError() 179 | } 180 | 181 | assertSupportedTrigger(trigger) { 182 | if (~supportedTriggers.indexOf(trigger)) { return } 183 | this.unexpectedError() 184 | } 185 | 186 | assert(actual, expected) { 187 | if (!Array.isArray(expected)) { expected = [expected] } 188 | if (~expected.indexOf(actual)) { return } 189 | 190 | let position = this.lexer.activeToken.position 191 | 192 | // Doing this right now for this problem https://github.com/nodejs/node/issues/927 193 | this.lexer.error(`Expected ${expected.toString()} at ${this.lexer.formatPosition(position)}`) 194 | } 195 | 196 | unexpectedError() { 197 | let position = this.lexer.activeToken.position 198 | this.lexer.error(`Unxpected token at ${this.lexer.formatPosition(position)}`) 199 | } 200 | 201 | error(text) { 202 | this.lexer.error(`Error: ${text}, at ${this.lexer.formatPosition()}`) 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /src/runner.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import fs from 'fs' 3 | import hw from 'headway' 4 | import chokidar from 'chokidar' 5 | import uglify from 'uglify-js' 6 | import { futils } from './utils/futils' 7 | import Lexer from './lexer' 8 | import Parser from './parser' 9 | import template from './templates/wrapper' 10 | 11 | let watcher = null 12 | 13 | const transforms = { 14 | minify: (str) => uglify.minify(str, { fromString: true }).code 15 | } 16 | 17 | const buildTransformPipeline = (options) => { 18 | return [ 19 | options.minify && transforms.minify 20 | ].filter(Boolean) 21 | } 22 | 23 | const write = (astString, fd = process.stdout, transformFunctions = []) => { 24 | const transformed = transformFunctions 25 | .reduce((acc, fn) => fn(acc), astString) 26 | 27 | fd.write(template(transformed)) 28 | } 29 | 30 | export default function run(input, options) { 31 | const promises = input.map(file => { 32 | return futils.exists(file) 33 | .then(() => futils.read(file)) 34 | .then(source => { 35 | if (options.watch) { 36 | chokidar.watch(file, { 37 | persistent: true, 38 | }).on('all', function(type, filename) { 39 | // 40 | // Don't do anything if we remove the file 41 | // 42 | if (['add', 'change'].indexOf(type) !== -1) { 43 | console.log(filename, 'changed') 44 | } 45 | }) 46 | } 47 | 48 | let lexer = new Lexer(source) 49 | let parser = new Parser(lexer) 50 | 51 | let newFile = file.toString().substr(0, file.lastIndexOf('.')) + '.js' 52 | let dest = path.join('.' || path.dirname(newFile), newFile) 53 | let fd = fs.createWriteStream(dest) 54 | let activeTransforms = buildTransformPipeline(options) 55 | 56 | parser.parse() 57 | write(parser.ast.toString(), fd, activeTransforms) 58 | 59 | hw.log(`{yellow}${file}{/} -> ${dest}`) 60 | 61 | return new Promise(resolve => resolve(true)) 62 | }) 63 | .catch(err => { 64 | console.error(err.stack) 65 | 66 | if (watcher) { 67 | watcher.close() 68 | } 69 | }) 70 | }) 71 | 72 | Promise.all(promises).then(function(values) { 73 | if (!options.watch) { 74 | console.log(`\n${values.length} files finished`) 75 | } 76 | }) 77 | } 78 | 79 | -------------------------------------------------------------------------------- /src/scopeStack.js: -------------------------------------------------------------------------------- 1 | export default class ScopeStack { 2 | constructor() { 3 | this.scopes = [] 4 | 5 | // Add the root scope automatically 6 | this.addScope() 7 | } 8 | 9 | get first() { 10 | return this.scopes[0] 11 | } 12 | 13 | get last() { 14 | return this.scopes[this.scopes.length - 1] 15 | } 16 | 17 | addScope(scope = {}) { 18 | return this.scopes.push(scope) 19 | } 20 | 21 | removeScope() { 22 | return this.scopes.pop() 23 | } 24 | 25 | add(key, val) { 26 | this.last[key] = val 27 | } 28 | 29 | remove() { 30 | return this.scopes.shift() 31 | } 32 | 33 | // reaches up through the scope chain 34 | fetch(key) { 35 | let len = this.scopes.length 36 | 37 | while (len--) { 38 | if (this.scopes[len][key]) { return this.scopes[len][key] } 39 | } 40 | 41 | return null 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/templates/wrapper.js: -------------------------------------------------------------------------------- 1 | export default (code) => (` 2 | ;(function(root) { 3 | /* eslint-disable no-unused-vars */ 4 | let query = document.querySelectorAll.bind(document) 5 | /* eslint-enable no-unused-vars */ 6 | 7 | root.ui = { 8 | forEachNode: function(nodeList, cb) { 9 | if (nodeList && nodeList.nodeType && nodeList.nodeType === 1) { 10 | nodeList = [nodeList] 11 | } 12 | 13 | Array.from(nodeList).forEach(elem => cb(elem)) 14 | }, 15 | 16 | events: { 17 | addEvent(nodeList, evt, fn) { 18 | root.ui.forEachNode(nodeList, elem => elem.addEventListener(evt, fn, false)) 19 | }, 20 | 21 | removeEvent(nodeList, evt, fn) { 22 | root.ui.forEachNode(nodeList, elem => elem.removeEventListener(evt, fn, false)) 23 | } 24 | }, 25 | 26 | dom: { 27 | has(elem, val) { 28 | return elem.className && elem.className.indexOf(val) !== -1 29 | }, 30 | 31 | add(nodeList, val) { 32 | root.ui.forEachNode(nodeList, function(elem) { 33 | if (!root.ui.dom.has(elem, val)) { 34 | elem.classList.add(val) 35 | } 36 | }) 37 | }, 38 | 39 | remove(nodeList, val) { 40 | root.ui.forEachNode(nodeList, function(elem) { 41 | elem.className = (elem.className).replace(val, '') 42 | }) 43 | }, 44 | 45 | toggle(nodeList, val) { 46 | root.ui.forEachNode(nodeList, function(elem) { 47 | let method = root.ui.dom.has(elem, val) ? 'remove' : 'add' 48 | root.ui.dom[method](elem, val) 49 | }) 50 | } 51 | } 52 | } 53 | 54 | ${code} 55 | 56 | }(window)) 57 | `) 58 | -------------------------------------------------------------------------------- /src/tree.js: -------------------------------------------------------------------------------- 1 | import ScopeStack from './scopeStack' 2 | 3 | export default class Tree { 4 | constructor() { 5 | // holds a list of all child nodes 6 | this.children = [] 7 | 8 | // holds a reference to all variables declared in the script 9 | // with the @ stripped off 10 | this.scopes = new ScopeStack() 11 | } 12 | 13 | get globals() { 14 | return this.scopes.first 15 | } 16 | 17 | toString() { 18 | let content = '' 19 | 20 | // Global variables 21 | for (let key of Object.keys(this.globals)) { 22 | content += `var $${key} = query('${this.globals[key]}')\n` 23 | } 24 | 25 | // String representation of all child nodes 26 | content += this.children.map(c => c.toString()).join('\n') 27 | 28 | return content 29 | } 30 | 31 | push(child) { 32 | this.children.push(child) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/utils/futils.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copied without shame from https://github.com/mjmlio/mjml 3 | // 4 | 5 | import fs from 'fs' 6 | 7 | const promisify = fn => 8 | (...args) => 9 | new Promise((resolve, reject) => 10 | fn(...args.concat((err, ...data) => 11 | err ? reject(err) : resolve(...data)))) 12 | 13 | export const futils = { 14 | read: promisify(fs.readFile), 15 | exists: promisify((file, cb) => fs.access(file, fs.R_OK | fs.W_OK, cb)) 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/range.js: -------------------------------------------------------------------------------- 1 | const boundaries = { 2 | // char codes for upper and lowercase letters are the same 3 | 'lowercase': [[65, 90], element => { return element.toLowerCase() }], 4 | 'uppercase': [[65, 90]], 5 | 'numbers': [[48, 57]] 6 | } 7 | 8 | let letterCache = {} 9 | 10 | // 11 | // TODO: profile if an array or a string in quicker here 12 | // 13 | export default function range(...charSets) { 14 | let acc = [] 15 | 16 | charSets.forEach(set => { 17 | acc = acc.concat(letterCache[set] || (function() { 18 | let boundary = boundaries[set] 19 | let index = boundary[0][0] 20 | let characters = [] 21 | 22 | while (index <= boundary[0][1]) { 23 | characters.push(String.fromCharCode(index)) 24 | index++ 25 | } 26 | 27 | // check for modification function 28 | if (typeof boundary[1] === 'function') { 29 | characters = characters.map(boundary[1]) 30 | } 31 | 32 | letterCache[set] = characters 33 | return letterCache[set] 34 | }())) 35 | }) 36 | 37 | return acc.join('') 38 | } 39 | -------------------------------------------------------------------------------- /test/.opts: -------------------------------------------------------------------------------- 1 | --reporter dot 2 | --ui bdd 3 | --colors 4 | --timeout 200 5 | --slow 50 6 | --recursive 7 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.0.9" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 8 | 9 | acorn-jsx@^3.0.0: 10 | version "3.0.1" 11 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 12 | dependencies: 13 | acorn "^3.0.4" 14 | 15 | acorn@^3.0.4: 16 | version "3.3.0" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 18 | 19 | acorn@^4.0.1: 20 | version "4.0.3" 21 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" 22 | 23 | ajv-keywords@^1.0.0: 24 | version "1.1.1" 25 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" 26 | 27 | ajv@^4.7.0: 28 | version "4.8.2" 29 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.8.2.tgz#65486936ca36fea39a1504332a78bebd5d447bdc" 30 | dependencies: 31 | co "^4.6.0" 32 | json-stable-stringify "^1.0.1" 33 | 34 | align-text@^0.1.1, align-text@^0.1.3: 35 | version "0.1.4" 36 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 37 | dependencies: 38 | kind-of "^3.0.2" 39 | longest "^1.0.1" 40 | repeat-string "^1.5.2" 41 | 42 | ancee@^1.0.1: 43 | version "1.0.1" 44 | resolved "https://registry.yarnpkg.com/ancee/-/ancee-1.0.1.tgz#068a612e81cc28ee2f2874c23074a032722d2b52" 45 | 46 | ansi-escapes@^1.1.0: 47 | version "1.4.0" 48 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 49 | 50 | ansi-regex@^2.0.0: 51 | version "2.0.0" 52 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 53 | 54 | ansi-styles@^2.2.1: 55 | version "2.2.1" 56 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 57 | 58 | anymatch@^1.3.0: 59 | version "1.3.0" 60 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 61 | dependencies: 62 | arrify "^1.0.0" 63 | micromatch "^2.1.5" 64 | 65 | aproba@^1.0.3: 66 | version "1.0.4" 67 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" 68 | 69 | are-we-there-yet@~1.1.2: 70 | version "1.1.2" 71 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 72 | dependencies: 73 | delegates "^1.0.0" 74 | readable-stream "^2.0.0 || ^1.1.13" 75 | 76 | argparse@^1.0.7: 77 | version "1.0.9" 78 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 79 | dependencies: 80 | sprintf-js "~1.0.2" 81 | 82 | arr-diff@^2.0.0: 83 | version "2.0.0" 84 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 85 | dependencies: 86 | arr-flatten "^1.0.1" 87 | 88 | arr-flatten@^1.0.1: 89 | version "1.0.1" 90 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 91 | 92 | array-union@^1.0.1: 93 | version "1.0.2" 94 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 95 | dependencies: 96 | array-uniq "^1.0.1" 97 | 98 | array-uniq@^1.0.1: 99 | version "1.0.3" 100 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 101 | 102 | array-unique@^0.2.1: 103 | version "0.2.1" 104 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 105 | 106 | arrify@^1.0.0: 107 | version "1.0.1" 108 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 109 | 110 | asn1@~0.2.3: 111 | version "0.2.3" 112 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 113 | 114 | assert-plus@^0.2.0: 115 | version "0.2.0" 116 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 117 | 118 | assert-plus@^1.0.0: 119 | version "1.0.0" 120 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 121 | 122 | async-each@^1.0.0: 123 | version "1.0.1" 124 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 125 | 126 | async@~0.2.6: 127 | version "0.2.10" 128 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 129 | 130 | asynckit@^0.4.0: 131 | version "0.4.0" 132 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 133 | 134 | aws-sign2@~0.6.0: 135 | version "0.6.0" 136 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 137 | 138 | aws4@^1.2.1: 139 | version "1.5.0" 140 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" 141 | 142 | babel-code-frame@^6.16.0: 143 | version "6.16.0" 144 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" 145 | dependencies: 146 | chalk "^1.1.0" 147 | esutils "^2.0.2" 148 | js-tokens "^2.0.0" 149 | 150 | balanced-match@^0.4.1: 151 | version "0.4.2" 152 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 153 | 154 | bcrypt-pbkdf@^1.0.0: 155 | version "1.0.0" 156 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" 157 | dependencies: 158 | tweetnacl "^0.14.3" 159 | 160 | binary-extensions@^1.0.0: 161 | version "1.7.0" 162 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" 163 | 164 | block-stream@*: 165 | version "0.0.9" 166 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 167 | dependencies: 168 | inherits "~2.0.0" 169 | 170 | boom@2.x.x: 171 | version "2.10.1" 172 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 173 | dependencies: 174 | hoek "2.x.x" 175 | 176 | brace-expansion@^1.0.0: 177 | version "1.1.6" 178 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 179 | dependencies: 180 | balanced-match "^0.4.1" 181 | concat-map "0.0.1" 182 | 183 | braces@^1.8.2: 184 | version "1.8.5" 185 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 186 | dependencies: 187 | expand-range "^1.8.1" 188 | preserve "^0.2.0" 189 | repeat-element "^1.1.2" 190 | 191 | browser-stdout@1.3.0: 192 | version "1.3.0" 193 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 194 | 195 | buffer-shims@^1.0.0: 196 | version "1.0.0" 197 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 198 | 199 | caller-path@^0.1.0: 200 | version "0.1.0" 201 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 202 | dependencies: 203 | callsites "^0.2.0" 204 | 205 | callsites@^0.2.0: 206 | version "0.2.0" 207 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 208 | 209 | camelcase@^1.0.2: 210 | version "1.2.1" 211 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 212 | 213 | caseless@~0.11.0: 214 | version "0.11.0" 215 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 216 | 217 | center-align@^0.1.1: 218 | version "0.1.3" 219 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 220 | dependencies: 221 | align-text "^0.1.3" 222 | lazy-cache "^1.0.3" 223 | 224 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 225 | version "1.1.3" 226 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 227 | dependencies: 228 | ansi-styles "^2.2.1" 229 | escape-string-regexp "^1.0.2" 230 | has-ansi "^2.0.0" 231 | strip-ansi "^3.0.0" 232 | supports-color "^2.0.0" 233 | 234 | chokidar@^1.6.0: 235 | version "1.6.1" 236 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 237 | dependencies: 238 | anymatch "^1.3.0" 239 | async-each "^1.0.0" 240 | glob-parent "^2.0.0" 241 | inherits "^2.0.1" 242 | is-binary-path "^1.0.0" 243 | is-glob "^2.0.0" 244 | path-is-absolute "^1.0.0" 245 | readdirp "^2.0.0" 246 | optionalDependencies: 247 | fsevents "^1.0.0" 248 | 249 | circular-json@^0.3.0: 250 | version "0.3.1" 251 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 252 | 253 | cli-cursor@^1.0.1: 254 | version "1.0.2" 255 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 256 | dependencies: 257 | restore-cursor "^1.0.1" 258 | 259 | cli-width@^2.0.0: 260 | version "2.1.0" 261 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 262 | 263 | cliui@^2.1.0: 264 | version "2.1.0" 265 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 266 | dependencies: 267 | center-align "^0.1.1" 268 | right-align "^0.1.1" 269 | wordwrap "0.0.2" 270 | 271 | co@^4.6.0: 272 | version "4.6.0" 273 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 274 | 275 | code-point-at@^1.0.0: 276 | version "1.1.0" 277 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 278 | 279 | combined-stream@^1.0.5, combined-stream@~1.0.5: 280 | version "1.0.5" 281 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 282 | dependencies: 283 | delayed-stream "~1.0.0" 284 | 285 | commander@2.9.0, commander@^2.9.0: 286 | version "2.9.0" 287 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 288 | dependencies: 289 | graceful-readlink ">= 1.0.0" 290 | 291 | concat-map@0.0.1: 292 | version "0.0.1" 293 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 294 | 295 | concat-stream@^1.4.6: 296 | version "1.5.2" 297 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" 298 | dependencies: 299 | inherits "~2.0.1" 300 | readable-stream "~2.0.0" 301 | typedarray "~0.0.5" 302 | 303 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 304 | version "1.1.0" 305 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 306 | 307 | core-util-is@~1.0.0: 308 | version "1.0.2" 309 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 310 | 311 | cryptiles@2.x.x: 312 | version "2.0.5" 313 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 314 | dependencies: 315 | boom "2.x.x" 316 | 317 | d@^0.1.1, d@~0.1.1: 318 | version "0.1.1" 319 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 320 | dependencies: 321 | es5-ext "~0.10.2" 322 | 323 | dashdash@^1.12.0: 324 | version "1.14.0" 325 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" 326 | dependencies: 327 | assert-plus "^1.0.0" 328 | 329 | debug@2.2.0, debug@~2.2.0: 330 | version "2.2.0" 331 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 332 | dependencies: 333 | ms "0.7.1" 334 | 335 | debug@^2.1.1: 336 | version "2.3.2" 337 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.2.tgz#94cb466ef7d6d2c7e5245cdd6e4104f2d0d70d30" 338 | dependencies: 339 | ms "0.7.2" 340 | 341 | decamelize@^1.0.0: 342 | version "1.2.0" 343 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 344 | 345 | deep-extend@~0.4.0: 346 | version "0.4.1" 347 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 348 | 349 | deep-is@~0.1.3: 350 | version "0.1.3" 351 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 352 | 353 | del@^2.0.2: 354 | version "2.2.2" 355 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 356 | dependencies: 357 | globby "^5.0.0" 358 | is-path-cwd "^1.0.0" 359 | is-path-in-cwd "^1.0.0" 360 | object-assign "^4.0.1" 361 | pify "^2.0.0" 362 | pinkie-promise "^2.0.0" 363 | rimraf "^2.2.8" 364 | 365 | delayed-stream@~1.0.0: 366 | version "1.0.0" 367 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 368 | 369 | delegates@^1.0.0: 370 | version "1.0.0" 371 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 372 | 373 | diff@1.4.0: 374 | version "1.4.0" 375 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 376 | 377 | doctrine@^1.2.2: 378 | version "1.5.0" 379 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 380 | dependencies: 381 | esutils "^2.0.2" 382 | isarray "^1.0.0" 383 | 384 | ecc-jsbn@~0.1.1: 385 | version "0.1.1" 386 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 387 | dependencies: 388 | jsbn "~0.1.0" 389 | 390 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 391 | version "0.10.12" 392 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 393 | dependencies: 394 | es6-iterator "2" 395 | es6-symbol "~3.1" 396 | 397 | es6-iterator@2: 398 | version "2.0.0" 399 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 400 | dependencies: 401 | d "^0.1.1" 402 | es5-ext "^0.10.7" 403 | es6-symbol "3" 404 | 405 | es6-map@^0.1.3: 406 | version "0.1.4" 407 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 408 | dependencies: 409 | d "~0.1.1" 410 | es5-ext "~0.10.11" 411 | es6-iterator "2" 412 | es6-set "~0.1.3" 413 | es6-symbol "~3.1.0" 414 | event-emitter "~0.3.4" 415 | 416 | es6-set@~0.1.3: 417 | version "0.1.4" 418 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 419 | dependencies: 420 | d "~0.1.1" 421 | es5-ext "~0.10.11" 422 | es6-iterator "2" 423 | es6-symbol "3" 424 | event-emitter "~0.3.4" 425 | 426 | es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: 427 | version "3.1.0" 428 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 429 | dependencies: 430 | d "~0.1.1" 431 | es5-ext "~0.10.11" 432 | 433 | es6-weak-map@^2.0.1: 434 | version "2.0.1" 435 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 436 | dependencies: 437 | d "^0.1.1" 438 | es5-ext "^0.10.8" 439 | es6-iterator "2" 440 | es6-symbol "3" 441 | 442 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 443 | version "1.0.5" 444 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 445 | 446 | escope@^3.6.0: 447 | version "3.6.0" 448 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 449 | dependencies: 450 | es6-map "^0.1.3" 451 | es6-weak-map "^2.0.1" 452 | esrecurse "^4.1.0" 453 | estraverse "^4.1.1" 454 | 455 | eslint@^3.10.0: 456 | version "3.10.0" 457 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.10.0.tgz#4a90079046b3a89099eaa47787eafeb081e78209" 458 | dependencies: 459 | babel-code-frame "^6.16.0" 460 | chalk "^1.1.3" 461 | concat-stream "^1.4.6" 462 | debug "^2.1.1" 463 | doctrine "^1.2.2" 464 | escope "^3.6.0" 465 | espree "^3.3.1" 466 | estraverse "^4.2.0" 467 | esutils "^2.0.2" 468 | file-entry-cache "^2.0.0" 469 | glob "^7.0.3" 470 | globals "^9.2.0" 471 | ignore "^3.2.0" 472 | imurmurhash "^0.1.4" 473 | inquirer "^0.12.0" 474 | is-my-json-valid "^2.10.0" 475 | is-resolvable "^1.0.0" 476 | js-yaml "^3.5.1" 477 | json-stable-stringify "^1.0.0" 478 | levn "^0.3.0" 479 | lodash "^4.0.0" 480 | mkdirp "^0.5.0" 481 | natural-compare "^1.4.0" 482 | optionator "^0.8.2" 483 | path-is-inside "^1.0.1" 484 | pluralize "^1.2.1" 485 | progress "^1.1.8" 486 | require-uncached "^1.0.2" 487 | shelljs "^0.7.5" 488 | strip-bom "^3.0.0" 489 | strip-json-comments "~1.0.1" 490 | table "^3.7.8" 491 | text-table "~0.2.0" 492 | user-home "^2.0.0" 493 | 494 | espree@^3.3.1: 495 | version "3.3.2" 496 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" 497 | dependencies: 498 | acorn "^4.0.1" 499 | acorn-jsx "^3.0.0" 500 | 501 | esprima@^2.6.0: 502 | version "2.7.3" 503 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 504 | 505 | esrecurse@^4.1.0: 506 | version "4.1.0" 507 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 508 | dependencies: 509 | estraverse "~4.1.0" 510 | object-assign "^4.0.1" 511 | 512 | estraverse@^4.1.1, estraverse@^4.2.0: 513 | version "4.2.0" 514 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 515 | 516 | estraverse@~4.1.0: 517 | version "4.1.1" 518 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 519 | 520 | esutils@^2.0.2: 521 | version "2.0.2" 522 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 523 | 524 | event-emitter@~0.3.4: 525 | version "0.3.4" 526 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 527 | dependencies: 528 | d "~0.1.1" 529 | es5-ext "~0.10.7" 530 | 531 | exit-hook@^1.0.0: 532 | version "1.1.1" 533 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 534 | 535 | expand-brackets@^0.1.4: 536 | version "0.1.5" 537 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 538 | dependencies: 539 | is-posix-bracket "^0.1.0" 540 | 541 | expand-range@^1.8.1: 542 | version "1.8.2" 543 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 544 | dependencies: 545 | fill-range "^2.1.0" 546 | 547 | extend@~3.0.0: 548 | version "3.0.0" 549 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 550 | 551 | extglob@^0.3.1: 552 | version "0.3.2" 553 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 554 | dependencies: 555 | is-extglob "^1.0.0" 556 | 557 | extsprintf@1.0.2: 558 | version "1.0.2" 559 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 560 | 561 | fast-levenshtein@~2.0.4: 562 | version "2.0.5" 563 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" 564 | 565 | figures@^1.3.5: 566 | version "1.7.0" 567 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 568 | dependencies: 569 | escape-string-regexp "^1.0.5" 570 | object-assign "^4.1.0" 571 | 572 | file-entry-cache@^2.0.0: 573 | version "2.0.0" 574 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 575 | dependencies: 576 | flat-cache "^1.2.1" 577 | object-assign "^4.0.1" 578 | 579 | filename-regex@^2.0.0: 580 | version "2.0.0" 581 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 582 | 583 | fill-range@^2.1.0: 584 | version "2.2.3" 585 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 586 | dependencies: 587 | is-number "^2.1.0" 588 | isobject "^2.0.0" 589 | randomatic "^1.1.3" 590 | repeat-element "^1.1.2" 591 | repeat-string "^1.5.2" 592 | 593 | flat-cache@^1.2.1: 594 | version "1.2.1" 595 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" 596 | dependencies: 597 | circular-json "^0.3.0" 598 | del "^2.0.2" 599 | graceful-fs "^4.1.2" 600 | write "^0.2.1" 601 | 602 | for-in@^0.1.5: 603 | version "0.1.6" 604 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 605 | 606 | for-own@^0.1.4: 607 | version "0.1.4" 608 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 609 | dependencies: 610 | for-in "^0.1.5" 611 | 612 | forever-agent@~0.6.1: 613 | version "0.6.1" 614 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 615 | 616 | form-data@~2.1.1: 617 | version "2.1.2" 618 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 619 | dependencies: 620 | asynckit "^0.4.0" 621 | combined-stream "^1.0.5" 622 | mime-types "^2.1.12" 623 | 624 | fs.realpath@^1.0.0: 625 | version "1.0.0" 626 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 627 | 628 | fsevents@^1.0.0: 629 | version "1.0.15" 630 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" 631 | dependencies: 632 | nan "^2.3.0" 633 | node-pre-gyp "^0.6.29" 634 | 635 | fstream-ignore@~1.0.5: 636 | version "1.0.5" 637 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 638 | dependencies: 639 | fstream "^1.0.0" 640 | inherits "2" 641 | minimatch "^3.0.0" 642 | 643 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: 644 | version "1.0.10" 645 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" 646 | dependencies: 647 | graceful-fs "^4.1.2" 648 | inherits "~2.0.0" 649 | mkdirp ">=0.5 0" 650 | rimraf "2" 651 | 652 | gauge@~2.6.0: 653 | version "2.6.0" 654 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" 655 | dependencies: 656 | aproba "^1.0.3" 657 | console-control-strings "^1.0.0" 658 | has-color "^0.1.7" 659 | has-unicode "^2.0.0" 660 | object-assign "^4.1.0" 661 | signal-exit "^3.0.0" 662 | string-width "^1.0.1" 663 | strip-ansi "^3.0.1" 664 | wide-align "^1.1.0" 665 | 666 | generate-function@^2.0.0: 667 | version "2.0.0" 668 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 669 | 670 | generate-object-property@^1.1.0: 671 | version "1.2.0" 672 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 673 | dependencies: 674 | is-property "^1.0.0" 675 | 676 | getpass@^0.1.1: 677 | version "0.1.6" 678 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 679 | dependencies: 680 | assert-plus "^1.0.0" 681 | 682 | glob-base@^0.3.0: 683 | version "0.3.0" 684 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 685 | dependencies: 686 | glob-parent "^2.0.0" 687 | is-glob "^2.0.0" 688 | 689 | glob-parent@^2.0.0: 690 | version "2.0.0" 691 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 692 | dependencies: 693 | is-glob "^2.0.0" 694 | 695 | glob@7.0.5: 696 | version "7.0.5" 697 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" 698 | dependencies: 699 | fs.realpath "^1.0.0" 700 | inflight "^1.0.4" 701 | inherits "2" 702 | minimatch "^3.0.2" 703 | once "^1.3.0" 704 | path-is-absolute "^1.0.0" 705 | 706 | glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: 707 | version "7.1.1" 708 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 709 | dependencies: 710 | fs.realpath "^1.0.0" 711 | inflight "^1.0.4" 712 | inherits "2" 713 | minimatch "^3.0.2" 714 | once "^1.3.0" 715 | path-is-absolute "^1.0.0" 716 | 717 | globals@^9.2.0: 718 | version "9.13.0" 719 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.13.0.tgz#d97706b61600d8dbe94708c367d3fdcf48470b8f" 720 | 721 | globby@^5.0.0: 722 | version "5.0.0" 723 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 724 | dependencies: 725 | array-union "^1.0.1" 726 | arrify "^1.0.0" 727 | glob "^7.0.3" 728 | object-assign "^4.0.1" 729 | pify "^2.0.0" 730 | pinkie-promise "^2.0.0" 731 | 732 | graceful-fs@^4.1.2: 733 | version "4.1.10" 734 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.10.tgz#f2d720c22092f743228775c75e3612632501f131" 735 | 736 | "graceful-readlink@>= 1.0.0": 737 | version "1.0.1" 738 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 739 | 740 | growl@1.9.2: 741 | version "1.9.2" 742 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 743 | 744 | har-validator@~2.0.6: 745 | version "2.0.6" 746 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 747 | dependencies: 748 | chalk "^1.1.1" 749 | commander "^2.9.0" 750 | is-my-json-valid "^2.12.4" 751 | pinkie-promise "^2.0.0" 752 | 753 | has-ansi@^2.0.0: 754 | version "2.0.0" 755 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 756 | dependencies: 757 | ansi-regex "^2.0.0" 758 | 759 | has-color@^0.1.7: 760 | version "0.1.7" 761 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 762 | 763 | has-flag@^1.0.0: 764 | version "1.0.0" 765 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 766 | 767 | has-unicode@^2.0.0: 768 | version "2.0.1" 769 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 770 | 771 | hawk@~3.1.3: 772 | version "3.1.3" 773 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 774 | dependencies: 775 | boom "2.x.x" 776 | cryptiles "2.x.x" 777 | hoek "2.x.x" 778 | sntp "1.x.x" 779 | 780 | headway@0.3.0: 781 | version "0.3.0" 782 | resolved "https://registry.yarnpkg.com/headway/-/headway-0.3.0.tgz#95814e6c1242bc69a7b78f79f9133a1753147059" 783 | dependencies: 784 | ancee "^1.0.1" 785 | 786 | hoek@2.x.x: 787 | version "2.16.3" 788 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 789 | 790 | http-signature@~1.1.0: 791 | version "1.1.1" 792 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 793 | dependencies: 794 | assert-plus "^0.2.0" 795 | jsprim "^1.2.2" 796 | sshpk "^1.7.0" 797 | 798 | ignore@^3.2.0: 799 | version "3.2.0" 800 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" 801 | 802 | imurmurhash@^0.1.4: 803 | version "0.1.4" 804 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 805 | 806 | inflight@^1.0.4: 807 | version "1.0.6" 808 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 809 | dependencies: 810 | once "^1.3.0" 811 | wrappy "1" 812 | 813 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: 814 | version "2.0.3" 815 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 816 | 817 | ini@~1.3.0: 818 | version "1.3.4" 819 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 820 | 821 | inquirer@^0.12.0: 822 | version "0.12.0" 823 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 824 | dependencies: 825 | ansi-escapes "^1.1.0" 826 | ansi-regex "^2.0.0" 827 | chalk "^1.0.0" 828 | cli-cursor "^1.0.1" 829 | cli-width "^2.0.0" 830 | figures "^1.3.5" 831 | lodash "^4.3.0" 832 | readline2 "^1.0.1" 833 | run-async "^0.1.0" 834 | rx-lite "^3.1.2" 835 | string-width "^1.0.1" 836 | strip-ansi "^3.0.0" 837 | through "^2.3.6" 838 | 839 | interpret@^1.0.0: 840 | version "1.0.1" 841 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 842 | 843 | is-binary-path@^1.0.0: 844 | version "1.0.1" 845 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 846 | dependencies: 847 | binary-extensions "^1.0.0" 848 | 849 | is-buffer@^1.0.2: 850 | version "1.1.4" 851 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 852 | 853 | is-dotfile@^1.0.0: 854 | version "1.0.2" 855 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 856 | 857 | is-equal-shallow@^0.1.3: 858 | version "0.1.3" 859 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 860 | dependencies: 861 | is-primitive "^2.0.0" 862 | 863 | is-extendable@^0.1.1: 864 | version "0.1.1" 865 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 866 | 867 | is-extglob@^1.0.0: 868 | version "1.0.0" 869 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 870 | 871 | is-fullwidth-code-point@^1.0.0: 872 | version "1.0.0" 873 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 874 | dependencies: 875 | number-is-nan "^1.0.0" 876 | 877 | is-fullwidth-code-point@^2.0.0: 878 | version "2.0.0" 879 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 880 | 881 | is-glob@^2.0.0, is-glob@^2.0.1: 882 | version "2.0.1" 883 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 884 | dependencies: 885 | is-extglob "^1.0.0" 886 | 887 | is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: 888 | version "2.15.0" 889 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 890 | dependencies: 891 | generate-function "^2.0.0" 892 | generate-object-property "^1.1.0" 893 | jsonpointer "^4.0.0" 894 | xtend "^4.0.0" 895 | 896 | is-number@^2.0.2, is-number@^2.1.0: 897 | version "2.1.0" 898 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 899 | dependencies: 900 | kind-of "^3.0.2" 901 | 902 | is-path-cwd@^1.0.0: 903 | version "1.0.0" 904 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 905 | 906 | is-path-in-cwd@^1.0.0: 907 | version "1.0.0" 908 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 909 | dependencies: 910 | is-path-inside "^1.0.0" 911 | 912 | is-path-inside@^1.0.0: 913 | version "1.0.0" 914 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 915 | dependencies: 916 | path-is-inside "^1.0.1" 917 | 918 | is-posix-bracket@^0.1.0: 919 | version "0.1.1" 920 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 921 | 922 | is-primitive@^2.0.0: 923 | version "2.0.0" 924 | resolved "http://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 925 | 926 | is-property@^1.0.0: 927 | version "1.0.2" 928 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 929 | 930 | is-resolvable@^1.0.0: 931 | version "1.0.0" 932 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 933 | dependencies: 934 | tryit "^1.0.1" 935 | 936 | is-typedarray@~1.0.0: 937 | version "1.0.0" 938 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 939 | 940 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 941 | version "1.0.0" 942 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 943 | 944 | isobject@^2.0.0: 945 | version "2.1.0" 946 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 947 | dependencies: 948 | isarray "1.0.0" 949 | 950 | isstream@~0.1.2: 951 | version "0.1.2" 952 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 953 | 954 | jodid25519@^1.0.0: 955 | version "1.0.2" 956 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 957 | dependencies: 958 | jsbn "~0.1.0" 959 | 960 | js-tokens@^2.0.0: 961 | version "2.0.0" 962 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" 963 | 964 | js-yaml@^3.5.1: 965 | version "3.7.0" 966 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 967 | dependencies: 968 | argparse "^1.0.7" 969 | esprima "^2.6.0" 970 | 971 | jsbn@~0.1.0: 972 | version "0.1.0" 973 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" 974 | 975 | json-schema@0.2.3: 976 | version "0.2.3" 977 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 978 | 979 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 980 | version "1.0.1" 981 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 982 | dependencies: 983 | jsonify "~0.0.0" 984 | 985 | json-stringify-safe@~5.0.1: 986 | version "5.0.1" 987 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 988 | 989 | json3@3.3.2: 990 | version "3.3.2" 991 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 992 | 993 | jsonify@~0.0.0: 994 | version "0.0.0" 995 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 996 | 997 | jsonpointer@^4.0.0: 998 | version "4.0.0" 999 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 1000 | 1001 | jsprim@^1.2.2: 1002 | version "1.3.1" 1003 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 1004 | dependencies: 1005 | extsprintf "1.0.2" 1006 | json-schema "0.2.3" 1007 | verror "1.3.6" 1008 | 1009 | kind-of@^3.0.2: 1010 | version "3.0.4" 1011 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 1012 | dependencies: 1013 | is-buffer "^1.0.2" 1014 | 1015 | lazy-cache@^1.0.3: 1016 | version "1.0.4" 1017 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1018 | 1019 | levn@^0.3.0, levn@~0.3.0: 1020 | version "0.3.0" 1021 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1022 | dependencies: 1023 | prelude-ls "~1.1.2" 1024 | type-check "~0.3.2" 1025 | 1026 | lodash._baseassign@^3.0.0: 1027 | version "3.2.0" 1028 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 1029 | dependencies: 1030 | lodash._basecopy "^3.0.0" 1031 | lodash.keys "^3.0.0" 1032 | 1033 | lodash._basecopy@^3.0.0: 1034 | version "3.0.1" 1035 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1036 | 1037 | lodash._basecreate@^3.0.0: 1038 | version "3.0.3" 1039 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 1040 | 1041 | lodash._getnative@^3.0.0: 1042 | version "3.9.1" 1043 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1044 | 1045 | lodash._isiterateecall@^3.0.0: 1046 | version "3.0.9" 1047 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1048 | 1049 | lodash.create@3.1.1: 1050 | version "3.1.1" 1051 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 1052 | dependencies: 1053 | lodash._baseassign "^3.0.0" 1054 | lodash._basecreate "^3.0.0" 1055 | lodash._isiterateecall "^3.0.0" 1056 | 1057 | lodash.isarguments@^3.0.0: 1058 | version "3.1.0" 1059 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1060 | 1061 | lodash.isarray@^3.0.0: 1062 | version "3.0.4" 1063 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1064 | 1065 | lodash.keys@^3.0.0: 1066 | version "3.1.2" 1067 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1068 | dependencies: 1069 | lodash._getnative "^3.0.0" 1070 | lodash.isarguments "^3.0.0" 1071 | lodash.isarray "^3.0.0" 1072 | 1073 | lodash@^4.0.0, lodash@^4.3.0: 1074 | version "4.16.6" 1075 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" 1076 | 1077 | longest@^1.0.1: 1078 | version "1.0.1" 1079 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1080 | 1081 | micromatch@^2.1.5: 1082 | version "2.3.11" 1083 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1084 | dependencies: 1085 | arr-diff "^2.0.0" 1086 | array-unique "^0.2.1" 1087 | braces "^1.8.2" 1088 | expand-brackets "^0.1.4" 1089 | extglob "^0.3.1" 1090 | filename-regex "^2.0.0" 1091 | is-extglob "^1.0.0" 1092 | is-glob "^2.0.1" 1093 | kind-of "^3.0.2" 1094 | normalize-path "^2.0.1" 1095 | object.omit "^2.0.0" 1096 | parse-glob "^3.0.4" 1097 | regex-cache "^0.4.2" 1098 | 1099 | mime-db@~1.24.0: 1100 | version "1.24.0" 1101 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" 1102 | 1103 | mime-types@^2.1.12, mime-types@~2.1.7: 1104 | version "2.1.12" 1105 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" 1106 | dependencies: 1107 | mime-db "~1.24.0" 1108 | 1109 | minimatch@^3.0.0, minimatch@^3.0.2: 1110 | version "3.0.3" 1111 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1112 | dependencies: 1113 | brace-expansion "^1.0.0" 1114 | 1115 | minimist@0.0.8: 1116 | version "0.0.8" 1117 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1118 | 1119 | minimist@^1.2.0: 1120 | version "1.2.0" 1121 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1122 | 1123 | mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: 1124 | version "0.5.1" 1125 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1126 | dependencies: 1127 | minimist "0.0.8" 1128 | 1129 | mocha@^3.1: 1130 | version "3.1.2" 1131 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.1.2.tgz#51f93b432bf7e1b175ffc22883ccd0be32dba6b5" 1132 | dependencies: 1133 | browser-stdout "1.3.0" 1134 | commander "2.9.0" 1135 | debug "2.2.0" 1136 | diff "1.4.0" 1137 | escape-string-regexp "1.0.5" 1138 | glob "7.0.5" 1139 | growl "1.9.2" 1140 | json3 "3.3.2" 1141 | lodash.create "3.1.1" 1142 | mkdirp "0.5.1" 1143 | supports-color "3.1.2" 1144 | 1145 | ms@0.7.1: 1146 | version "0.7.1" 1147 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1148 | 1149 | ms@0.7.2: 1150 | version "0.7.2" 1151 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 1152 | 1153 | mute-stream@0.0.5: 1154 | version "0.0.5" 1155 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 1156 | 1157 | nan@^2.3.0: 1158 | version "2.4.0" 1159 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" 1160 | 1161 | natural-compare@^1.4.0: 1162 | version "1.4.0" 1163 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1164 | 1165 | node-pre-gyp@^0.6.29: 1166 | version "0.6.31" 1167 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" 1168 | dependencies: 1169 | mkdirp "~0.5.1" 1170 | nopt "~3.0.6" 1171 | npmlog "^4.0.0" 1172 | rc "~1.1.6" 1173 | request "^2.75.0" 1174 | rimraf "~2.5.4" 1175 | semver "~5.3.0" 1176 | tar "~2.2.1" 1177 | tar-pack "~3.3.0" 1178 | 1179 | node-uuid@~1.4.7: 1180 | version "1.4.7" 1181 | resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" 1182 | 1183 | nopt@~3.0.6: 1184 | version "3.0.6" 1185 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1186 | dependencies: 1187 | abbrev "1" 1188 | 1189 | normalize-path@^2.0.1: 1190 | version "2.0.1" 1191 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 1192 | 1193 | npmlog@^4.0.0: 1194 | version "4.0.0" 1195 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" 1196 | dependencies: 1197 | are-we-there-yet "~1.1.2" 1198 | console-control-strings "~1.1.0" 1199 | gauge "~2.6.0" 1200 | set-blocking "~2.0.0" 1201 | 1202 | number-is-nan@^1.0.0: 1203 | version "1.0.1" 1204 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1205 | 1206 | oauth-sign@~0.8.1: 1207 | version "0.8.2" 1208 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1209 | 1210 | object-assign@^4.0.1, object-assign@^4.1.0: 1211 | version "4.1.0" 1212 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1213 | 1214 | object.omit@^2.0.0: 1215 | version "2.0.1" 1216 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1217 | dependencies: 1218 | for-own "^0.1.4" 1219 | is-extendable "^0.1.1" 1220 | 1221 | once@^1.3.0: 1222 | version "1.4.0" 1223 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1224 | dependencies: 1225 | wrappy "1" 1226 | 1227 | once@~1.3.3: 1228 | version "1.3.3" 1229 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1230 | dependencies: 1231 | wrappy "1" 1232 | 1233 | onetime@^1.0.0: 1234 | version "1.1.0" 1235 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 1236 | 1237 | optionator@^0.8.2: 1238 | version "0.8.2" 1239 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1240 | dependencies: 1241 | deep-is "~0.1.3" 1242 | fast-levenshtein "~2.0.4" 1243 | levn "~0.3.0" 1244 | prelude-ls "~1.1.2" 1245 | type-check "~0.3.2" 1246 | wordwrap "~1.0.0" 1247 | 1248 | os-homedir@^1.0.0: 1249 | version "1.0.2" 1250 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1251 | 1252 | parse-glob@^3.0.4: 1253 | version "3.0.4" 1254 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1255 | dependencies: 1256 | glob-base "^0.3.0" 1257 | is-dotfile "^1.0.0" 1258 | is-extglob "^1.0.0" 1259 | is-glob "^2.0.0" 1260 | 1261 | path-is-absolute@^1.0.0: 1262 | version "1.0.1" 1263 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1264 | 1265 | path-is-inside@^1.0.1: 1266 | version "1.0.2" 1267 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1268 | 1269 | pify@^2.0.0: 1270 | version "2.3.0" 1271 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1272 | 1273 | pinkie-promise@^2.0.0: 1274 | version "2.0.1" 1275 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1276 | dependencies: 1277 | pinkie "^2.0.0" 1278 | 1279 | pinkie@^2.0.0: 1280 | version "2.0.4" 1281 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1282 | 1283 | pluralize@^1.2.1: 1284 | version "1.2.1" 1285 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 1286 | 1287 | prelude-ls@~1.1.2: 1288 | version "1.1.2" 1289 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1290 | 1291 | preserve@^0.2.0: 1292 | version "0.2.0" 1293 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1294 | 1295 | process-nextick-args@~1.0.6: 1296 | version "1.0.7" 1297 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1298 | 1299 | progress@^1.1.8: 1300 | version "1.1.8" 1301 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 1302 | 1303 | punycode@^1.4.1: 1304 | version "1.4.1" 1305 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1306 | 1307 | qs@~6.3.0: 1308 | version "6.3.0" 1309 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" 1310 | 1311 | randomatic@^1.1.3: 1312 | version "1.1.5" 1313 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" 1314 | dependencies: 1315 | is-number "^2.0.2" 1316 | kind-of "^3.0.2" 1317 | 1318 | rc@~1.1.6: 1319 | version "1.1.6" 1320 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 1321 | dependencies: 1322 | deep-extend "~0.4.0" 1323 | ini "~1.3.0" 1324 | minimist "^1.2.0" 1325 | strip-json-comments "~1.0.4" 1326 | 1327 | "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2: 1328 | version "2.2.1" 1329 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.1.tgz#c459a6687ad6195f936b959870776edef27a7655" 1330 | dependencies: 1331 | buffer-shims "^1.0.0" 1332 | core-util-is "~1.0.0" 1333 | inherits "~2.0.1" 1334 | isarray "~1.0.0" 1335 | process-nextick-args "~1.0.6" 1336 | string_decoder "~0.10.x" 1337 | util-deprecate "~1.0.1" 1338 | 1339 | readable-stream@~2.0.0: 1340 | version "2.0.6" 1341 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 1342 | dependencies: 1343 | core-util-is "~1.0.0" 1344 | inherits "~2.0.1" 1345 | isarray "~1.0.0" 1346 | process-nextick-args "~1.0.6" 1347 | string_decoder "~0.10.x" 1348 | util-deprecate "~1.0.1" 1349 | 1350 | readable-stream@~2.1.4: 1351 | version "2.1.5" 1352 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 1353 | dependencies: 1354 | buffer-shims "^1.0.0" 1355 | core-util-is "~1.0.0" 1356 | inherits "~2.0.1" 1357 | isarray "~1.0.0" 1358 | process-nextick-args "~1.0.6" 1359 | string_decoder "~0.10.x" 1360 | util-deprecate "~1.0.1" 1361 | 1362 | readdirp@^2.0.0: 1363 | version "2.1.0" 1364 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1365 | dependencies: 1366 | graceful-fs "^4.1.2" 1367 | minimatch "^3.0.2" 1368 | readable-stream "^2.0.2" 1369 | set-immediate-shim "^1.0.1" 1370 | 1371 | readline2@^1.0.1: 1372 | version "1.0.1" 1373 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 1374 | dependencies: 1375 | code-point-at "^1.0.0" 1376 | is-fullwidth-code-point "^1.0.0" 1377 | mute-stream "0.0.5" 1378 | 1379 | rechoir@^0.6.2: 1380 | version "0.6.2" 1381 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 1382 | dependencies: 1383 | resolve "^1.1.6" 1384 | 1385 | regex-cache@^0.4.2: 1386 | version "0.4.3" 1387 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1388 | dependencies: 1389 | is-equal-shallow "^0.1.3" 1390 | is-primitive "^2.0.0" 1391 | 1392 | repeat-element@^1.1.2: 1393 | version "1.1.2" 1394 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1395 | 1396 | repeat-string@^1.5.2: 1397 | version "1.6.1" 1398 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1399 | 1400 | request@^2.75.0: 1401 | version "2.78.0" 1402 | resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc" 1403 | dependencies: 1404 | aws-sign2 "~0.6.0" 1405 | aws4 "^1.2.1" 1406 | caseless "~0.11.0" 1407 | combined-stream "~1.0.5" 1408 | extend "~3.0.0" 1409 | forever-agent "~0.6.1" 1410 | form-data "~2.1.1" 1411 | har-validator "~2.0.6" 1412 | hawk "~3.1.3" 1413 | http-signature "~1.1.0" 1414 | is-typedarray "~1.0.0" 1415 | isstream "~0.1.2" 1416 | json-stringify-safe "~5.0.1" 1417 | mime-types "~2.1.7" 1418 | node-uuid "~1.4.7" 1419 | oauth-sign "~0.8.1" 1420 | qs "~6.3.0" 1421 | stringstream "~0.0.4" 1422 | tough-cookie "~2.3.0" 1423 | tunnel-agent "~0.4.1" 1424 | 1425 | require-uncached@^1.0.2: 1426 | version "1.0.3" 1427 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1428 | dependencies: 1429 | caller-path "^0.1.0" 1430 | resolve-from "^1.0.0" 1431 | 1432 | resolve-from@^1.0.0: 1433 | version "1.0.1" 1434 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1435 | 1436 | resolve@^1.1.6: 1437 | version "1.1.7" 1438 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 1439 | 1440 | restore-cursor@^1.0.1: 1441 | version "1.0.1" 1442 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 1443 | dependencies: 1444 | exit-hook "^1.0.0" 1445 | onetime "^1.0.0" 1446 | 1447 | right-align@^0.1.1: 1448 | version "0.1.3" 1449 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1450 | dependencies: 1451 | align-text "^0.1.1" 1452 | 1453 | rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4: 1454 | version "2.5.4" 1455 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1456 | dependencies: 1457 | glob "^7.0.5" 1458 | 1459 | rollup: 1460 | version "0.51.7" 1461 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.51.7.tgz#3c387316ceca3655727cbef716f2733aa15c46df" 1462 | 1463 | run-async@^0.1.0: 1464 | version "0.1.0" 1465 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 1466 | dependencies: 1467 | once "^1.3.0" 1468 | 1469 | rx-lite@^3.1.2: 1470 | version "3.1.2" 1471 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 1472 | 1473 | semver@~5.3.0: 1474 | version "5.3.0" 1475 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1476 | 1477 | set-blocking@~2.0.0: 1478 | version "2.0.0" 1479 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1480 | 1481 | set-immediate-shim@^1.0.1: 1482 | version "1.0.1" 1483 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1484 | 1485 | shelljs@^0.7.5: 1486 | version "0.7.5" 1487 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" 1488 | dependencies: 1489 | glob "^7.0.0" 1490 | interpret "^1.0.0" 1491 | rechoir "^0.6.2" 1492 | 1493 | signal-exit@^3.0.0: 1494 | version "3.0.1" 1495 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 1496 | 1497 | slice-ansi@0.0.4: 1498 | version "0.0.4" 1499 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1500 | 1501 | sntp@1.x.x: 1502 | version "1.0.9" 1503 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1504 | dependencies: 1505 | hoek "2.x.x" 1506 | 1507 | source-map@~0.5.1: 1508 | version "0.5.6" 1509 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1510 | 1511 | sprintf-js@~1.0.2: 1512 | version "1.0.3" 1513 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1514 | 1515 | sshpk@^1.7.0: 1516 | version "1.10.1" 1517 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" 1518 | dependencies: 1519 | asn1 "~0.2.3" 1520 | assert-plus "^1.0.0" 1521 | dashdash "^1.12.0" 1522 | getpass "^0.1.1" 1523 | optionalDependencies: 1524 | bcrypt-pbkdf "^1.0.0" 1525 | ecc-jsbn "~0.1.1" 1526 | jodid25519 "^1.0.0" 1527 | jsbn "~0.1.0" 1528 | tweetnacl "~0.14.0" 1529 | 1530 | string-width@^1.0.1: 1531 | version "1.0.2" 1532 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1533 | dependencies: 1534 | code-point-at "^1.0.0" 1535 | is-fullwidth-code-point "^1.0.0" 1536 | strip-ansi "^3.0.0" 1537 | 1538 | string-width@^2.0.0: 1539 | version "2.0.0" 1540 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1541 | dependencies: 1542 | is-fullwidth-code-point "^2.0.0" 1543 | strip-ansi "^3.0.0" 1544 | 1545 | string_decoder@~0.10.x: 1546 | version "0.10.31" 1547 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1548 | 1549 | stringstream@~0.0.4: 1550 | version "0.0.5" 1551 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1552 | 1553 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1554 | version "3.0.1" 1555 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1556 | dependencies: 1557 | ansi-regex "^2.0.0" 1558 | 1559 | strip-bom@^3.0.0: 1560 | version "3.0.0" 1561 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1562 | 1563 | strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: 1564 | version "1.0.4" 1565 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 1566 | 1567 | supports-color@3.1.2: 1568 | version "3.1.2" 1569 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1570 | dependencies: 1571 | has-flag "^1.0.0" 1572 | 1573 | supports-color@^2.0.0: 1574 | version "2.0.0" 1575 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1576 | 1577 | table@^3.7.8: 1578 | version "3.8.3" 1579 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 1580 | dependencies: 1581 | ajv "^4.7.0" 1582 | ajv-keywords "^1.0.0" 1583 | chalk "^1.1.1" 1584 | lodash "^4.0.0" 1585 | slice-ansi "0.0.4" 1586 | string-width "^2.0.0" 1587 | 1588 | tar-pack@~3.3.0: 1589 | version "3.3.0" 1590 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" 1591 | dependencies: 1592 | debug "~2.2.0" 1593 | fstream "~1.0.10" 1594 | fstream-ignore "~1.0.5" 1595 | once "~1.3.3" 1596 | readable-stream "~2.1.4" 1597 | rimraf "~2.5.1" 1598 | tar "~2.2.1" 1599 | uid-number "~0.0.6" 1600 | 1601 | tar@~2.2.1: 1602 | version "2.2.1" 1603 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1604 | dependencies: 1605 | block-stream "*" 1606 | fstream "^1.0.2" 1607 | inherits "2" 1608 | 1609 | text-table@~0.2.0: 1610 | version "0.2.0" 1611 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1612 | 1613 | through@^2.3.6: 1614 | version "2.3.8" 1615 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1616 | 1617 | tough-cookie@~2.3.0: 1618 | version "2.3.2" 1619 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1620 | dependencies: 1621 | punycode "^1.4.1" 1622 | 1623 | tryit@^1.0.1: 1624 | version "1.0.3" 1625 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 1626 | 1627 | tunnel-agent@~0.4.1: 1628 | version "0.4.3" 1629 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1630 | 1631 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1632 | version "0.14.3" 1633 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" 1634 | 1635 | type-check@~0.3.2: 1636 | version "0.3.2" 1637 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1638 | dependencies: 1639 | prelude-ls "~1.1.2" 1640 | 1641 | typedarray@~0.0.5: 1642 | version "0.0.6" 1643 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1644 | 1645 | uglify-js@^2.7.4: 1646 | version "2.7.4" 1647 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" 1648 | dependencies: 1649 | async "~0.2.6" 1650 | source-map "~0.5.1" 1651 | uglify-to-browserify "~1.0.0" 1652 | yargs "~3.10.0" 1653 | 1654 | uglify-to-browserify@~1.0.0: 1655 | version "1.0.2" 1656 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1657 | 1658 | uid-number@~0.0.6: 1659 | version "0.0.6" 1660 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1661 | 1662 | user-home@^2.0.0: 1663 | version "2.0.0" 1664 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 1665 | dependencies: 1666 | os-homedir "^1.0.0" 1667 | 1668 | util-deprecate@~1.0.1: 1669 | version "1.0.2" 1670 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1671 | 1672 | verror@1.3.6: 1673 | version "1.3.6" 1674 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1675 | dependencies: 1676 | extsprintf "1.0.2" 1677 | 1678 | wide-align@^1.1.0: 1679 | version "1.1.0" 1680 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 1681 | dependencies: 1682 | string-width "^1.0.1" 1683 | 1684 | window-size@0.1.0: 1685 | version "0.1.0" 1686 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1687 | 1688 | wordwrap@0.0.2: 1689 | version "0.0.2" 1690 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1691 | 1692 | wordwrap@~1.0.0: 1693 | version "1.0.0" 1694 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1695 | 1696 | wrappy@1: 1697 | version "1.0.2" 1698 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1699 | 1700 | write@^0.2.1: 1701 | version "0.2.1" 1702 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1703 | dependencies: 1704 | mkdirp "^0.5.1" 1705 | 1706 | xtend@^4.0.0: 1707 | version "4.0.1" 1708 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1709 | 1710 | yargs@~3.10.0: 1711 | version "3.10.0" 1712 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1713 | dependencies: 1714 | camelcase "^1.0.2" 1715 | cliui "^2.1.0" 1716 | decamelize "^1.0.0" 1717 | window-size "0.1.0" 1718 | --------------------------------------------------------------------------------