Repository: mojotech/pioneer Branch: master Commit: 2d3ade85e18e Files: 69 Total size: 393.2 KB Directory structure: gitextract_tafrd78b/ ├── .gitignore ├── .npmignore ├── .travis.yml ├── ACKNOWLEDGEMENTS.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── bin/ │ └── pioneer ├── changelog.md ├── coverage.sh ├── docs/ │ ├── command_line.md │ ├── config_file.md │ ├── form.md │ ├── getting_started.md │ ├── globals.md │ ├── list.md │ ├── step_helpers.md │ └── widget.md ├── gulpfile.js ├── mergelcov.sh ├── npm-shrinkwrap.json ├── package.json ├── pioneer.json ├── src/ │ ├── config_builder.coffee │ ├── environment.coffee │ ├── errorformat.coffee │ ├── pioneer.coffee │ ├── pioneerformat.js │ ├── pioneersummaryformat.js │ ├── scaffold/ │ │ ├── example.json │ │ ├── simple.js │ │ └── simple.txt │ ├── scaffold_builder.coffee │ ├── support/ │ │ └── index.coffee │ └── widgets/ │ ├── Widget.Form.coffee │ ├── Widget.Iframe.coffee │ ├── Widget.List.coffee │ ├── Widget.coffee │ └── build/ │ └── widgets.coffee └── test/ ├── integration/ │ ├── features/ │ │ ├── findwidget.feature │ │ ├── form.feature │ │ ├── list.feature │ │ ├── pending.feature │ │ ├── readwidget.feature │ │ ├── shorthand.feature │ │ ├── simple.feature │ │ └── widget.feature │ ├── fixtures/ │ │ ├── form.html │ │ ├── list.html │ │ ├── marionette.html │ │ └── sample.html │ ├── steps/ │ │ ├── find_steps.coffee │ │ ├── form_steps.coffee │ │ ├── helper_steps.coffee │ │ ├── list_steps.coffee │ │ ├── read_steps.coffee │ │ ├── shorthand.coffee │ │ ├── steps.coffee │ │ ├── util.coffee │ │ └── widget_steps.coffee │ └── widgets/ │ ├── div.coffee │ ├── form.coffee │ ├── list.coffee │ └── list_item.coffee ├── mocha.opts └── unit/ ├── bin.coffee ├── config.coffee ├── scaffold.coffee └── widget.coffee ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ lib-cov *.seed *.log *.csv *.dat *.out *.pid *.gz pids logs results npm-debug.log node_modules coverage .DS_Store lib/ src/pioneer.js src/environment.js ================================================ FILE: .npmignore ================================================ test/ .pioneer.json ================================================ FILE: .travis.yml ================================================ language: node_js before_script: - npm run-script build - sudo apt-get install -y lcov node_js: - "10.15" script: - npm test - npm run-script integration after_script: - npm run coverage ================================================ FILE: ACKNOWLEDGEMENTS.md ================================================ # Inspiration * Pioneer was originally inspired by [Dill](http://github.com/mojotech/dill), a Ruby take on the [PageObject](http://martinfowler.com/bliki/PageObject.html) pattern. Dill was created by [@david](http://github.com/david), with contributions from the rest of the [Mojo Tech](http://www.mojotech.com) team! ================================================ FILE: CONTRIBUTING.md ================================================ Contributing ===== * How things fit together[#thepieces] * Install [nodejs](http://nodejs.org) * Building * `$ npm install`. * `$ npm run-script build` to build the coffee-script. * `$ gulp watch` will automatically rebuild the files when source code changes * Testing * `$ npm run-script integration` to run the integration test suite * `$ npm test` to run the unit tests * Utility * `$ npm run-script pub` to release a new version. * `$ npm run-script clean` to remove the build coffee-script files. ## The Pieces Development on Pioneer is quite simple and only requires a few steps to get up and going (after you know how the pieces fit together). Pioneer can be quickly understood using this image as a reference. Pioneer stresses a decoupling of testing components, to enable a developer to quickly change and iterate on their tests. The highest level component is a `.feature` file. It is in this file that a developer defines (*from the users perspective*) how the webpage should work. ```cucumber Scenario: Searching for dogs When I view google.com And I search for "dogs" Then I should see 100 results ``` The feature file is read by [cucumber.js](https://github.com/cucumber/cucumber-js) and then looks for matching step definitions to perform the actual assertion and interaction with the webpage. ```js this.When(/^I view google.com"$/, function() { return this.driver.get("http://google.com") }); ``` It is from within the step definitions that widgets are created. Widgets are an abstraction layer between the raw [webElement](http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_WebElement.html) and your `click` or interations. This abstraction makes refactoring your application code and test code painless, since instead of having to redefine multiple selectors you only have to change one. If you are familiar with a `backbone.view` a Widget should feel quite similar. ```js var MyWidget = Widget.extend({ root: "div.wow", getName: function() { return this.read(".name"); } }) (new MyWidget()).getName().then(function(name) { expect(name).to.eql("Sam Jones"); }); ``` ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2013 MojoTech Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ **This project is no longer actively maintained. If you'd like to help out, get in touch!**

Pioneer

Chat

Integration tests made easy.

Pioneer provides an abstraction layer between your integration tests and your DOM markup, DRYing up your step definitions and consolidating how people interact with the DOM in tests. # Installing npm install pioneer --save-dev # Get Started ### [Read the guide](docs/getting_started.md) ### [Watch the video](https://www.youtube.com/watch?v=ZRYcTzgtQRI) # Docs * [Global Variables](docs/globals.md) * [Widget](docs/widget.md) * [Widget.List](docs/list.md) * [Widget.Form](docs/form.md) * [Step Helpers](docs/step_helpers.md) * [Command Line Options](docs/command_line.md) * [Configuration File](docs/config_file.md) ================================================ FILE: bin/pioneer ================================================ #!/usr/bin/env node var path = require('path'); var fs = require('fs'); var minimist = require('minimist'); var lib = path.join(path.dirname(fs.realpathSync(__filename)), path.join('../', 'lib')); var Pioneer = require(lib + path.join('/', 'pioneer')); var pkg = require('../package.json'); var checkForUpdates = process.argv.indexOf("--noUpdates") === -1 if (checkForUpdates) { var updateNotifier = require('update-notifier'); var notifier = updateNotifier({pkg: pkg}); if (notifier.update) { notifier.notify(); } } global.ARGV = Array.prototype.slice.call(process.argv); var options = minimist(process.argv.slice(2)); new Pioneer(lib, options); ================================================ FILE: changelog.md ================================================ ### v0.11.6 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.11.5...v0.11.6) * Fix release issue ### v0.11.5 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.11.4...v0.11.5) #### Updates * Update selenium-webdriver to 2.46.1 ### v0.11.4 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.11.3...v0.11.4) #### Updates * Update selenium-webdriver to 2.45.1 #### Fixes * Add shrinkwrap to lock dependencies. ### v0.11.3 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.11.2...v0.11.3) #### Fixes * Fixed a bug where it was impossible to pass multiple feature arguments via the command line. ### v0.11.2 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.11.1...v0.11.2) #### Updates * Users can now opt out of notifications. * Allow for users to override the driver build phase. This allows users to use tools like sauce labs and other hosted selenium services. * Minor Doc uodates ### v0.11.1 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.11.1...v0.11.1) #### Updates * Update selenium-webdriver version to use the latest and greatest version. ### v0.11.0 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.10.5...v0.11.0) #### Features * `Driver` is now exposed on the world. * `getItemClass` is now available to lookup a `itemClass` at instantiation time of a List. * Finding by text now respects the internal global.timeout instead of failing right away. * Test runs now have a clean output options (omitting message about the configPath) * Enable the ability to toggle the visibility of the extra test run output, such as duration. #### Fixes * Update chai version to fix peer dependency issue * Update todo mvc test link * Doc consistency fixes ### v0.10.5 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.10.4...v0.10.5) #### Fixes * Pioneer bin file is now hardened for windows environments. ### v0.10.4 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.10.3...v0.10.4) #### Features Allow pioneer to be run with command line args alone. `pioneer features --require=steps --require=widgets` now will work. ### v0.10.3 [view commit logs](https://github.com/mojotech/pioneer/compare/v0.10.2...v0.10.3) #### Features * You are now able to mark steps as `pending` using the `this.Pending()` syntax. #### Windows Support * Pioneer, now works under windows. ### v0.10.2[view commit logs](https://github.com/mojotech/pioneer/compare/v0.10.1...v0.10.2) #### Widget.list * The list widget now has a has a `length` method to enable simple assertions about the number of child items. #### Cleanups * Fix broken links and typos across repo. ### v0.10.1[view commit logs](https://github.com/mojotech/pioneer/compare/v0.10.0...v0.10.1) #### Fixes * Fix broken `findAll` list el instantiation. ### v0.10.0[view commit logs](https://github.com/mojotech/pioneer/compare/v0.9.0...v0.10.0) #### Breaking Changes * `findAll` allows you to find a list of matching elements on a page. It returns a promise that resolves with a new [Widget List](docs/list.md) with the same root as the widget that invoked `findAll`. The `itemSelector` of the new `Widget.List` will be the selector argument passed. * `submitSelector` no longer takes a node input. If you would like to use a submit selector other than `[type="submit"]` then you can override the `submitSelector` method #### Widget.Form * `readAll` now calls `getValue` on each field as opposed to `read` ### v0.9.0[view commit logs](https://github.com/mojotech/pioneer/compare/v0.8.2...v0.9.0) #### Breaking Changes * Widget `fill` method now clears the element before sending the value * Pioneer no longer looks for a `.pioneer.json` file to read configuration options from. Instead it will look for a `pioneer.json` file. #### Widget ###### Helpers * `hasClass` will test the existence of the provided class name on the DOM node of the Widget. It takes a hash that can contain an optional selector. If you only pass a string to the method and not an object then it will use the string as the class name. It returns a promise that will resolve with `true` or `false`. * `sendKeys` now supports hash style arguments, including an optional selector. * `clear` calls the webdriver [clear](http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html) method. It takes a hash that supports an optional selector to scope the `clear` operation. If only a string is passed to clear, and not an object then it will use it as a selector for the `find` operation. It returns a promise that resolves with a widget. ```js new this.Widget({ root: “.some-div” }).sendKeys({ selector: “input”, keys: [ "wow", Driver.Key.SPACE, "pioneer", Driver.Key.ENTER ] }) ``` ###### Static Methods * Static methods can be used for situations where you do not want to declare a new Widget to do something. * Static methods introduced for the following widget helpers: - click - fill - hover - doubleClick - read - isPresent - isVisible - getAttribute - getValue - getText - getInnerHTML - getOuterHTML - hasClass - sendKeys - clear #### Command Line Flags * Version: `--version` or `-v` may now be passed to display the current version of Pioneer #### Driver * `driver.visit` aliased to `driver.get` #### Format * pioneer format no longer displays the filename and line number of each scenario and step. Instead it will display the feature file at the beginning of each feature ### v0.8.2[view commit logs](https://github.com/mojotech/pioneer/compare/v0.8.1...v0.8.2) #### Fixes * Fix incorrect exit code on failure ### v0.8.1[view commit logs](https://github.com/mojotech/pioneer/compare/v0.8.0...v0.8.1) #### Fixes * Fix bug where `isPresent` would fail when the widget was constructed via an `el` based constructor. * Fix broken multi-tag formatter. #### New * Added a global `timeout` to adjust how long a step will wait before failing. * Added a new gloabl `ARGV` to give you access to the raw `process.argv` passed into the process. ### v0.8.0[view commit logs](https://github.com/mojotech/pioneer/compare/v0.7.2...v0.8.0) #### Breaking Changes * Removed global variables (`$`, `Driver`, ` _`, `argv`) * `read` no longer supports multiple arguments. Changed to hash-style arguments * `findByText` removed. To find by text use the optional “text” key on the `find` method * `fill` no longer supports multiple arguments. Changed to hash-style arguments * `getValue` no longer supports multiple arguments. Changed to hash-style arguments * `clickAt` no longer supports multiple arguments. Changed to hash-style arguments * `readAt` no longer supports multiple arguments. Changed to hash-style arguments ###### Widget * New shorthand declaration via `this.W` from `this.Widget` * Methods now support hash-style arguments for instance….. ```js return new this.Widget({ root: “div” }) .fill({ selector: “input”, value: [“Pioneer” Driver.Key.SPACE, “is”, Driver.Key.SPACE, “awesome!”] }); ``` #### Helpers * `addClass`, `removeClass`, `toggleClass` now accepts an optional selector to allow scoping within the widget * `getAttribute` - now accepts an optional selector to allow scoping within the widget * `isVisible` - will first check to see if an element is present and return false if it is not. * `hover` - the `Hover` method on a widget takes the same params as find to locate the DOM node to be hovered. It returns a promise that is resolved with the widget after the mouse has been moved over the target element. If you do not pass anything to hover it will hover over the widgets root node. * `doubleClick` - the `doubleClick` method on a widget takes the same params as [find](#find) to locate the DOM node to be doubleClicked. It returns a promise that is resolved with the widget after the mouse has been doubleClicked on the target element. If you do not pass anything to doubleClick it will double click the root node of the widget. #### Widget.Fields Fields Is now removed as being a base class. Its methods have been moved within `Widget.Form` #### Widget.List * `select` can be used to select an option from a dropdown menu. It takes a hash with an optional `` in which you can specifiy either `` or `` to select by. Specifiying both text and a value will result in an error. It returns a promise that will resolve with null. ```html
``` ```js return new this.Widget.Form({ root: "form2" }) .select({ selector: "select", value: "three" }) //Resulting in the selection of the option with a value of "three". ``` * `invoke` - arguments to pass to the invoking method can now be passed using an object #### Scaffolding Pioneer can generate a scaffold for you to build your suite on via the newly added`--scaffold` command line flag. Scaffold generates a tests/ directory, with features/, steps/ and widgets/. It creates simple.feature and simple.js files that include your first Pioneer test! It also creates a .pioneer.json file in your current working directory. The option to generate a scaffold is also presented if Pioneer is called without specifying a feature file. #### Configuration * Pioneer no longer has a default configuration. A similar goal can be accomplished via a `.pioneer.json` within the directory that you run your tests from. ### v0.7.2[view commit logs](https://github.com/mojotech/pioneer/compare/v0.7.1...v0.7.2) #### Fixes * Move bluebird dep out of dev dependencies. ### v0.7.1[view commit logs](https://github.com/mojotech/pioneer/compare/v0.7.0...v0.7.1) #### Fixes * Fix issue with output formatter path lookup. ### v0.7.0[view commit logs](https://github.com/mojotech/pioneer/compare/v0.6.3...v0.7.0) #### Widget ##### Accessors * getValue - The `getValue` method lets you get the current value of a given input node. It returns a promise that resolves with the value of the node. * read - No longer to be used with input fields (was extracted to `getValue`) * getInnerHTML - Returns a promise that resolves with the innerHTML of the selector element. * getOuterHTML - Returns a promise that resolves with the outerHTML of the selector element. ##### Helpers * addClass * removeClass * toggleClass #### Widget.List ##### Helpers * clickAt - `clickAt` is a combination of the at method that allows clicking on a certain index of list. The optional `` parameter allows for scoping within index. It returns a promise that is resolved when the index has been clicked. * readAt - `readAt` is a combination of the at method and the read method and allows for scoping within an el at the given index. The optional `` parameter allows for scoping within index. There is also an optional transformer argument that mirrors the default read implementation. Read at returns a promise that resolves with the value of read * each - Returns a promise that resolves with the list items after each item in the list has been iterated over. The iterator method receives two arguments, the widget instance and the index of the item being iterated over. * invoke - Returns a promise that resolves when the specified method has been invoked on all children. #### Docs * Added missing documentation for forms and fields #### Configuration Configuring pioneer options can now be done using a JSON file. If no configuration path is passed in using `--configPath=`, then pioneer uses the [default configuration settings](https://github.com/mojotech/pioneer/blob/master/docs/config_file.md#default-configuration). Pioneer will also look for a .pioneer.json file in the directory that you invoke the command from. The `--prevent-browser-reload` flag is no longer valid, it has been changed to `--preventReload=true`. From configuration it can be specified as { “preventReload”: true } #### Cleanup * Remove Pioneer.Iframe from core - https://github.com/mojotech/pioneer.iframe * Remove Pioneer.View from core - https://github.com/mojotech/pioneer.marionette * Integration features/steps separated out to several files #### Formatting Pioneer now has its own format type that is uses by default. This formatter changed the way in which the test summary is displayed. Failing steps will now be accompanied by the feature file and line number that they correspond with. ### v0.6.3[view commit logs](https://github.com/mojotech/pioneer/compare/v0.6.2...v0.6.3) * Fixes * Fix broken bin path ### v0.6.2[view commit logs](https://github.com/mojotech/dill.js/compare/v0.6.1...v0.6.2) * Features * Add proxy `getInnerHTML` on the widget class. * Add proxy `getOuterHTML` on the widget class. * Fixes * Fix broken `at` selector for lists. ### v0.6.1[view commit logs](https://github.com/mojotech/dill.js/compare/v0.6.0...v0.6.1) * Fixes * fix xpath `findByText` relative selector bug. ### v0.6.0[view commit logs](https://github.com/mojotech/dill.js/compare/v0.5.0...v0.6.0) * Features * Forms now default to `form` for their root selector. * `getText` is now available on Widgets. * `sendKeys` is now available on Widgets. * The `fill` method now takes one or two arguments. When only passed a single argument will default to filling the widgets root node with the passed argument. * Refactors * Invoke cucumber programatically vs via an exec. * General Doc improvements ### v0.5.0[view commit logs](https://github.com/mojotech/dill.js/compare/v0.4.1...v0.5.0) * Features * `isVisible` is now available on a widget. * `findByText` is now available on a widget to enable you to lookup children of a widget based on arbitrary text content. * `getAttribute` is now available on a widget, for reading a single attribute of a node. * `findWhere` is now available on a `Dill.List` widget for finding a single `webElement` based on a filter method. * `Iframe` Widget was added for interacting with iframes and switching focus in and out of them. * You can now disable the reloading of the browser instance between tests via the `--prevent-browser-reload` CLI flag. * Error stacktraces are now limited to 5 lines. * A `freeze` utility method and step definition were added for aiding debugging. The freeze method prevents the steps from continuing until the user presses a key in the terminal. * Fixes * Widget.list children lookup no longer uses the broken `nth` child based selector. ### v0.4.1[view commit logs](https://github.com/mojotech/dill.js/compare/v0.4.0...v0.4.1) * Features * `isPresent` takes an optional CSS selector to further scope the lookup. * `Read` takes an additional transformer method to mutate the read result. * Selenium WebDriver * Bump version to fix two bugs introduced in ChromeDriver * FIXED: 7300: Connect to ChromeDriver using the loopback address since * FIXED: 7465: Fixed `net.getLoopbackAddress` on Windows ### v0.4.0 [view commit logs](https://github.com/mojotech/dill.js/compare/v0.3.0...v0.4.0) * Widget * Add `getHtml` method. * Add a `find` based constructor to widgets that return a promise and resolves as a new widget with a pre found `webElement` instance under the `el` property. Thus preventing you from having to do a `find` to interact with the widgets DOM. * Widget.List * Add `map` method to list to interact with each item. * Add `filter` method to reduce items by a filter method. * Add `at` method to get an item at a given index. * Widget.View * Add a new widget type that integrates in with `Marionette` Views. * Tests * Add integration test coverage for dill.js. * General * Split widget files into seperate files. ### v0.3.0 [view commit logs](https://github.com/mojotech/dill.js/compare/v0.2.0...v0.3.0) * Fixes * Remove the automatic inclusion of the features directory. This was forcing projects to always have a feature directory relative to where the tests were run from. ### v0.2.0 [view commit logs](https://github.com/mojotech/dill.js/compare/v0.1.1...v0.2.0) * Fixes * Extend syntax now correctly sets instance properties. This is a breaking change if you were unknowingly depending on the broken functionality. * Features * Tests now display total runtime after running. ### v0.1.1 [view commit logs](https://github.com/mojotech/dill.js/compare/v0.1.0...v0.1.1) * Features * You can now specify which driver dill.js uses when running tests via the --driver command line flag. ================================================ FILE: coverage.sh ================================================ #!/bin/bash ./mergelcov.sh ./coverage | ./node_modules/.bin/coveralls ================================================ FILE: docs/command_line.md ================================================ Command Line Options ==================== ## Table of Contents * [Driver Configuration](#driver-configuration) * [Error Formatting](#error-formatting) * [Tags](#tags) * [Prevent Browser Reload](#prevent-browser-reload) * [CoffeeScript Step Scaffold](#coffeescript-step-scaffold) * [Configuration File Path](#configuration-file-path) * [Scaffold Creation](#scaffold-creation) * [Version](#version) ## Driver Configuration You can customize which driver your tests use via the `--driver` command line flag. The default driver is chrome. For example: * --driver=phantomjs * --driver=firefox ## Error Formatting You can customize the format in which your errors are formatted via the `--error_formatter` command line flag. The default format is five lines of the stack trace with a blue first line. To customize the formatter see below my_formatter.js should export a method like the following ```js module.exports = function(err) { console.log("my custom error formatter", err.stack); } ``` ## Tags To only run selected features include `--tags=@myTag` and insert @myTag directly before the intended feature(s). ## Prevent Browser Reload To speed up testing, an optional `--preventReload` flag can be passed to prevent the web driver from restarting after each feature: ```bash ./node_modules/.bin/pioneer --preventReload=true ``` ## CoffeeScript Step Scaffold To have cucumber generate the step scaffold automatically in CoffeeScript, use the optional `--coffee` line flag. ```bash ./node_modules/.bin/pioneer --coffee ``` ## Configuration File Path Pioneer configuration options can be declared in the form of a JSON file. To declare the path to this file use the optional `--configPath=` flag. Addtional information on the format of this file can be found [here](config_file.md) ```bash ./node_modules/.bin/pioneer --configPath=myConfig.json ``` ## Scaffold Creation Pioneer can generate a scaffold for your first tests automatically using the optional `--scaffold` command line flag. This generates a tests/ directory, with features/, steps/ and widgets/. It creates simple.feature and simple.js files that include your first Pioneer test! It also creates a `pioneer.json` file in your current working directory. This config file automatically includes the created feature files, and the following information: ```json { "feature": "tests/features", "require": [ "tests/steps", "tests/widgets" ], "format": "pioneerformat.js", "driver": "chrome", "error_formatter": "errorformat.js", "preventReload": false, "coffee": false } ``` ## Verbosity You can show some extra information about the test run by setting the `--verbose` flag. This can be used to override the value in the config file. You will need to use `--verbose=false` to turn off verbosity that has been set in the config file. ## Version You can display the current version of Pioneer that you are using by passing the optional `--version` or `-v` command line flag. ================================================ FILE: docs/config_file.md ================================================ Configuration File ================== ## Table of Contents * [Default Configuration](#default-configuration) * [Driver Configuration](#driver-configuration) * [Error Formatting](#error-formatting) * [Tags](#tags) * [Prevent Browser Reload](#prevent-browser-reload) * [CoffeeScript Step Scaffold](#coffeescript-step-scaffold) * [Update Notifications](#update-notifications) ## Default Configuration If no configuration path is passed in using [--configPath=](command_line.md#configuration-file-path), then pioneer will check to see if the file `pioneer.json` exists in the current working directory. ## Driver Configuration ```json { "driver": "firefox" } ``` http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_Capabilities.html ## Error Formatting ```json { "error_formatter": "myDirectory/my_error_formatter.js" } ``` ## Tags To specify multiple tags, use an array. ```json { "tags": "@myTag" } ``` ```json { "tags": ["@myTag", "@thatTag", "@goodTag"] } ``` ## Prevent Browser Reload If `preventReload` is not declared, then it will default to false. ```json { "preventReload": true } ``` ## CoffeeScript Step Scaffold If `coffee` is not declared, then it will default to false. ```json { "coffee": true } ``` ## Verbosity If `verbose` is set to true, it will show some extra information about the test run. If it is not declared, then it will default to false. Note: this value can be overridden by the `--verbose` flag on the command line. ## Update Notifications By default Pioneer will check to see if there are updates available. If they are, it will print a message to stdout. To disable this behavior you can pass the `--noUpdates` option when invoking the Pioneer binary. ================================================ FILE: docs/form.md ================================================ Widget.Form ================= ## Table of contents * [Api](#api) * [submitSelector](#submitselector) * [submitForm](#submitform) * [submitWith](#submitwith) * [select](#select) * [fillAll](#fillall) * [readAll](#readall) ## submitSelector `submitSelector` finds and returns an element of type `submit`. It can be overridden to find select another element for the target of [submitForm](#submitform) ```js var F = this.Widget.Form.extend({ root: "#my-form", submitSelector: function(){ return this.find("button.mySubmit") } }) ``` ## submitForm `submitForm` will find the submit selector and then call [click](widget.md#click) ## submitWith `submitWith` will call [fillAll](#fillall) on each of keys value pairs passed into method, and then call the `click` method on the return of the `submitSelector` method. ```js var F = this.Widget.Form.extend({ root: "#waiver", }) var waiver = new F; waiver.submitWith({name: "Joe Doe", address: "55 Main St", reason: "N/A"}); ``` ## select `function select({text: , value: })` `select` takes a hash in which you can specifiy either `` or `` to select by. Specifiying both text and a value will result in an error. Alternately, you can also just pass a single string value and it will be the same as passing in the `` hash option. `select` returns a promise that will resolve with null. ```html
``` ```js return new this.Widget.Form({ root: "form2" }) .select({ selector: "select", value: "three" }) //Resulting in the selection of the option with a value of "three". // Two-forms of selecting by text return new this.Widget.Form({ root: "form2" }) .select("Option Number 3") // The above is the shortform of the following return new this.Widget.Form({ root: "form2" }) .select({text: "Option Number 3"}) ``` ## fillAll `fillAll` will call the [fill](widget.md#fill) method on each of the the keys value pairs passed into the method. ```js Widget.find({ root: 'form' }).then(function(widget) { widget.fillAll({ field1: "myEmail@example.com" }) }); ``` ## readAll `readAll` will map all fields and then [getValue](widget.md#getvalue) its value. It returns an object with each field name as a key and the value of that field. ```html
Field 1:
Field 2:
Field 3:
``` ```js Widget.find({ root: 'form' }).then(function(widget) { widget.readAll() }) // Result: {field1: "firstValue", field2: "secondValue", field3: "thirdValue"} ``` ================================================ FILE: docs/getting_started.md ================================================ # Getting Started - Require Pioneer as a dependency (and install) ```bash $ npm install pioneer --save ``` - Setup your testing directory ```bash $ ./node_modules/.bin/pioneer --scaffold ``` - Run your first Pioneer test! ```bash $ ./node_modules/.bin/pioneer ``` - Expanding on your tests Now that you've run your first test, you are ready to add another one. To add another feature to your test, add the following to the end of the `test/features/simple.feature` ```gherkin Scenario: Completing a Todo When I enter "Learn Pioneer" And complete the first todo Then I should see that the first todo is completed ``` This will create another test that enters a new todo, clicks complete and then tests to ensure that the first todo is completed. If you ran ```bash $ ./node_modules/.bin/pioneer ``` right now, you would notice that you did not define step definitions for the second and third step of the "Completing a Todo" scenario. Pioneer will catch these undefined steps, and automatically generate a suggestion for that step. In this case, pioneer would generate something that looks like this: You can implement step definitions for undefined steps with these snippets: ```js this.When(/^complete the first todo$/, function() { // express the regexp above with the code you wish you had }); this.Then(/^I should see that the first todo is completed$/, function() { // express the regexp above with the code you wish you had }); ``` Instead of adding that suggestion, you should append `tests/steps/simple.js` with the following ```js this.When(/^complete the first todo$/, function(){ return new this.Widget.List({ root: "#todo-list" }) .clickAt({ index: 0, selector: "input" }) }); this.Then(/^I should see that the first todo is completed$/, function() { return new this.Widget.List({ root: "#todo-list" }) .at(0).then(function(el){ return el.hasClass("completed").should.eventually.be.true; }); }); ``` To explain what these steps are doing: - First we create a new widget around the element `#todo-list` and click on the input in the first `
  • `. This is how one completes a todo. - To ensure that the todo was completed, we then check the class on the first `
  • ` element of `#todo-list` to make sure that the class "completed" was added. - Making your tests more efficient And there you have it, you wrote your first test using Pioneer! Easy right? But believe it or not, creating your step definitions is even easier if you take advantage of abstracting your own custom Widgets. Now create the file `tests/widgets/my_widget.js` and append the following: ```js module.exports = function(){ this.Widgets = this.Widgets || {}; this.Widgets.TodoList = this.Widget.List.extend({ root: "#todo-list", complete: function (index) { return this.clickAt({ selector: "input", index: index }) }, isCompleted: function(index) { return this.at(index).then(function(el){ return el.hasClass("completed"); }); } }) } ``` You have now extracted the complicated logic of checking list items out into a seperate file which can easily be reused. Now your step definitions can look list this ```js this.When(/^complete the first todo$/, function(){ return new this.Widgets.TodoList().complete(0) }); this.Then(/^I should see that the first todo is completed$/, function() { return new this.Widgets.TodoList() .isCompleted(0).should.eventually.eql(true) }); ``` ================================================ FILE: docs/globals.md ================================================ Globals ======= ## Table of Contents * [ARGV](#argv) * [timeout](#timeout) * [Configuring the Driver](#driver-configuration) ## ARGV `global.ARGV` is available for those wanting to be able to provide custom command line arguments. `ARGV` contains all command line arguments. ## timeout `global.timeout` is available for those wanting to adjust the amount of time the driver waits to ensure an element. ## Driver Configuration If you would like to customize how your selenium driver is built, Pioneer provides a userful method `ConfigureDriver` that you can override to have full control. ```js module.exports = function() { this.ConfigureDriver = function(SeleniumDriver, argv) { return new SeleniumDriver.Builder().withCapabilities(SeleniumDriver.Capabilities['chrome']()).build() } } ``` This method can be useful for setting up things like sauce labs. For a detailed walk through on setting up selenium for sauce labs refer to this [article](http://samsaccone.com/posts/testing-with-travis-and-sauce-labs.html). ================================================ FILE: docs/list.md ================================================ Widget.List =========== `Widget.List` is a utility to make operating on a collection of similar items intuitive. `Widget.List` allows you to specify collection specific methods, as well as the base `Widget` class to use for each `Widget` in the list. Take for instance the following markup: ```html
    • one
    • sunny
    • day
    ``` This list of words can abstracted and interacted with via a `List` with ease. Here is a simple example of asserting the length of the list. ```js ListItems = Widget.List.extend({ root: "ul", itemSelector: "li" }) list = new ListItems; list.items().should.eventually.have.length(3); ``` ## Table of contents * [Api](#api) * [itemSelector](#itemselector) * [itemClass](#itemclass) * [getItemClass](#getItemClass) * [items](#items) * [length](#length) * [filter](#filter) * [map](#map) * [each](#each) * [invoke](#invoke) * [at](#at) * [clickAt](#clickat) * [readAt](#readat) # API ## itemSelector The `CSS` selector that is used when finding a single `Widget` contained within the list. It defaults to `li` but can be overridden to any valid `CSS` selector. ## itemClass The `Widget` to be instantiated and used when interacting with each item in the list. `itemClass` defaults to a generic `World.Widget` class. ## getItemClass The value returned by this method is the ItemClass that will be instantiated and used when interacting with each item in the list. This method gives you the ability to return a Customized ItemClass for each el. By default `itemClass` is returned. ```js var MyListWidget = Widget.List.extend({ getItemClass: function () { return this.Driver.promise.fulfilled(this.itemClass); } }); ``` ## items `function items()...` Returns a `Promise` that resolves to a list of `Widgets` present in the `DOM` at call time. ## length `function length()...` Returns a `Promise` that resolves to the length of the list. ```js new ListItems().length().should.eventually.eql(5) ``` ## filter `function filter((itemInstance))...` Returns a `Promise` that resolves to a reduced list of `items` according to the filter method. The `predicateMethod` can either return a flat value or a `Promise` that resolves to a truthy or falsy value. Here is an example of filtering the list of items down to those ending in "y". ```js new ListItems().filter(function(item) { return item.find().then(function(elm) { return elm.getText().then(function(text) { return text.match(/y$/) }); } }) }); ``` ## map ```js function map(function iterator(widgetInstance, index) { //... }) ``` Returns a `Promise` that resolves to a list of items transformed according to the iterator method. The `iterator` can return a flat value or a `Promise`. Here is an example of mapping a list of items down to their text content. ```js new ListItems().map(function(item, index) { // First we must find the `item` // and then call `getText` on the raw // `webElement` to get their contents. return item.find() .then(function(elm) { return elm.getText(); }) }) .then(function(text) { return text.should.eql(["one", "sunny", "day"]); }) ``` ## each ```js function each(function iterator(widgetInstance, index) { //... } ``` Returns a promise that resolves with the list items after each item in the list has been iterated over. The iterator method receives two arguments, the widget instance and the index of the item being iterated over. ```js new ListItems().each(function(item, index) { return item.click('.close'); }); ``` ## invoke `function invoke({method: (methodName or method), arguments:<[arguments]>})...` Returns a promise that resolves when the specified method has been invoked on all children. If you only pass a string (or method) to `invoke`, and not an object, then it will use the string (or method) as the method to apply on each child. ```js new ListItems().invoke('click').then(function() { //.... }); ``` ```js new ListItems().invoke(this.Widget.prototype.click).then(function() { //.... }); ``` ```js new ListItems().invoke({ method: "click", arguments: [{ selector: "p" }] }).then(function(){ //... }) ``` ## at `function at(0-based-index)...` Returns a promise that resolves with a child `Widget` instance at a given index. ```js new ListItems().at(2).then(function(item) {}); ``` ## findWhere `function findWhere((itemInstance))...` Returns a `Promise` that resolves to a raw `WebElement` which represents the first element in the collection's items array which passes the filter method. The `predicateMethod` can either return a flat value or a `Promise` that resolves to a truthy or falsy value. Here is an example of finding the first item in a list of items that ends in "y". ```js new ListItems().findWhere(function(item) { return item.find().then(function(elm) { return elm.getText().then(function(text) { return text.match(/y$/); }); }) }); ``` ## clickAt `function clickAt({index: index, selector:})` `clickAt` is a combination of the [at](#at) method and the [click](widget.md#click) method that allows clicking on a certain index of list. `clickAt` takes a hash, with an optional `` parameter which allows for scoping within index. If only a number is passed and not an options hash it will default to using that as the at index lookup It returns a promise that is resolved when the child at the index has been clicked. ```html
    • zero
    • one
    • two
    • three
    ``` ```js new this.Widget.List() .clickAt(3) //results in
  • three
  • being clicked ``` ## readAt `function readAt({index: index, selector: , transformer: )` `readAt` is a combination of the [at](#at) method and the [read](widget.md#read) method and allows for scoping within an el at the given index. The optional `` parameter allows for scoping within index. There is also an optional transformer argument that mirrors the default [read transformer](widget.md#read) implementation. Read at returns a promise that resolves with the value of read. If only a number is passed and not an options hash it will default to using that as the at index lookup ```js new this.Widget.List().readAt(1, 'p', function(val){ return $.trim(val); }) ``` ================================================ FILE: docs/step_helpers.md ================================================ Step Helpers =========== ## Table of contents * [Freeze](#freeze) * [Pending](#pending) ###Freeze Causes process to wait for any key press from the user before proceeding. `@Freeze()` returns a promise that is resolved once the user presses a key. Can be used from within a step definition with ```coffeescript @Freeze().then -> .......... ``` Or it can be used via a feature file with ```gherkin When I Freeze ``` ###Pending Allows you to mark a step as `pending` and not currently implemented. Simply call `@Pending()` from within a step. ```js this.When(/^I execute a pending step$/, function() { this.Pending(); }); ``` ================================================ FILE: docs/widget.md ================================================ Widget =========== `Widget` is the base class upon which your custom widgets should extend from. The `Widget` class provides you with several helpful utility methods that interact with your DOM in an asynchronous promised based manner. A simple example of an extension would look like this. ```js MarketFilters = Widget.extend({ root: '.market-place-filters', setSearchText: function(val) { return this.fill(".market-text-search", val); } }); ``` All `Widgets` extend from seleniums [WebElement](http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_WebElement.html) ## Table of contents * [Api](#api) * [Constructing](#constructing) * [Finding](#finding) * [Extending](#extending) * [Overriding](#overriding) * [Shorthand](#shorthand) * [Root](#root) * [Static Methods](#static-methods) * [click](#static-click) * [fill](#static-fill) * [hover](#static-hover) * [doubleClick](#static-doubleclick) * [read](#static-read) * [isPresent](#static-ispresent) * [isVisible](#static-isvisible) * [getAttribute](#static-getattribute) * [getValue](#static-getvalue) * [getText](#static-gettext) * [getInnerHTML](#static-getinnerhtml) * [getOuterHTML](#static-getouterhtml) * [hasClass](#static-hasclass) * [sendKeys](#static-sendkeys) * [clear](#clear) * [Interacting with the DOM](#interacting-with-the-dom) * [click](#click) * [fill](#fill) * [hover](#hover) * [doubleClick](#doubleclick) * [sendKeys](#sendkeys) * [addClass](#addclass) * [removeClass](#removeclass) * [toggleClass](#toggleclass) * [clear](#clear) * [Querying the DOM](#querying-the-dom) * [read](#read) * [find](#find) * [findAll](#findall) * [isPresent](#ispresent) * [isVisible](#isvisible) * [getAttribute](#getattribute) * [getValue](#getvalue) * [getText](#gettext) * [getInnerHTML](#getinnerhtml) * [getOuterHTML](#getouterhtml) * [hasClass](#hasclass) # API ## Constructing There are several ways to create a new `Widget` depending on your needs. ### Finding In most cases the find based factory is going to suit your needs. `find` returns a promise-based interface that eventually resolves to a widget with the `el` property already set to a [WebElement](http://selenium.googlecode.com/git/docs/api/javascript/class_webdriver_WebElement.html) instance. It takes a hash of attributes that will be extended onto your object. ```js Widget.find({ root: "#big-papa" }).then(function(widget) { // widget.el // is the raw WebElement node already found // for your convinence. }); ``` ### Extending Extending is simple way to create a new `Class` based on the base `Widget` class via the `.extend` syntax. Extend will override any method or value set on the base `Widget` object. Using the extend functionality is a handy way to abstract widget configuration across multiple files and methods into reusable widgets ```js MyWidget = Widget.extend({ root: ".biggie-biggie" }); // Creating a new instance via new myWidget = new MyWidget({optional: args}); // Creating a new instance via the find factory MyWidget.find({optional: args}).then(function(widget) { myWidget = widget; }); ``` ### Overriding In any `Widgets` contructor you can override the default attributes set on said widget. This is a handy paradigm to embrace when you have small one-off widgets that do not need custom logic but rather just a few small helper methods and/or properties. ```js // Creating a new instance with overrides myWidget = new this.Widget({optional: args}); // Creating a new instance via the find factory with overrides Widget.find({optional: args}).then(function(widget) { myWidget = widget; }); ``` ### Shorthand A `Widget` can be expressed using the shorthand `W` ```js myWidget = new W({optional: args}) ``` ## Root `root` must be provided in your widget class definition. It scopes all of a widgets DOM lookups to this root element. The widget's required `root` property allows you to provide a scope on the page with which you are interacting. All operations for your widget will happen within the scope of the element. It is a common pattern to have multiple widgets represent different parts of the page you are testing (e.g. the login div, the nav div, the form). This allows your widgets to be very focused and succinct. ```js var PuppySearch = Widget.extend({ root: '.dog-search', }); ``` ## Static Methods Static methods can be used for situations where you do not want to declare a new Widget to do something. Static methods ALWAYS require selectors, otherwise Pioneer won't know what you want to operate on! These methods allow you to do simple operations with less code. For example: ```js new this.Widget({ root: "#that-button" }).click() ``` can be simplified to: ```js this.Widget.click({selector: "#that-button"}) ``` ### static click Static implementation of [click](#click) ### static fill Static implementation of [fill](#fill) ```js this.W.fill({ selector: ".field1", value: ["such good text", Driver.Key.ENTER] }) ``` ### static hover Static implementation of [hover](#hover) ```js this.W.hover({ selector: "#your-target" }) ``` ### static doubleClick Static implementation of [doubleClick](#doubleclick) ```js this.W.doubleClick({ selector: "#some-target" }) ``` ### static read Static implementation of [read](#read) ```js this.W.read({ selector: "p.third", transformer: function(text){ text.toUpperCase() } }) ``` ### static isPresent Static implementation of [isPresent](#ispresent) not the element is present. ```js this.W.isPresent({ selector: "body" }) ``` ### static isVisible Static implementation of [isVisible](#isvisible) not the element is visible. ```js this.W.isVisible({ selector: ".hidden" }) ``` ### static getAttribute Static implementation of [getAttribute](#getattribute) ```js this.W.getAttribute({ selector: "img.thumb", attribute: "width" }) ``` ### static getValue Static implementation of [getValue](#getvalue) ```js this.W.getValue({ selector: ".field2" }) ``` ### static getText Static implementation of [getText](#gettext) ```js this.W.getText({ selector: "p.fifth" }) ``` ### static getInnerHTML Static implementation of [getInnerHTML](#getinnerhtml) ```js this.W.getInnerHTML({ selector: ".some-div" }) ``` ### static getOuterHTML Static implementation of [getOuterHTML](#getouterhtml) ```js this.W.getOuterHTML({ selector: "#container" }) ``` ### static hasClass Static implementation of [hasClass](#hasclass) ```js this.W.hasClass({ selector: "li.active", className: "inactive" }) ``` ### static sendKeys Static implementation of [sendKeys](#sendkeys) ```js this.W.sendKeys({ selector: ".username", keys: "pioneer_expert" }) ``` ### static clear Static implementation of [clear](#clear) ```js this.W.clear({ selector: ".password" }).then(function(widget){ ... }) ``` ## Interacting with the DOM ### click `function click({selector:})...` `click` simulates a user clicking on the DOM selector that is passed in as a parameter to the function. It returns a promise to let you know when the click has been successful or rejected. If only a string is passed, and not an object, it will parse it as a selector. ```js var PuppySearch = Widget.extend({ root: '.dog-search', clickOnTheDog: function() { return this.click(".dog"); } }); ``` ### fill `function fill({selector:, value: valueToFillWith})...` `fill` allows you you to simulate a user filling in an input with a given value. It returns a promise to let you know when the fill has been successful or rejected. `fill` takes a hash of options including an optional selector, and a required value to send to the widget. If only an array is passed, it will fill the root with that array. ```js var name = ['Jack ', 'the ', 'Ripper', Driver.Enter] var PuppyNamer = Widget.extend({ root: '.dog-namer', nameDog: function(name) { return this.fill({ selector: ".dog-name", value: name }); } }); ``` If only one argument is passed it will fill the root node with the value passed. ```js var PuppyNamer = Widget.extend({ root: '.puppy-namer', namePuppy: function(name) { return this.fill(name); } }); ``` ### hover `function hover({find options})...` the `hover` method on a widget takes the same params as [find](#find) to locate the DOM node to be hovered. It returns a promise that is resolved with the widget after the mouse has been moved over the target element. If you do not pass anything to hover it will hover over the widgets root node. ```js new this.Widget({ root: "h4" }) .hover().then(function(widget) { //... }) ``` ### doubleclick `function doubleClick({find options})...` the `doubleClick` method on a widget takes the same params as [find](#find) to locate the DOM node to be doubleClicked. It returns a promise that is resolved with the widget after the mouse has been doubleClicked on the target element. If you do not pass anything to doubleClick it will double click the root node of the widget. ```js new this.Widget({ root: ".double" }) .doubleClick().then(function(widget) { //... }) ``` ### sendKeys `function sendKeys(,...)` `sendKeys` simulates a user typing. Derived from the [Webdriver sendKey method](http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/actionsequence.js.src.html). It accepts a hash with an optional selector to scope the `find` operation. It requires a `keys` value in the hash which should be an array of the keys to be sent to the element. These keys may include special keys such as Driver.Key.ENTER. A list of those special keys can be found at [Selenium WebDriver docs](http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/key.js.src.html). ```js var Driver = require('selenium-webdriver'); new this.Widget({ root: ".some-div" }).sendKeys({ selector: "input", keys: [ "wow", Driver.Key.SPACE, "pioneer", Driver.Key.ENTER ] }).then(function(){ ... }) ``` ### addClass `function addClass({className: name, selector: })` `addClass` will add the provided class name to the DOM node of the Widget. It takes a hash that can contain an optional selector. If you only pass a string to the method and not an object then it will use the string as the class name. It returns a promise that will resolve when the class has been added. ```js var hidden = new Widget.extend({ root: '.showing' }) .addClass('hidden') ``` ### removeClass `function removeClass({className: name, selector: })` `removeClass` will remove the provided class name from the DOM node of the Widget. It takes a hash that can contain an optional selector. If you only pass a string to the method and not an object then it will use the string as the class name. It returns a promise that will resolve when the class has been removed. ### toggleClass `function toggleClass({className: name, selector: })` `toggleClass` will toggle the provided class name on the DOM node of the Widget. It takes a hash that can contain an optional selector. If you only pass a string to the method and not an object then it will use the string as the class name. It returns a promise that will resolve when the class has been toggled. ### clear `function clear({selector: })` `clear` will call [clear](http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html#l1967) on the element. Takes a hash that supports an optional selector to scope the `clear` operation. If only a string is passed to clear, and not an object then it will use it as a selector for the `find` operation. Returns a promise that resolves with the widget once the element has been cleared. ```js new this.Widget({ root: "#container" }).clear({ selector: "input" }).then(function(widget){ ... }); ``` ## Querying the DOM ## read `function read({selector: , transformer: })` `read` allows you to get the text of a given DOM node. `read` takes a hash of options: `` can scope the read, and `` performs a transformation on the value/text. If you only pass a string to the method and not an object then it will use the string as the selector scope for the read operation. It returns a promise that resolves with the result of the read or rejection. ```js var PuppyDetails = Widget.extend({ root: '.puppy-details', getName: function(name) { return this.read(".dog-name"); } }); var HorseDetails = Widget.extend({ root: '.horse-details', getName: function(name) { return this.read({ selector: ".pony-name", transformer: function(text){ return text.toLowerCase() } }); } }); ``` ## find `function find({selector: , text: })...` `find` allows you to find a (single) matching element on the page and grab the resulting DOM node. If a node is not found it will reject the returned promise value, otherwise the promise is resolved with the DOM node. `find` takes in an optional hash, in which a selector key can be specified, or text can be specified to find the first matching child of the widget. `find` does not function properly when both options are passed. If only a string is passed to the method then it will use that string for selector for the find operation. ```js var PuppyDetails = Widget.extend({ root: '.puppy-details', getInfo: function(name) { return this.find(".dog-info"); } }); var ReptileDetails = Widget.extend({ root: '.reptile-details', getInfo: function(name) { return this.find({text: "lizards"}); } }); ``` ## findAll `function findAll(cssSelector)...` `findAll` allows you to find a list of matching elements on a page. It returns a promise that resolves with a new [Widget List]() with the same root as the widget that invoked `findAll`. The item selector of this new Widget List will be the cssSelector argument. ```js var PuppyDetails = Widget.extend({ root: '.puppy-details', getInfoItems: function(name) { return this.findAll("li.dog-info"); } }); PuppyDetails.getInfoItems().then(function(list){ list.invoke(...) }) ``` ## isPresent `function isPresent()...` `isPresent` is a utility method to check to see if a given widgets `root` or `root` scoped selector is present on the page. If the element is found then the promise is successfully resolved with true, otherwise it is resolved with false. ## isVisible `function isVisible({selector: })...` `isVisible` is a utility method to check to see if a given selector is currently visible on the page. If the element is visible then the promise is resolved with true, otherwise it is resolved with false. If only a string is passed to the method then it will use that string as a selector. ## getAttribute `function getAttribute({selector: , attribute: attributeName})...` The `getAttribute` method allows you to search an element for a particular attribute. It takes a hash with an optional selector key. If you only pass a string to the method and not an object then it will use the string as the attribute name. It returns a promise that will resolve with the attribute value if found, otherwise it will resolve with null. For further reference visit http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html#l1851 ```html

    I am nested

    ``` ```js var width = Widget.extend({ root: 'p', getImgWidth: function(){ return this.getAttribute({selector: ".nested", attribute:"width"}) } }); ``` ## getValue `function getValue({selector: , transformer: })...` The `getValue` method lets you get the current value of a given input node. It returns a promise that resolves with the value of the node. It takes an optional hash with a scoping selector, and/or a transformer. if only a string is passed to the method and not an object, it will use the string as the selector. ## getText `function getText({selector: })...` The `getText` method allows you to retrieve the text of a given element. It returns a promise that will resolve with the text if found, otherwise it will resolve with null. `getText` takes an optional hash with a selector key.If only a string is passed to the method then it will use that string for selector for the find operation. ## getInnerHTML `function getInnerHTML({selector: })` The `getInnerHTML` method will retrieve the innerHTML of the selector element. It returns a promise. Proxied off of [innerHTML](http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html#l2016). If a string is passed to `getInnerHTML` it will parse it as a selector. ## getOuterHTML `function getOuterHTML({selector: })` The `getOuterHTML` method retrives the outerHTML of the selector element. It returns a promise. Proxied off of [outerHTML](http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html#l1997). If a string is passed to `getOuterHTML` it will parse it as a selector. ### hasClass `function hasClass({className: name, selector: })` `hasClass` will test the existence of the provided class name on the DOM node of the Widget. It takes a hash that can contain an optional selector. If you only pass a string to the method and not an object then it will use the string as the class name. It returns a promise that will resolve with `true` or `false`. ================================================ FILE: gulpfile.js ================================================ var gulp = require("gulp"), include = require('gulp-include'), coffee = require('gulp-coffee'); gulp.task("default", function(done) { gulp.src([ 'src/widgets/build/widgets.coffee', 'src/support/index.coffee' ]) .pipe(include()) .pipe(coffee()) .pipe(gulp.dest("lib/support")) gulp.src([ 'src/pioneer.coffee', 'src/environment.coffee', 'src/errorformat.coffee', 'src/custom_formatter.coffee', 'src/config_builder.coffee', 'src/scaffold_builder.coffee' ], { allowEmpty: true }) .pipe(coffee()) .pipe(gulp.dest("lib/")) gulp.src([ 'src/config.json', 'src/pioneerformat.js', 'src/pioneersummaryformat.js' ], { allowEmpty: true }) .pipe(gulp.dest("lib/")) gulp.src([ 'src/scaffold/simple.txt', 'src/scaffold/simple.js', 'src/scaffold/example.json' ]) .pipe(gulp.dest("lib/scaffold")) done() }); gulp.task("watch", function() { gulp.watch('src/**/*', ['default']) }); ================================================ FILE: mergelcov.sh ================================================ #!/bin/bash while read FILENAME; do LCOV_INPUT_FILES="$LCOV_INPUT_FILES -a \"$FILENAME\"" done < <( find $1 -name lcov.info ) eval lcov "${LCOV_INPUT_FILES}" -q ================================================ FILE: npm-shrinkwrap.json ================================================ { "name": "pioneer", "version": "0.11.7", "lockfileVersion": 1, "requires": true, "dependencies": { "Base64": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.1.4.tgz", "integrity": "sha1-6fbGvvVn/WNepBYqsU3TKedKpt4=" }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" }, "ajv": { "version": "6.9.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" } } } }, "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { "ansi-wrap": "^0.1.0" } }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", "dev": true, "requires": { "ansi-wrap": "0.1.0" } }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", "dev": true }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" } }, "append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, "requires": { "buffer-equal": "^1.0.0" } }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, "arr-filter": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", "dev": true, "requires": { "make-iterator": "^1.0.0" } }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", "dev": true, "requires": { "make-iterator": "^1.0.0" } }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, "array-initial": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", "dev": true, "requires": { "array-slice": "^1.0.0", "is-number": "^4.0.0" }, "dependencies": { "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } }, "array-last": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, "requires": { "is-number": "^4.0.0" }, "dependencies": { "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true }, "array-sort": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dev": true, "requires": { "default-compare": "^1.0.0", "get-value": "^2.0.6", "kind-of": "^5.0.2" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, "async-done": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.2", "process-nextick-args": "^1.0.7", "stream-exhaust": "^1.0.1" } }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, "async-settle": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", "dev": true, "requires": { "async-done": "^1.2.2" } }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "bach": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "dev": true, "requires": { "arr-filter": "^1.1.1", "arr-flatten": "^1.0.1", "arr-map": "^2.0.0", "array-each": "^1.0.0", "array-initial": "^1.0.0", "array-last": "^1.1.1", "async-done": "^1.2.2", "async-settle": "^1.0.0", "now-and-later": "^2.0.0" } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "base64-js": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", "integrity": "sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q=" }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, "beeper": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, "binary-extensions": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", "dev": true }, "bluebird": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-1.2.4.tgz", "integrity": "sha512-nI6OoUVWcq6gV6kmgdaXpOMfBJhL9iq/pns0ORINhX3f51L9P87F5uvh9luqZuswURSQaN3082OfpwSDwA1KBw==" }, "bops": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/bops/-/bops-0.0.6.tgz", "integrity": "sha1-CC0dVfoB5g29wuvC26N/ZZVUzzo=", "requires": { "base64-js": "0.0.2", "to-utf8": "0.0.1" } }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "requires": { "ansi-align": "^2.0.0", "camelcase": "^4.0.0", "chalk": "^2.0.1", "cli-boxes": "^1.0.0", "string-width": "^2.0.0", "term-size": "^1.2.0", "widest-line": "^2.0.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" } }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } } } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "browserify": { "version": "1.15.5", "resolved": "https://registry.npmjs.org/browserify/-/browserify-1.15.5.tgz", "integrity": "sha1-K3GUlsztmGoplAgCvzrj+bIprdQ=", "requires": { "buffer-browserify": "~0.0.1", "coffee-script": "1.x.x", "commondir": "~0.0.1", "crypto-browserify": "~0", "deputy": "~0.0.3", "detective": "~0.2.0", "http-browserify": "~0.1.1", "nub": "~0.0.0", "optimist": "~0.3.4", "resolve": "~0.2.0", "syntax-error": "~0.0.0", "vm-browserify": "~0.0.0" }, "dependencies": { "coffee-script": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==" }, "optimist": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", "requires": { "wordwrap": "~0.0.2" } }, "resolve": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.2.8.tgz", "integrity": "sha1-/bF9SrsOyvb4DWesA88pAIj2wNA=" }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, "buffer-browserify": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/buffer-browserify/-/buffer-browserify-0.0.5.tgz", "integrity": "sha1-iqaGMciogpxqTufvmjrH8sMemD4=", "requires": { "base64-js": "0.0.2" } }, "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" } }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" }, "dependencies": { "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", "dev": true } } }, "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "chai": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/chai/-/chai-1.9.2.tgz", "integrity": "sha512-olRoaitftnzWHFEAza6MXR4w+FfZrOVyV7r7U/Z8ObJefCgL8IuWkAuASJjSXrpP9wvgoL8+1dB9RbMLc2FkNg==", "requires": { "assertion-error": "1.0.0", "deep-eql": "0.1.3" }, "dependencies": { "assertion-error": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", "integrity": "sha512-g/gZV+G476cnmtYI+Ko9d5khxSoCSoom/EaNmmCfwpOvBXEJ18qwFrxfP1/CsIqk2no1sAKKwxndV0tP7ROOFQ==" }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==", "requires": { "type-detect": "0.1.1" }, "dependencies": { "type-detect": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==" } } } } }, "chai-as-promised": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-4.1.0.tgz", "integrity": "sha512-ZXqEeAUKpOZyWI4FQ7P9YcZ9KBgWpcd2oLNPG1XTGsUaZzMQjKetROC7+uK59clAFGUK8cZR+r2LtsLfp7zeQg==" }, "chalk": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", "dev": true, "requires": { "ansi-styles": "^1.1.0", "escape-string-regexp": "^1.0.0", "has-ansi": "^0.1.0", "strip-ansi": "^0.3.0", "supports-color": "^0.2.0" }, "dependencies": { "ansi-regex": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", "dev": true }, "strip-ansi": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", "dev": true, "requires": { "ansi-regex": "^0.2.1" } } } }, "chokidar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", "dev": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.0" }, "dependencies": { "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true } } }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } } } }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wrap-ansi": "^2.0.0" } }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, "clone-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, "cloneable-readable": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", "readable-stream": "^2.3.5" }, "dependencies": { "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true } } }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "coffeescript": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", "dev": true }, "collection-map": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", "dev": true, "requires": { "arr-map": "^2.0.2", "for-own": "^1.0.0", "make-iterator": "^1.0.0" } }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, "colors": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==" }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true, "optional": true }, "commondir": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.2.tgz", "integrity": "sha1-xJyIgMb+loRLs1Jd0ucxQFDDie4=" }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "configstore": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", "make-dir": "^1.0.0", "unique-string": "^1.0.0", "write-file-atomic": "^2.0.0", "xdg-basedir": "^3.0.0" } }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, "copy-props": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", "dev": true, "requires": { "each-props": "^1.3.0", "is-plain-object": "^2.0.1" } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "coveralls": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", "dev": true, "requires": { "growl": "~> 1.10.0", "js-yaml": "^3.11.0", "lcov-parse": "^0.0.10", "log-driver": "^1.2.7", "minimist": "^1.2.0", "request": "^2.86.0" }, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "crypto-browserify": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-0.4.0.tgz", "integrity": "sha1-JG9qM3uITJn/6L+whaGEruYMM/M=" }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, "cucumber": { "version": "github:joshtombs/cucumber-js#78f79263e5855dd189e4bbe792cc6a34d7efcd19", "from": "github:joshtombs/cucumber-js#0.3.3ErrorFormatting", "requires": { "browserify": "1.15.5", "coffee-script": "1.6.3", "cucumber-html": "0.2.3", "gherkin": "2.12.2", "nopt": "2.1.2", "pogo": "0.5.1", "underscore": "1.5.2", "walkdir": "0.0.7" }, "dependencies": { "coffee-script": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.3.tgz", "integrity": "sha1-Y1XTLPGwTN/2tITl5xF4Ky8MOb4=" }, "nopt": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", "requires": { "abbrev": "1" } } } }, "cucumber-html": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/cucumber-html/-/cucumber-html-0.2.3.tgz", "integrity": "sha1-eyqf7SFXLF0l1L1MvHU3onKxapM=" }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { "array-find-index": "^1.0.1" } }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { "es5-ext": "^0.10.9" } }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "dateformat": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { "get-stdin": "^4.0.1", "meow": "^3.3.0" } }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, "deep-equal": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, "requires": { "kind-of": "^5.0.2" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "default-resolution": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", "dev": true }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "deputy": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/deputy/-/deputy-0.0.4.tgz", "integrity": "sha1-7cAKnvXFNSfEBTKFNMmXla2kHL8=", "requires": { "detective": "~0.2.0", "mkdirp": "~0.3.3" }, "dependencies": { "mkdirp": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" } } }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, "detective": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/detective/-/detective-0.2.1.tgz", "integrity": "sha1-nOkmAf0iOBDClDKtA0+MYti4ZU8=", "requires": { "esprima": "~0.9.9" }, "dependencies": { "esprima": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/esprima/-/esprima-0.9.9.tgz", "integrity": "sha1-G5CSXJddYy1ygpOcO7nDpCPDBJA=" } } }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { "is-obj": "^1.0.0" } }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, "duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { "readable-stream": "~1.1.9" }, "dependencies": { "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } } }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "each-props": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", "dev": true, "requires": { "is-plain-object": "^2.0.1", "object.defaults": "^1.1.0" } }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", "is-callable": "^1.1.4", "is-regex": "^1.0.4", "object-keys": "^1.0.12" } }, "es-to-primitive": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "es5-ext": { "version": "0.10.48", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.48.tgz", "integrity": "sha512-CdRvPlX/24Mj5L4NVxTs4804sxiS2CjVprgCmrgoDkdmjdY4D+ySHa7K3jJf8R40dFg0tIm3z/dk326LrnuSGw==", "dev": true, "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.1", "next-tick": "1" } }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, "es6-symbol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { "d": "1", "es5-ext": "~0.10.14" } }, "es6-weak-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.14", "es6-iterator": "^2.0.1", "es6-symbol": "^3.1.1" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { "esprima": "^2.7.1", "estraverse": "^1.9.1", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.2.0" }, "dependencies": { "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "source-map": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", "dev": true, "optional": true, "requires": { "amdefine": ">=0.0.4" } } } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "event-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", "integrity": "sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o=", "dev": true, "requires": { "duplexer": "~0.1.1", "from": "~0", "map-stream": "~0.1.0", "pause-stream": "0.0.11", "split": "0.2", "stream-combiner": "~0.0.4", "through": "~2.3.1" } }, "exec": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/exec/-/exec-0.1.1.tgz", "integrity": "sha1-CUerDk+jLOAJx4bNZCoLFgxeLPQ=", "dev": true }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "eyes": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "requires": { "ansi-gray": "^0.1.1", "color-support": "^1.1.3", "parse-node-version": "^1.0.0", "time-stamp": "^1.0.0" } }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" } }, "findup-sync": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { "detect-file": "^1.0.0", "is-glob": "^3.1.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { "is-extglob": "^2.1.0" } } } }, "fined": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", "dev": true, "requires": { "expand-tilde": "^2.0.2", "is-plain-object": "^2.0.3", "object.defaults": "^1.1.0", "object.pick": "^1.2.0", "parse-filepath": "^1.0.1" } }, "flagged-respawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "dev": true, "requires": { "is-buffer": "~2.0.3" }, "dependencies": { "is-buffer": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", "dev": true } } }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { "for-in": "^1.0.1" } }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "formatio": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.0.2.tgz", "integrity": "sha1-55kcoUT/fYz/B7uayGqbeca6R+8=", "dev": true, "requires": { "samsam": "~1.1" } }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { "map-cache": "^0.2.2" } }, "from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, "requires": { "graceful-fs": "^4.1.11", "through2": "^2.0.3" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { "nan": "^2.9.2", "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { "version": "1.1.1", "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { "version": "1.1.1", "resolved": false, "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "2.6.9", "resolved": false, "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "optional": true, "requires": { "ms": "2.0.0" } }, "deep-extend": { "version": "0.6.0", "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", "resolved": false, "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "glob": { "version": "7.1.3", "resolved": false, "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "optional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "has-unicode": { "version": "2.0.1", "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { "version": "3.0.1", "resolved": false, "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "optional": true, "requires": { "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true, "optional": true }, "ini": { "version": "1.3.5", "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, "requires": { "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": false, "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true, "optional": true }, "minipass": { "version": "2.3.5", "resolved": false, "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { "version": "1.2.1", "resolved": false, "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" } }, "mkdirp": { "version": "0.5.1", "resolved": false, "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", "resolved": false, "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true, "optional": true }, "needle": { "version": "2.2.4", "resolved": false, "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", "dev": true, "optional": true, "requires": { "debug": "^2.1.2", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { "version": "0.10.3", "resolved": false, "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" } }, "nopt": { "version": "4.0.1", "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" } }, "npm-bundled": { "version": "1.0.5", "resolved": false, "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.2.0", "resolved": false, "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" } }, "npmlog": { "version": "4.1.2", "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { "version": "1.0.1", "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", "resolved": false, "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { "version": "1.2.0", "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true } } }, "readable-stream": { "version": "2.3.6", "resolved": false, "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "rimraf": { "version": "2.6.3", "resolved": false, "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "optional": true, "requires": { "glob": "^7.1.3" } }, "safe-buffer": { "version": "5.1.2", "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.6.0", "resolved": false, "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "string_decoder": { "version": "1.1.1", "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.8", "resolved": false, "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", "minipass": "^2.3.4", "minizlib": "^1.1.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, "util-deprecate": { "version": "1.0.2", "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.0.3", "resolved": false, "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true, "optional": true } } }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" }, "dependencies": { "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } } } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "gherkin": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-2.12.2.tgz", "integrity": "sha1-PHRUfkZhNKDvg/YUsa38SJtw3GI=" }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { "is-extglob": "^2.1.0" } } } }, "glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, "requires": { "extend": "^3.0.0", "glob": "^7.1.1", "glob-parent": "^3.1.0", "is-negated-glob": "^1.0.0", "ordered-read-streams": "^1.0.0", "pumpify": "^1.3.5", "readable-stream": "^2.1.5", "remove-trailing-separator": "^1.0.1", "to-absolute-glob": "^2.0.0", "unique-stream": "^2.0.2" } }, "glob-watcher": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", "dev": true, "requires": { "anymatch": "^2.0.0", "async-done": "^1.2.0", "chokidar": "^2.0.0", "is-negated-glob": "^1.0.0", "just-debounce": "^1.0.0", "object.defaults": "^1.1.0" } }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { "ini": "^1.3.4" } }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" } }, "global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", "ini": "^1.3.4", "is-windows": "^1.0.1", "which": "^1.2.14" } }, "glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, "requires": { "sparkles": "^1.0.0" } }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", "get-stream": "^3.0.0", "is-redirect": "^1.0.0", "is-retry-allowed": "^1.0.0", "is-stream": "^1.0.0", "lowercase-keys": "^1.0.0", "safe-buffer": "^5.0.1", "timed-out": "^4.0.0", "unzip-response": "^2.0.1", "url-parse-lax": "^1.0.0" }, "dependencies": { "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "gulp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz", "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=", "dev": true, "requires": { "glob-watcher": "^5.0.0", "gulp-cli": "^2.0.0", "undertaker": "^1.0.0", "vinyl-fs": "^3.0.0" }, "dependencies": { "gulp-cli": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz", "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==", "dev": true, "requires": { "ansi-colors": "^1.0.1", "archy": "^1.0.0", "array-sort": "^1.0.0", "color-support": "^1.1.3", "concat-stream": "^1.6.0", "copy-props": "^2.0.1", "fancy-log": "^1.3.2", "gulplog": "^1.0.0", "interpret": "^1.1.0", "isobject": "^3.0.1", "liftoff": "^2.5.0", "matchdep": "^2.0.0", "mute-stdout": "^1.0.0", "pretty-hrtime": "^1.0.0", "replace-homedir": "^1.0.0", "semver-greatest-satisfied-range": "^1.1.0", "v8flags": "^3.0.1", "yargs": "^7.1.0" } } } }, "gulp-coffee": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/gulp-coffee/-/gulp-coffee-2.3.5.tgz", "integrity": "sha512-PbgPGZVyYFnBTYtfYkVN6jcK8Qsuh3BxycPzvu8y5lZroCw3/x1m25KeyEDX110KsVLDmJxoULjscR21VEN4wA==", "dev": true, "requires": { "coffeescript": "^1.10.0", "gulp-util": "^3.0.2", "merge": "^1.2.0", "through2": "^2.0.1", "vinyl-sourcemaps-apply": "^0.2.1" }, "dependencies": { "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", "dev": true }, "dateformat": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", "dev": true }, "gulp-util": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, "requires": { "array-differ": "^1.0.0", "array-uniq": "^1.0.2", "beeper": "^1.0.0", "chalk": "^1.0.0", "dateformat": "^2.0.0", "fancy-log": "^1.1.0", "gulplog": "^1.0.0", "has-gulplog": "^0.1.0", "lodash._reescape": "^3.0.0", "lodash._reevaluate": "^3.0.0", "lodash._reinterpolate": "^3.0.0", "lodash.template": "^3.0.0", "minimist": "^1.1.0", "multipipe": "^0.1.2", "object-assign": "^3.0.0", "replace-ext": "0.0.1", "through2": "^2.0.0", "vinyl": "^0.5.0" } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, "lodash.escape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "dev": true, "requires": { "lodash._root": "^3.0.0" } }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", "lodash.isarray": "^3.0.0" } }, "lodash.template": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "dev": true, "requires": { "lodash._basecopy": "^3.0.0", "lodash._basetostring": "^3.0.0", "lodash._basevalues": "^3.0.0", "lodash._isiterateecall": "^3.0.0", "lodash._reinterpolate": "^3.0.0", "lodash.escape": "^3.0.0", "lodash.keys": "^3.0.0", "lodash.restparam": "^3.0.0", "lodash.templatesettings": "^3.0.0" } }, "lodash.templatesettings": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "dev": true, "requires": { "lodash._reinterpolate": "^3.0.0", "lodash.escape": "^3.0.0" } }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "object-assign": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", "dev": true }, "replace-ext": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", "dev": true }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "vinyl": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } } } }, "gulp-include": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/gulp-include/-/gulp-include-2.3.1.tgz", "integrity": "sha1-8eDtPw/QdMNHx+WfnPA409vbPjA=", "dev": true, "requires": { "event-stream": "~3.1.0", "glob": "^5.0.12", "gulp-util": "~2.2.10", "source-map": "^0.5.1", "strip-bom": "^2.0.0", "vinyl-sourcemaps-apply": "^0.2.0" }, "dependencies": { "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { "inflight": "^1.0.4", "inherits": "2", "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } } } }, "gulp-util": { "version": "2.2.20", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", "dev": true, "requires": { "chalk": "^0.5.0", "dateformat": "^1.0.7-1.2.3", "lodash._reinterpolate": "^2.4.1", "lodash.template": "^2.4.1", "minimist": "^0.2.0", "multipipe": "^0.1.0", "through2": "^0.5.0", "vinyl": "^0.2.1" }, "dependencies": { "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, "through2": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", "dev": true, "requires": { "readable-stream": "~1.0.17", "xtend": "~3.0.0" } }, "vinyl": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", "dev": true, "requires": { "clone-stats": "~0.0.1" } }, "xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", "dev": true } } }, "gulplog": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { "glogg": "^1.0.0" } }, "handlebars": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", "dev": true, "requires": { "async": "^2.5.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { "async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { "lodash": "^4.17.11" } }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-ansi": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", "dev": true, "requires": { "ansi-regex": "^0.2.0" }, "dependencies": { "ansi-regex": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", "dev": true } } }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, "has-gulplog": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "dev": true, "requires": { "sparkles": "^1.0.0" } }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" } }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" } }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "http-browserify": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-0.1.14.tgz", "integrity": "sha1-nIs/lAAiBFR8fL5Saa/i6mL3HH8=", "requires": { "Base64": "~0.1.2", "concat-stream": "~1.0.0" }, "dependencies": { "concat-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.0.1.tgz", "integrity": "sha1-AYsYvBx9BzotyCqkhEI0GixN158=", "requires": { "bops": "0.0.6" } } } }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "i": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=" }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { "repeating": "^2.0.0" } }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" } }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { "binary-extensions": "^1.0.0" } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-ci": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "requires": { "ci-info": "^1.5.0" } }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "requires": { "global-dirs": "^0.1.0", "is-path-inside": "^1.0.0" } }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "requires": { "path-is-inside": "^1.0.1" } }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" } }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { "has": "^1.0.1" } }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { "is-unc-path": "^1.0.0" } }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { "has-symbols": "^1.0.0" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { "unc-path-regex": "^0.1.2" } }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, "is-valid-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", "dev": true }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { "abbrev": "1.0.x", "async": "1.x", "escodegen": "1.8.x", "esprima": "2.7.x", "glob": "^5.0.15", "handlebars": "^4.0.1", "js-yaml": "3.x", "mkdirp": "0.5.x", "nopt": "3.x", "once": "1.x", "resolve": "1.1.x", "supports-color": "^3.1.0", "which": "^1.1.1", "wordwrap": "^1.0.0" }, "dependencies": { "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { "inflight": "^1.0.4", "inherits": "2", "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { "has-flag": "^1.0.0" } } } }, "js-yaml": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, "just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", "dev": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, "last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, "requires": { "default-resolution": "^2.0.0", "es6-weak-map": "^2.0.1" } }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { "package-json": "^4.0.0" } }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { "readable-stream": "^2.0.5" } }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { "invert-kv": "^1.0.0" } }, "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, "lead": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { "flush-write-stream": "^1.0.2" } }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "liftoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", "dev": true, "requires": { "extend": "^3.0.0", "findup-sync": "^2.0.0", "fined": "^1.0.1", "flagged-respawn": "^1.0.0", "is-plain-object": "^2.0.4", "object.map": "^1.0.0", "rechoir": "^0.6.2", "resolve": "^1.1.7" } }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", "dev": true }, "lodash._basetostring": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", "dev": true }, "lodash._basevalues": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", "dev": true }, "lodash._escapehtmlchar": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", "dev": true, "requires": { "lodash._htmlescapes": "~2.4.1" } }, "lodash._escapestringchar": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", "dev": true }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", "dev": true }, "lodash._htmlescapes": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", "dev": true }, "lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", "dev": true }, "lodash._isnative": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", "dev": true }, "lodash._objecttypes": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", "dev": true }, "lodash._reescape": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", "dev": true }, "lodash._reevaluate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", "dev": true }, "lodash._reinterpolate": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", "dev": true }, "lodash._reunescapedhtml": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", "dev": true, "requires": { "lodash._htmlescapes": "~2.4.1", "lodash.keys": "~2.4.1" } }, "lodash._root": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true }, "lodash._shimkeys": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", "dev": true, "requires": { "lodash._objecttypes": "~2.4.1" } }, "lodash.defaults": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", "dev": true, "requires": { "lodash._objecttypes": "~2.4.1", "lodash.keys": "~2.4.1" } }, "lodash.escape": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", "dev": true, "requires": { "lodash._escapehtmlchar": "~2.4.1", "lodash._reunescapedhtml": "~2.4.1", "lodash.keys": "~2.4.1" } }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", "dev": true }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, "lodash.isobject": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", "dev": true, "requires": { "lodash._objecttypes": "~2.4.1" } }, "lodash.keys": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { "lodash._isnative": "~2.4.1", "lodash._shimkeys": "~2.4.1", "lodash.isobject": "~2.4.1" } }, "lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", "dev": true }, "lodash.template": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", "dev": true, "requires": { "lodash._escapestringchar": "~2.4.1", "lodash._reinterpolate": "~2.4.1", "lodash.defaults": "~2.4.1", "lodash.escape": "~2.4.1", "lodash.keys": "~2.4.1", "lodash.templatesettings": "~2.4.1", "lodash.values": "~2.4.1" } }, "lodash.templatesettings": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", "dev": true, "requires": { "lodash._reinterpolate": "~2.4.1", "lodash.escape": "~2.4.1" } }, "lodash.values": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", "dev": true, "requires": { "lodash.keys": "~2.4.1" } }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { "chalk": "^2.0.1" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" } }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { "pify": "^3.0.0" }, "dependencies": { "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, "requires": { "kind-of": "^6.0.2" } }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { "object-visit": "^1.0.0" } }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "dev": true, "requires": { "findup-sync": "^2.0.0", "micromatch": "^3.0.4", "resolve": "^1.4.0", "stack-trace": "0.0.10" } }, "mem": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^1.0.0", "p-is-promise": "^2.0.0" } }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", "loud-rejection": "^1.0.0", "map-obj": "^1.0.1", "minimist": "^1.1.3", "normalize-package-data": "^2.3.4", "object-assign": "^4.0.1", "read-pkg-up": "^1.0.1", "redent": "^1.0.0", "trim-newlines": "^1.0.0" }, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "merge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "mime-db": { "version": "1.38.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { "version": "2.1.22", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { "mime-db": "~1.38.0" } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", "integrity": "sha512-BESHrmJFCIiBW/PR08JD7bdtBheVQMd9GcvLEq3ACsZU6X3IrvurZwO0xg7uy/U3nt3My6HzDjNWcT6iOygqXA==" }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" } } } }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" }, "dependencies": { "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, "mocha": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.0.2.tgz", "integrity": "sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "findup-sync": "2.0.0", "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.12.0", "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", "node-environment-flags": "1.0.4", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", "yargs": "12.0.5", "yargs-parser": "11.1.1", "yargs-unparser": "1.5.0" }, "dependencies": { "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "camelcase": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", "dev": true }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" } }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" } }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" } }, "yargs-parser": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } }, "moment": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "multipipe": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", "dev": true, "requires": { "duplexer2": "0.0.2" } }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", "dev": true, "optional": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "ncp": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=" }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-environment-flags": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.4.tgz", "integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3" } }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { "abbrev": "1" } }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } }, "now-and-later": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", "dev": true, "requires": { "once": "^1.3.2" } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { "path-key": "^2.0.0" } }, "nub": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/nub/-/nub-0.0.0.tgz", "integrity": "sha1-s2m9Mr3eZq9ZYFw7BSC8IZ3MwE8=" }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "object-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", "dev": true }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { "isobject": "^3.0.0" } }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" } }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { "array-each": "^1.0.1", "array-slice": "^1.0.0", "for-own": "^1.0.0", "isobject": "^3.0.0" } }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.1" } }, "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { "isobject": "^3.0.1" } }, "object.reduce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", "dev": true, "requires": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true } } }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" } }, "options": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { "readable-stream": "^2.0.1" } }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { "lcid": "^1.0.0" } }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", "dev": true }, "p-limit": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "requires": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", "registry-url": "^3.0.3", "semver": "^5.1.0" } }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" } }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { "error-ex": "^1.2.0" } }, "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { "path-root-regex": "^0.1.0" } }, "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" } }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { "through": "~2.3" } }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { "pinkie": "^2.0.0" } }, "pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" }, "pogo": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/pogo/-/pogo-0.5.1.tgz", "integrity": "sha1-N7ienWG2pHHTCTxmmyZTJvtp8/E=", "requires": { "uglify-js": "2.2.4", "underscore": "1.4.4" }, "dependencies": { "optimist": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", "requires": { "wordwrap": "~0.0.2" } }, "source-map": { "version": "0.1.43", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "requires": { "amdefine": ">=0.0.4" } }, "uglify-js": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.4.tgz", "integrity": "sha1-gFtA+kaLH61NqE8+BM0Momv4Cik=", "requires": { "optimist": "~0.3.5", "source-map": "~0.1.7" } }, "underscore": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "prompt": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz", "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=", "requires": { "colors": "^1.1.2", "pkginfo": "0.x.x", "read": "1.0.x", "revalidator": "0.1.x", "utile": "0.3.x", "winston": "2.1.x" }, "dependencies": { "colors": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" } } }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", "dev": true }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" } }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "requires": { "mute-stream": "~0.0.4" } }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" } }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" } }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" }, "dependencies": { "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true } } }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" } }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { "resolve": "^1.1.6" } }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" } }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" } }, "registry-url": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { "rc": "^1.0.1" } }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, "requires": { "is-buffer": "^1.1.5", "is-utf8": "^0.2.1" } }, "remove-bom-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "dev": true, "requires": { "remove-bom-buffer": "^3.0.0", "safe-buffer": "^5.1.0", "through2": "^2.0.3" } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { "is-finite": "^1.0.0" } }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, "replace-homedir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", "dev": true, "requires": { "homedir-polyfill": "^1.0.1", "is-absolute": "^1.0.0", "remove-trailing-separator": "^1.1.0" } }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "resolve": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" } }, "resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", "dev": true, "requires": { "value-or-function": "^3.0.0" } }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "revalidator": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=" }, "rimraf": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==" }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { "ret": "~0.1.10" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "samsam": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.3.tgz", "integrity": "sha1-n1CHQZtNCR8jJXHn+lLpCw9VJiE=", "dev": true }, "sax": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=" }, "selenium-webdriver": { "version": "2.53.3", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", "requires": { "rimraf": "^2.2.8", "tmp": "0.0.24", "ws": "^1.0.1", "xml2js": "0.4.4" }, "dependencies": { "adm-zip": { "version": "0.4.13", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==" } } }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { "semver": "^5.0.3" } }, "semver-greatest-satisfied-range": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", "dev": true, "requires": { "sver-compat": "^1.5.0" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "should": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/should/-/should-3.3.1.tgz", "integrity": "sha1-KMk6UiugARRq+WB48KiL9aySlSI=", "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "sinon": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.10.0.tgz", "integrity": "sha1-GG9706hAYrxLH1s0xz79ShGgfxs=", "dev": true, "requires": { "formatio": "~1.0", "util": ">=0.10.3 <1" } }, "sinon-chai": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.5.0.tgz", "integrity": "sha1-VijmhQtwPoQS6w2UpcHFvHkjYBg=", "dev": true }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } } } }, "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", "dev": true }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "split": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", "dev": true, "requires": { "through": "2" } }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { "is-descriptor": "^0.1.0" } } } }, "stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { "duplexer": "~0.1.1" } }, "stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { "is-utf8": "^0.2.0" } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { "get-stdin": "^4.0.1" } }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", "dev": true }, "sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", "dev": true, "requires": { "es6-iterator": "^2.0.1", "es6-symbol": "^3.1.1" } }, "syntax-error": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-0.0.1.tgz", "integrity": "sha1-AZ0HU0jNjFt58GA8c+U4kafFI10=", "requires": { "esprima": "~0.9.9" }, "dependencies": { "esprima": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/esprima/-/esprima-0.9.9.tgz", "integrity": "sha1-G5CSXJddYy1ygpOcO7nDpCPDBJA=" } } }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { "execa": "^0.7.0" }, "dependencies": { "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "through2-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" } }, "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "tmp": { "version": "0.0.24", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=" }, "to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, "requires": { "is-absolute": "^1.0.0", "is-negated-glob": "^1.0.0" } }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", "dev": true, "requires": { "through2": "^2.0.3" } }, "to-utf8": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" }, "dependencies": { "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true } } }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { "prelude-ls": "~1.1.2" } }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { "commander": "~2.17.1", "source-map": "~0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } } }, "ultron": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, "underscore": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.2.tgz", "integrity": "sha1-EzXF5PXm0zu7SwBrqMhqAPVW3gg=" }, "undertaker": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz", "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=", "dev": true, "requires": { "arr-flatten": "^1.0.1", "arr-map": "^2.0.0", "bach": "^1.0.0", "collection-map": "^1.0.0", "es6-weak-map": "^2.0.1", "last-run": "^1.1.0", "object.defaults": "^1.0.0", "object.reduce": "^1.0.0", "undertaker-registry": "^1.0.0" } }, "undertaker-registry": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", "dev": true }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { "is-extendable": "^0.1.0" } }, "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.1", "to-object-path": "^0.3.0" } } } }, "unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { "json-stable-stringify-without-jsonify": "^1.0.1", "through2-filter": "^3.0.0" } }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { "crypto-random-string": "^1.0.0" } }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { "isarray": "1.0.0" } } } }, "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true } } }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", "configstore": "^3.0.0", "import-lazy": "^2.1.0", "is-ci": "^1.0.10", "is-installed-globally": "^0.1.0", "is-npm": "^1.0.0", "latest-version": "^3.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } } } }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { "punycode": "^2.1.0" } }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { "prepend-http": "^1.0.1" } }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "utile": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz", "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=", "requires": { "async": "~0.9.0", "deep-equal": "~0.2.1", "i": "0.3.x", "mkdirp": "0.x.x", "ncp": "1.0.x", "rimraf": "2.x.x" }, "dependencies": { "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" } } }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "v8flags": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" } }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "value-or-function": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, "requires": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", "clone-stats": "^1.0.0", "cloneable-readable": "^1.0.0", "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" } }, "vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", "dev": true, "requires": { "fs-mkdirp-stream": "^1.0.0", "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", "is-valid-glob": "^1.0.0", "lazystream": "^1.0.0", "lead": "^1.0.0", "object.assign": "^4.0.4", "pumpify": "^1.3.5", "readable-stream": "^2.3.3", "remove-bom-buffer": "^3.0.0", "remove-bom-stream": "^1.2.0", "resolve-options": "^1.1.0", "through2": "^2.0.0", "to-through": "^2.0.0", "value-or-function": "^3.0.0", "vinyl": "^2.0.0", "vinyl-sourcemap": "^1.1.0" } }, "vinyl-sourcemap": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", "dev": true, "requires": { "append-buffer": "^1.0.2", "convert-source-map": "^1.5.0", "graceful-fs": "^4.1.6", "normalize-path": "^2.1.1", "now-and-later": "^2.0.0", "remove-bom-buffer": "^3.0.0", "vinyl": "^2.0.0" } }, "vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", "dev": true, "requires": { "source-map": "^0.5.1" } }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "requires": { "indexof": "0.0.1" } }, "walkdir": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.7.tgz", "integrity": "sha1-BNoCcKh6d4VAFzzb8KLbSZqNnik=" }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "^1.0.2 || 2" } }, "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "requires": { "string-width": "^2.1.1" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { "ansi-regex": "^3.0.0" } } } }, "winston": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz", "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=", "requires": { "async": "~1.0.0", "colors": "1.0.x", "cycle": "1.0.x", "eyes": "0.1.x", "isstream": "0.1.x", "pkginfo": "0.3.x", "stack-trace": "0.0.x" }, "dependencies": { "async": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" }, "pkginfo": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" } } }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", "requires": { "options": ">=0.0.5", "ultron": "1.0.x" } }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xml2js": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", "requires": { "sax": "0.6.x", "xmlbuilder": ">=1.0.0" } }, "xmlbuilder": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.0.tgz", "integrity": "sha512-LzeAc96zUlknAk0F+xOXC8hO1D4ISG1ivov9UBjFkPcbSk6jVGhm9J8pTQp1ksZp9YbOws8pae8tVs+hwQl12w==" }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "dev": true, "requires": { "camelcase": "^3.0.0", "cliui": "^3.2.0", "decamelize": "^1.1.1", "get-caller-file": "^1.0.1", "os-locale": "^1.4.0", "read-pkg-up": "^1.0.1", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^1.0.2", "which-module": "^1.0.0", "y18n": "^3.2.1", "yargs-parser": "^5.0.0" } }, "yargs-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, "requires": { "camelcase": "^3.0.0" } }, "yargs-unparser": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", "dev": true, "requires": { "flat": "^4.1.0", "lodash": "^4.17.11", "yargs": "^12.0.5" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "camelcase": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", "dev": true }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" } }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" } }, "yargs-parser": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } } } } ================================================ FILE: package.json ================================================ { "name": "pioneer", "description": "Delicious Cucumber tests", "keywords": [ "cucumber", "selenium-webdriver", "testing" ], "author": "MojoTech", "version": "0.11.7", "license": "MIT", "engines": { "node": ">=0.8.0" }, "directories": { "lib": "./lib", "bin": "./bin" }, "main": "./lib/pioneer", "bin": { "pioneer": "bin/pioneer" }, "scripts": { "build": "npm run-script clean && gulp", "clean": "rm -rf lib", "pub": "npm run-script build && npm publish && npm run-script clean", "test": "istanbul cover --dir coverage/unit -x **/lib/**/*format.js node_modules/mocha/bin/_mocha -- test/unit/**.coffee", "integration": "istanbul cover -x **/lib/**/*format.js ./bin/pioneer --dir coverage/integration", "coverage": "./coverage.sh" }, "repository": { "type": "git", "url": "git://github.com/mojotech/pioneer.git" }, "devDependencies": { "coffeescript": "^1.12.7", "coveralls": "^3.0.3", "exec": "0.1.1", "gulp": "~4.0.0", "gulp-coffee": "^2.3.5", "gulp-include": "^2.3.1", "istanbul": "^0.4.5", "mocha": "^6.0.2", "should": "3.3.1", "sinon": "1.10.0", "sinon-chai": "2.5.0" }, "dependencies": { "bluebird": "1.2.4", "chai": "1.9.2", "chai-as-promised": "4.1.0", "colors": "0.6.2", "cucumber": "joshtombs/cucumber-js#0.3.3ErrorFormatting", "lodash": "^4.17.11", "minimist": "0.2.0", "moment": "2.24.0", "prompt": "^1.0.0", "rimraf": "2.2.8", "selenium-webdriver": "^2.53.3", "update-notifier": "2.5.0" }, "bugs": { "url": "https://github.com/mojotech/pioneer/issues" }, "homepage": "https://github.com/mojotech/pioneer" } ================================================ FILE: pioneer.json ================================================ { "feature": "test/integration/features", "require": [ "test/integration/steps", "test/integration/widgets" ], "format": "pioneerformat.js", "driver": "phantomjs", "error_formatter": "errorformat.js", "preventReload": true, "coffee": false } ================================================ FILE: src/config_builder.coffee ================================================ fs = require 'fs' path = require 'path' scaffold = require './scaffold_builder.js' _ = require 'lodash' CONFIG_NAMES = [ "tags", "feature", "require", "format", "error_formatter", "coffee", "driver", "preventReload", "scaffold" ] CUCUMBER_FORMATTERS = [ "pretty", "progress", "json", "summary" ] module.exports = convertToExecOptions: (objArry, libPath) -> execOptions = _.map objArry, (val) => k = _.keys(val)[0] switch when k is 'tags' "--#{k}=".concat( (_(Array::concat(val[k])) .flatten() .value()) .join(", ")) when k is 'driver' process.argv.push "--driver=#{val[k]}" "" when k is 'coffee' if val[k] "--#{k}" else "" when k is "format" v = val[k] if @isCucumberFormatter(v) "--format=#{v}" else if fs.existsSync(p = path.join(process.cwd(), v)) "--format=#{p}" else "--format=#{path.join(libPath, v)}" when k is 'preventReload' v = val[k] switch when typeof(v) is "string" if(v == "true") process.argv.push("--prevent-browser-reload") "" else if(val[k]) process.argv.push("--prevent-browser-reload") "" when k is 'feature' val[k] = Array::concat(val[k]) when k is 'require' val[k].reduce((p, v) -> p.concat("--require", v) , []) else if k? "--#{k}=#{val[k]}" else "" _(["--require", path.join(libPath, "support")]) .concat(execOptions) .flatten() .compact() .tap( (arr) -> arr.splice(0, 0, null, null)) .value() generateOptions: (minimist, config, libPath) -> options = _(CONFIG_NAMES) .map((name) -> obj = {} if (minimist[name]?) obj[name] = minimist[name] if name is 'require' and config[name]? obj[name] = Array::concat(obj[name]).concat(config[name]) else if config[name]? obj[name] = config[name] if obj[name]? then obj else null ) .compact() .value() if(!@hasFeature(options)) if(fs.existsSync(path.join(process.cwd(), '/features'))) @convertToExecOptions(options, libPath) else if(!!minimist["_"].length) options.push({feature: minimist["_"]}) @convertToExecOptions(options, libPath) else scaffold.featureNotSpecified() return null else @convertToExecOptions(options, libPath) hasFeature: (options) -> r = false _.forEach options, (opt) => k = _.keys(opt)[0] if(k == 'feature') r = true r isCucumberFormatter: (formatter) -> !!(_.find(CUCUMBER_FORMATTERS, (f) -> f is formatter)) ================================================ FILE: src/environment.coffee ================================================ Driver = require('selenium-webdriver') $ = Driver.promise module.exports = -> # ********************************************************************************* # Extend Object with class helpers (used in the context of a class definition): # ********************************************************************************* # # includes - mixin classes (extends the class itself and the prototype) # # class A # @onTheClass: -> "hello world, I'm on a class" # onAnInstance: -> "hello world, I'm on an instance" # # class B # @includes A # # B.onTheClass() # # => "hello world, I'm on a class" # (new B()).onAnInstance() # # => "hello world, I'm on an instance" # # Note: unlike underscore's "extend" or coffeescript's class extension, # include will successfully copy true getters and setters. # # **************************************************************************** # # getter - define a getter function (evaluated whenever a property is accessed) # # class A # @getter 'hello', -> 'world!' # # (new A).hello # => 'world!' # # ********************************************************************************* # # setter - define a setter function (evaluated whenever a property is assigned) # # class A # @getter 'hello', -> @_hello # @setter 'hello', (value) -> @_hello = 'hello' # # a = new A # a.hello = 'friend!' # # a.hello # => 'friend!' # a._hello # => 'friend!' # # ********************************************************************************* # return the descriptor for an object's property, regardless of # how far back in the prototype chain it was defined origDescriptor = (source, prop) -> return nil unless source Object.getOwnPropertyDescriptor(source, prop) || origDescriptor(Object.getPrototypeOf(source), prop) Object.defineProperties Object::, # like _.extend but handles true getters and setters: copyProperties: value: (source) -> for prop of source Object.defineProperty @, prop, origDescriptor(source, prop) @ includes: value: (mixin) -> @copyProperties(@, mixin) @copyProperties(@::, mixin::) @ getter: value: (object, property, getter) -> unless getter [object, property, getter] = [@::, object, property] Object.defineProperty object, property, configurable: true, enumerable: true, get: getter setter: value: (object, property, setter) -> unless setter [object, property, getter] = [@::, object, property] Object.defineProperty object, property, configurable: true, enumerable: true, set: getter accessor: value: (object, property) -> unless property [object, property] = [@::, object] Object.defineProperty object, property, configurable: true, enumerable: true, get: -> @["_#{property}"] set: (v) -> @["_#{property}"] = v # ********************************************************************************* # Load assertion library (with promise extensions) # ********************************************************************************* chai = require('chai') chai.use(require 'chai-as-promised') chai.should() # ********************************************************************************# # In a show of defensive programming boarding on xenophobic, selenium-webdriver # objects don't have Object.prototype in their prototype chain, so chai.should() # doesn't work (since it adds a getter to Object.prototype). To work around this, # we extend selenium-webdriver's Promise class's prototype directly. # ********************************************************************************* Object.defineProperty( $.Promise::, 'should', get: Object::__lookupGetter__('should')) # ********************************************************************************# # Circle CI doesn't seem to like ephemeral ports, and selenium-webdriver doesn't # seem to have an easy way to modify the chromedriver port, so we monkey-patch # it here. # ********************************************************************************# if process.env.CHROMEDRIVER_PORT require('../node_modules/selenium-webdriver/chrome').ServiceBuilder::port_ = process.env.CHROMEDRIVER_PORT ================================================ FILE: src/errorformat.coffee ================================================ color = require('colors') module.exports = (failure) -> return format(failure) format = (failure) -> message = shorten(failure, 5) colorFirstLine(message) shorten = (message, numlines) -> message.split('\n').splice(0, numlines).join('\n') colorFirstLine = (message) -> split = message.split('\n') split[0] = split[0].red.inverse split.join('\n') ================================================ FILE: src/pioneer.coffee ================================================ moment = require('moment') fs = require('fs') path = require('path') configBuilder = require('./config_builder') scaffoldBuilder = require('./scaffold_builder') color = require('colors') cucumber = require('cucumber') class Pioneer constructor: (libPath, args) -> if this.isVersionRequested(args) console.log require('../package').version return if(args.configPath && fs.existsSync(args.configPath)) configPath = args.configPath else if args.scaffold scaffoldBuilder.createScaffold() else p = path.join(process.cwd(), '/pioneer.json') if(fs.existsSync(p)) configPath = p else configPath = null this.getSpecifications(configPath, libPath, args) getSpecifications: (path, libPath, args) -> configObject = {} if(path) fs.readFile(path, 'utf8', (err, data) => throw err if(err) configObject = this.parseAndValidateJSON(data, path) if @isVerbose(args, configObject) console.log ('Configuration loaded from ' + path).yellow.inverse this.applySpecifications(configObject, libPath, args) ) else if @isVerbose(args, configObject) console.log ('No configuration path specified').yellow.inverse this.applySpecifications(configObject, libPath, args) applySpecifications: (obj, libPath, args) -> opts = configBuilder.generateOptions(args, obj, libPath) this.start(opts) if opts start: (opts) -> require('./environment')() cucumber.Cli(opts).run (success) -> process.exit(if success then 0 else 1) parseAndValidateJSON: (config, path) -> try JSON.parse(config) catch err throw new Error(path + " does not include a valid JSON object.\n") isVersionRequested: (args) -> args.version || args.v isVerbose: (args, config = {}) -> if args.verbose? return args.verbose and args.verbose isnt "false" else return !!config.verbose module.exports = Pioneer ================================================ FILE: src/pioneerformat.js ================================================ var path = require('path'); var moment = require('moment'); module.exports = function(options, Cucumber) { var color = Cucumber.Util.ConsoleColor; var self = Cucumber.Listener.Formatter(options); var summaryFormatter = require('./pioneersummaryformat.js')(options, Cucumber) var currentMaxStepLength = 0; var parentHear = self.hear; self.hear = function hear(event, callback) { summaryFormatter.hear(event, function () { parentHear(event, callback); }); }; self.handleBeforeFeaturesEvent = function (event, callback) { self.timeStart = new Date().getTime(); callback(); }; self.handleBeforeFeatureEvent = function handleBeforeFeatureEvent(event, callback) { var feature = event.getPayloadItem('feature'); var tags = feature.getTags(); var tagNames = []; for (var idx = 0; idx < tags.length; idx++) { tagNames.push(tags[idx].getName()); } var uri = color.format('comment', "# " + feature.getUri().replace(process.cwd(),'').slice(1)) var source = color.format('tag', tagNames.join(" ")) + "\n" + feature.getKeyword() + ": " + feature.getName() + " " + uri + "\n"; self.log(source); self.logIndented(feature.getDescription() + "\n\n", 1); callback(); }; self.handleBeforeScenarioEvent = function handleBeforeScenarioEvent(event, callback) { var scenario = event.getPayloadItem('scenario'); var tags = scenario.getOwnTags(); var tagNames = []; for (var idx = 0; idx < tags.length; idx++) { tagNames.push(tags[idx].getName()); } var tagSource = color.format("tag", tagNames.join(" ")) + "\n" ; var source = scenario.getKeyword() + ": " + scenario.getName(); var lineLengths = [source.length, scenario.getMaxStepLength()]; if (scenario.getBackground() !== undefined) { lineLengths.push(scenario.getBackground().getMaxStepLength()); } lineLengths.sort(function(a,b) { return b-a; }); currentMaxStepLength = lineLengths[0]; source = tagSource + self._pad(source, currentMaxStepLength + 3); source += "\n"; self.logIndented(source, 1); callback(); }; self.handleAfterScenarioEvent = function handleAfterScenarioEvent(event, callback) { self.log("\n"); callback(); }; self.applyColor = function (stepResult, source) { if (stepResult.isFailed()) source = color.format('failed', source); else if (stepResult.isPending()) source = color.format('pending',source); else if (stepResult.isSkipped()) source = color.format('skipped',source); else if (stepResult.isSuccessful()) source = color.format('passed',source); else if (stepResult.isUndefined()) source = color.format('undefined',source); return source; }; self.setColorFormat = function (stepResult) { if (stepResult.isFailed()) color.setFormat('failed'); else if (stepResult.isPending()) color.setFormat('pending'); else if (stepResult.isSkipped()) color.setFormat('skipped'); else if (stepResult.isSuccessful()) color.setFormat('passed'); else if (stepResult.isUndefined()) color.setFormat('undefined'); }; self.resetColorFormat = function() { color.resetFormat(); } self.handleStepResultEvent = function handleStepResultEvent(event, callback) { var stepResult = event.getPayloadItem('stepResult'); var step = stepResult.getStep(); var source = self.applyColor(stepResult, step.getKeyword() + step.getName()); source = self._pad(source, currentMaxStepLength + 10); source += "\n"; self.logIndented(source, 2); if (step.hasDataTable()) { var dataTable = step.getDataTable(); self.logDataTable(stepResult, dataTable); } if (step.hasDocString()) { var docString = step.getDocString(); self.logDocString(stepResult, docString); } if (stepResult.isFailed()) { var failure = stepResult.getFailureException(); self.logIndented(require("./errorformat")(failure.stack || failure) + "\n", 3); } callback(); }; self.handleAfterFeaturesEvent = function handleAfterFeaturesEvent(event, callback) { var summaryLogs = summaryFormatter.getLogs(); testTime = moment.duration(new Date().getTime() - self.timeStart)._data; self.log("\nDuration " + "(" + testTime.minutes + "m:" + testTime.seconds + "s:" + testTime.milliseconds + "ms)\n"); callback(); }; self.logDataTable = function logDataTable(stepResult, dataTable) { var rows = dataTable.raw(); var columnWidths = self._determineColumnWidthsFromRows(rows); var rowCount = rows.length; var columnCount = columnWidths.length; for (var rowIndex = 0; rowIndex < rowCount; rowIndex++) { var cells = rows[rowIndex]; var line = "|"; for (var columnIndex = 0; columnIndex < columnCount; columnIndex++) { var cell = cells[columnIndex]; var columnWidth = columnWidths[columnIndex]; line += " " + self.applyColor(stepResult, self._pad(cell, columnWidth)) + " |" } line += "\n"; self.logIndented(line, 3); } }; self.logDocString = function logDocString(stepResult, docString) { var contents = '"""\n' + docString.getContents() + '\n"""\n'; contents = self.applyColor(stepResult, contents) self.logIndented(contents, 3); }; self.logIndented = function logIndented(text, level) { var indented = self.indent(text, level); self.log(indented); }; self.indent = function indent(text, level) { var indented; text.split("\n").forEach(function(line) { var prefix = new Array(level + 1).join(" "); line = (prefix + line).replace(/\s+$/, ''); indented = (typeof(indented) == 'undefined' ? line : indented + "\n" + line); }); return indented; }; self._determineColumnWidthsFromRows = function _determineColumnWidthsFromRows(rows) { var columnWidths = []; var currentColumn; rows.forEach(function (cells) { currentColumn = 0; cells.forEach(function (cell) { var currentColumnWidth = columnWidths[currentColumn]; var currentCellWidth = cell.length; if (typeof currentColumnWidth == "undefined" || currentColumnWidth < currentCellWidth) columnWidths[currentColumn] = currentCellWidth; currentColumn += 1; }); }); return columnWidths; }; self._pad = function _pad(text, width) { var padded = "" + text; while (padded.length < width) { padded += " "; } return padded; }; return self; }; ================================================ FILE: src/pioneersummaryformat.js ================================================ module.exports = function (options, Cucumber) { var failedScenarioLogBuffer = ""; var undefinedStepLogBuffer = ""; var failedStepResults = Cucumber.Type.Collection(); var statsJournal = Cucumber.Listener.StatsJournal(); var color = Cucumber.Util.ConsoleColor; var self = Cucumber.Listener.Formatter(options); var parentHear = self.hear; self.hear = function hear(event, callback) { statsJournal.hear(event, function () { parentHear(event, callback); }); }; self.handleStepResultEvent = function handleStepResult(event, callback) { var stepResult = event.getPayloadItem('stepResult'); if (stepResult.isUndefined()) { self.handleUndefinedStepResult(stepResult); } else if (stepResult.isFailed()) { self.handleFailedStepResult(stepResult); } callback(); }; self.handleUndefinedStepResult = function handleUndefinedStepResult(stepResult) { var step = stepResult.getStep(); self.storeUndefinedStep(step); }; self.handleFailedStepResult = function handleFailedStepResult(stepResult) { self.storeFailedStepResult(stepResult); }; self.handleAfterScenarioEvent = function handleAfterScenarioEvent(event, callback) { if (statsJournal.isCurrentScenarioFailing()) { var scenario = event.getPayloadItem('scenario'); self.storeFailedScenario(scenario); } callback(); }; self.handleAfterFeaturesEvent = function handleAfterFeaturesEvent(event, callback) { self.logSummary(); callback(); }; self.storeFailedStepResult = function storeFailedStepResult(failedStepResult) { failedStepResults.add(failedStepResult); }; self.storeFailedScenario = function storeFailedScenario(failedScenario) { var name = failedScenario.getName(); var uri = failedScenario.getUri(); var line = failedScenario.getLine(); self.appendStringToFailedScenarioLogBuffer(uri + ":" + line + " # Scenario: " + name); }; self.storeUndefinedStep = function storeUndefinedStep(step) { var snippetBuilder = Cucumber.SupportCode.StepDefinitionSnippetBuilder(step, self.getStepDefinitionSyntax()); var snippet = snippetBuilder.buildSnippet(); self.appendStringToUndefinedStepLogBuffer(snippet); }; self.getStepDefinitionSyntax = function getStepDefinitionSyntax() { var syntax = options.coffeeScriptSnippets ? 'CoffeeScript' : 'JavaScript'; return new Cucumber.SupportCode.StepDefinitionSnippetBuilderSyntax[syntax](); }; self.appendStringToFailedScenarioLogBuffer = function appendStringToFailedScenarioLogBuffer(string) { failedScenarioLogBuffer += string + "\n"; }; self.appendStringToUndefinedStepLogBuffer = function appendStringToUndefinedStepLogBuffer(string) { if (undefinedStepLogBuffer.indexOf(string) == -1) undefinedStepLogBuffer += string + "\n"; }; self.getFailedScenarioLogBuffer = function getFailedScenarioLogBuffer() { return failedScenarioLogBuffer; }; self.getUndefinedStepLogBuffer = function getUndefinedStepLogBuffer() { return undefinedStepLogBuffer; }; self.logSummary = function logSummary() { if (statsJournal.witnessedAnyFailedStep()) self.logFailedStepResults(); self.logScenariosSummary(); self.logStepsSummary(); if (statsJournal.witnessedAnyUndefinedStep()) self.logUndefinedStepSnippets(); }; self.logFailedStepResults = function logFailedStepResults() { self.log("Failing Scenarios: \n") failedStepResults.syncForEach(function(stepResult) { self.log(stepResult.getStep().getUri() + ':' + stepResult.getStep().getLine() + '\n'); self.logFailedStepResult(stepResult) }) }; self.logFailedStepResult = function logFailedStepResult(stepResult) { var failureMessage = stepResult.getFailureException(); self.log(require("./errorformat")(failureMessage.stack || failureMessage)); self.log("\n\n"); }; self.logScenariosSummary = function logScenariosSummary() { var scenarioCount = statsJournal.getScenarioCount(); var passedScenarioCount = statsJournal.getPassedScenarioCount(); var undefinedScenarioCount = statsJournal.getUndefinedScenarioCount(); var pendingScenarioCount = statsJournal.getPendingScenarioCount(); var failedScenarioCount = statsJournal.getFailedScenarioCount(); var details = []; self.log(scenarioCount + " scenario" + (scenarioCount != 1 ? "s" : "")); if (scenarioCount > 0 ) { if (failedScenarioCount > 0) details.push(color.format('failed', failedScenarioCount + " failed")); if (undefinedScenarioCount > 0) details.push(color.format('undefined', undefinedScenarioCount + " undefined")); if (pendingScenarioCount > 0) details.push(color.format('pending', pendingScenarioCount + " pending")); if (passedScenarioCount > 0) details.push(color.format('passed', passedScenarioCount + " passed")); self.log(" (" + details.join(', ') + ")"); } self.log("\n"); }; self.logStepsSummary = function logStepsSummary() { var stepCount = statsJournal.getStepCount(); var passedStepCount = statsJournal.getPassedStepCount(); var undefinedStepCount = statsJournal.getUndefinedStepCount(); var skippedStepCount = statsJournal.getSkippedStepCount(); var pendingStepCount = statsJournal.getPendingStepCount(); var failedStepCount = statsJournal.getFailedStepCount(); var details = []; self.log(stepCount + " step" + (stepCount != 1 ? "s" : "")); if (stepCount > 0) { if (failedStepCount > 0) details.push(color.format('failed', failedStepCount + " failed")); if (undefinedStepCount > 0) details.push(color.format('undefined', undefinedStepCount + " undefined")); if (pendingStepCount > 0) details.push(color.format('pending', pendingStepCount + " pending")); if (skippedStepCount > 0) details.push(color.format('skipped', skippedStepCount + " skipped")); if (passedStepCount > 0) details.push(color.format('passed', passedStepCount + " passed")); self.log(" (" + details.join(', ') + ")"); } self.log("\n"); }; self.logUndefinedStepSnippets = function logUndefinedStepSnippets() { var undefinedStepLogBuffer = self.getUndefinedStepLogBuffer(); self.log(color.format('pending', "\nYou can implement step definitions for undefined steps with these snippets:\n\n")); self.log(color.format('pending', undefinedStepLogBuffer)); }; return self; }; ================================================ FILE: src/scaffold/example.json ================================================ { "feature": "tests/features", "require": [ "tests/steps", "tests/widgets" ], "format": "pioneerformat.js", "driver": "chrome", "error_formatter": "errorformat.js", "preventReload": false, "coffee": false, "verbose": true } ================================================ FILE: src/scaffold/simple.js ================================================ module.exports = function(){ this.Given(/^I visit TODOMVC$/,function(){ this.driver.get('http://todomvc.com/examples/backbone/') }); this.When(/^I enter \"([^\"]*)\"$/, function(value){ new this.Widget({ root: ".new-todo" }).sendKeys(value,'\uE007'); }); this.Then(/^I should see \"([^\"]*)\"$/, function(expected){ var List = this.Widget.List.extend({ root: ".todo-list", childSelector: "li" }) return new List().readAt(0).should.eventually.eql(expected); }) } ================================================ FILE: src/scaffold/simple.txt ================================================ Feature: Simple Feature Background: Given I visit TODOMVC Scenario: Entering Information When I enter "dogecoins" Then I should see "dogecoins" ================================================ FILE: src/scaffold_builder.coffee ================================================ fs = require 'fs' path = require 'path' prompt = require 'prompt' color = require 'colors' _ = require 'lodash' module.exports = featureNotSpecified: -> prompt.start() prompt.get({ message: "You did not specify a feature path. Would you like Pioneer to generate one for you? y/n" required: true }, (err, r) => if(['y', 'yes'].indexOf(r.question.toLowerCase()) > -1) @createScaffold() else console.log('Looks like you have no feature files or have not passed the path to them. http://www.github.com/mojotech/pioneer/docs') process.exit() ) createScaffold: (options) -> p = path.join(process.cwd(), '/tests') if(!fs.existsSync(p)) fs.mkdirSync(p) features = path.join(p, '/features') if(!fs.existsSync(features)) fs.mkdirSync(features) fixtures = path.join(p, '/fixtures') if(!fs.existsSync(fixtures)) fs.mkdirSync(fixtures) widgets = path.join(p, '/widgets') if(!fs.existsSync(widgets)) fs.mkdirSync(widgets) steps = path.join(p, '/steps') if(!fs.existsSync(steps)) fs.mkdirSync(steps) fs.writeFileSync(path.join(features, 'simple.feature'), fs.readFileSync(path.join(__dirname, "scaffold/simple.txt"), 'utf8')) fs.writeFileSync(path.join(steps, 'simple.js'), fs.readFileSync(path.join(__dirname, "scaffold/simple.js"), 'utf8')) hiddenPioneer = path.join(process.cwd(), '/pioneer.json') if(!fs.existsSync(hiddenPioneer)) fs.writeFileSync(hiddenPioneer, fs.readFileSync(path.join(__dirname, "scaffold/example.json"), 'utf8')) else @askToOverWrite(hiddenPioneer, fs.readFileSync(path.join(__dirname, "scaffold/example.json"), 'utf8')) @_logCompleted() process.exit() askToOverWrite: (file, data) -> prompt.start() prompt.get({ message: "It looks like you already have a #{file} , are you sure that you would like to overwrite this? y/n" required: true }, (err, r) => if(['y', 'yes'].indexOf(r.question.toLowerCase()) > -1) fs.writeFileSync(file, data) else console.log("You chose not to overwrite #{file} to run the scaffold files include tests/features in the feature option of your config files.") ) _logCompleted: -> console.log('Scaffold created. You may now run your first test'.inverse.green) ================================================ FILE: src/support/index.coffee ================================================ Driver = require('selenium-webdriver') $ = Driver.promise argv = require('minimist')(process.argv) _ = require('lodash') color = require('colors') global.timeout = 5000 module.exports = -> @Driver = Driver _Before = @Before _After = @After @_inFlow = (code, callback) -> $.createFlow (flow) => flow.execute => code.call(@) .then _.partial(callback, null), (err) -> throw err @Before = (code) -> _Before (callback) => @_inFlow code, callback @After = (code) -> _After (callback) => @_inFlow code, callback @BeforeAll = (code) -> unless @_ranBeforeAll @_ranBeforeAll = true @Before code @AfterAll = (code) -> unless @_ranAfterAll @_ranAfterAll = true @After code flowStep = (code, args, pending, successCallback, errCallback) => @Pending = (reason) -> successCallback = _.partial pending, reason $ .createFlow (flow) => flow.execute => code.apply(@, args) .then (result) -> successCallback null, result , errCallback @Given = @When = (pattern, code) => @defineStep pattern, (args..., callback) => @lastStepType = 'Given' flowStep code, args, callback.pending, callback, callback @Then = (pattern, code) => @defineStep pattern, (args..., callback) => @lastStepType = 'Then' start = new Date callforth = => flowStep code, args, callback.pending, callback, (error) => if new Date - start > timeout callback(error) else $.delayed(1000).then -> callforth() callforth() @And = (pattern, code) => @[@lastStepType](pattern, code) @SetDriver = -> @driver = @ConfigureDriver?(Driver, argv) || new Driver.Builder().withCapabilities(Driver.Capabilities[argv.driver || 'chrome']()).build() @Freeze = -> keyPress = false stdin = process.stdin stdin.setRawMode(true) stdin.resume() stdin.setEncoding('utf8') console.log('Press any key to continue...'.yellow.inverse) process.stdin.on('data', ((key) -> keyPress = true )) @driver.wait( (()-> return keyPress ), Infinity).then -> process.stdin.pause() @Before -> @lastStepType = 'Given' if !@driver || !shouldPreventBrowserReload() @SetDriver() @driver.visit = @driver.get @After -> terminateDriver() unless shouldPreventBrowserReload() @registerHandler "AfterFeatures", (event, callback) => if shouldPreventBrowserReload() terminateDriver().then -> callback() else callback() shouldPreventBrowserReload = -> argv['prevent-browser-reload']? terminateDriver = => @driver.close() @driver.quit() @When /^I Freeze$/, @Freeze ================================================ FILE: src/widgets/Widget.Form.coffee ================================================ Promise = require('bluebird') _ = require('lodash') class @Widget.Form extends @Widget root: 'form' submitSelector: -> @find('[type="submit"]') submitForm: => @submitSelector().then (el) -> el.click() submitWith: (values) => @fillAll(values) .then(@submitForm) select: (opts) -> if !(_.isObject(opts)) and !opts throw new Error('You must provide something to select by.') opts = if _.isObject(opts) then opts else {text: opts} if (opts.text? and opts.value?) throw new Error('You may only have one select by attribute.') else if opts.text? @_selectByText(opts.text) else if opts.value? @_selectByValue(opts.value) _selectByText: (text) -> @find({text: text}).then (el) -> el.click() _selectByValue: (value) -> @find("option[value=\"#{value}\"]").then (el) -> el.click() fillAll: (values) -> @_map Object.keys(values), (f) => @fill({ selector: @_name(f) value: values[f] }) readAll: -> _readAll = (f) => @getValue(@_name(f)).then (v) -> [f, v] @_map(@fields, _readAll).then (read) -> _.fromPairs(read) _name: (name) -> "[name='#{name}']" ================================================ FILE: src/widgets/Widget.Iframe.coffee ================================================ class @Widget.Iframe extends @Widget root: 'iframe' focus: -> @driver.switchTo().frame(@find()).then => this unfocus: -> @driver.switchTo().defaultContent().then => this ================================================ FILE: src/widgets/Widget.List.coffee ================================================ _ = require("lodash") Driver = require('selenium-webdriver') $ = Driver.promise class @Widget.List extends @Widget itemSelector: 'li' itemClass: World.Widget getItemClass: (el) -> $.fulfilled(@itemClass) at: (opts) -> if _.isNumber(opts) @items().then (items) -> items[opts] else throw new Error("Argument must be a number. https://github.com/mojotech/pioneer/blob/master/docs/list.md#at") clickAt: (opts) -> if _.isNumber(opts) opts = {index: opts} @at(opts.index).then (widget) -> widget.click(opts.selector) readAt: (opts) -> if (_.isNumber(opts)) return @at(opts).then (widget) -> widget.read() else @at(opts.index).then (widget) -> widget.read(opts) map: (iter) -> @items().then (items) -> $.map(items, iter) each: (iter) -> @map.apply(this, arguments).then -> @items length: -> @items().then (items) -> items.length invoke: (opts) -> if(_.isString(opts) or _.isFunction(opts)) opts = {method: opts} @map (item) -> if _.isFunction(opts.method) opts.method.apply(item, opts.arguments) else item[opts.method].apply(item, opts.arguments) filter: (iter) -> @items().then (items) -> $.filter(items, iter) items: -> @find().then (el) => el.findElements(Driver.By.css(@itemSelector)) .then (elms) => @_map elms, (el) => @getItemClass(el).then (itemClass) -> new itemClass({ el: el }) findWhere: (iter) -> @filter(iter).then (items) -> items[0] if items ================================================ FILE: src/widgets/Widget.coffee ================================================ _ = require('lodash') Driver = require('selenium-webdriver') $ = Driver.promise @W = class @Widget @extend: (protoProps, staticProps) -> parent = @ if Object.hasOwnProperty(protoProps, 'constructor') child = protoProps.constructor else child = -> parent.apply(@, arguments) child.copyProperties @ child.copyProperties staticProps Surrogate = -> @constructor = child return undefined Surrogate.prototype = @:: child.prototype = new Surrogate() child::.copyProperties(protoProps) if protoProps child.__super__ = @:: child @find = (attributes) -> _this = _.extend(new this, attributes) _this.find().then (el) -> _this.el = el _this staticMethods = ["click", "fill", "hover", "doubleClick", "read", "isPresent", "isVisible", "getAttribute", "getValue", "getText", "getInnerHTML", "getOuterHTML", "hasClass", "sendKeys", "clear"] for staticMethod in staticMethods m = (args...) => @find({root: "html"}).then (w) -> w[args[0]].apply(w, args.slice(1)) @[staticMethod] = _.partial(m, staticMethod) constructor: (attributes = {}) -> _.extend @, attributes @initialize.apply @, arguments # Defines a noop initialize method intended to be # overridden by the user when extending a Widget base class initialize: -> world: World # use a getter to lazily initialize driver @getter 'driver', -> @_driver || World.driver click: (opts) -> @find(opts).then (el) -> el.click() fill: (opts) -> if !(_.isObject(opts)) and !opts throw new Error("You must pass a value to fill with. https://github.com/mojotech/pioneer/blob/master/docs/widget.md#fill") opts = if _.isObject(opts) then opts else {value: opts} @find(opts.selector).then (el) -> el.clear().then -> el.sendKeys.apply(el, Array::slice.call(opts.value)) read: (opts) -> if _.isString(opts) or opts is undefined @find(opts).then (el) -> el.getText() else _.defaults opts, transformer: (value) -> value selector: null @find(opts.selector).then (el) -> return el.getText().then opts.transformer getValue: (opts={}) -> if _.isString(opts) opts = {selector: opts} _.defaults opts, transformer: (val) -> val @find(opts).then (el) -> el.getAttribute('value').then opts.transformer find: (opts) -> deferred = new $.Deferred if (!opts or _.isString(opts)) opts = {selector: opts} if (opts.text) return @_findByText(opts) if (@el) if !opts.selector deferred.fulfill(@el) else return @el.findElement(Driver.By.css(opts.selector)) return deferred @_ensureElement(opts.selector).then => @driver.findElement(Driver.By.css(@_selector(opts.selector))) getHtml: (opts) -> @find(opts).then (el) -> el.getOuterHtml() getText: (opts) -> @find(opts).then (el) -> el.getText() getAttribute: (opts) -> if _.isString(opts) opts = {attribute: opts} @find(opts).then (el) -> el.getAttribute(opts.attribute) getInnerHTML: (opts) -> @find(opts).then (el) -> el.getInnerHtml() getOuterHTML: (opts) -> @find(opts).then (el) -> el.getOuterHtml() isPresent: (selector) -> if @_selector(selector) != "undefined" @driver.isElementPresent(Driver.By.css(@_selector(selector))) else @el.isDisplayed() isVisible: (opts={}) -> if(_.isString(opts)) opts = {selector: opts} @isPresent(opts.selector).then (present) => if(present) @find(opts).then (elm) -> elm.isDisplayed() else false addClass: (opts) -> if _.isString(opts) opts = {className: opts} @find(opts.selector).then (el) => @driver.executeScript("arguments[0].classList.add(arguments[1])", el, opts.className) removeClass: (opts) -> if _.isString(opts) opts = {className: opts} @find(opts.selector).then (el) => @driver.executeScript("arguments[0].classList.remove(arguments[1])", el, opts.className) toggleClass: (opts) -> if _.isString(opts) opts = {className: opts} @find(opts.selector).then (el) => @driver.executeScript("arguments[0].classList.toggle(arguments[1])", el, opts.className) hasClass: (opts) -> if _.isString(opts) opts = {className: opts} @find(opts.selector).then (el) => @driver.executeScript( "return arguments[0].classList.contains(arguments[1])", el, opts.className ) findAll: (selector) -> @find().then (el) => new World.Widget.List({ el: el itemSelector: selector }) _selector: (selector) -> @root + (if selector then " #{selector}" else '') _findByText: (opts) -> # WebDriver lets you go out of the child scope # if you pass an absolute xpath selector # this is a bug in WebDriver and is terrible # by passing a `.` this is no longer an issue. _selector = Driver.By.xpath('.//*[normalize-space(text())=normalize-space("' + opts.text + '")]') @find().then (el) => @driver.wait( _.bind(el.findElement, el, _selector), global.timeout, "Unable to find node containing text #{opts.text}" ).then => el.findElement(_selector) _ensureElement: (selector) -> @driver.wait( _.bind(@isPresent, this, selector), global.timeout, "#{@_selector(selector)} not found" ) sendKeys: (opts...)-> if(opts.length > 1) @sendKeys({keys: opts}) else opts = opts[0] if !(_.isObject(opts)) opts = {keys: Array::concat(opts)} @find(opts.selector).then (el) -> el.sendKeys.apply(el, Array::concat(opts.keys)) hover: (opts) -> @find(opts).then (el) => new Driver.ActionSequence(@driver) .mouseMove(el) .perform() .then => this doubleClick: (opts) -> @find(opts) .then (el) => new Driver.ActionSequence(@driver) .doubleClick(el) .perform() .then => this clear: (opts) -> @find(opts) .then (el) => el.clear().then => this _map: (collection, callback) -> results = [] _reduce = (p, f, i) -> p.then -> callback(f, i).then (v) -> results.push(v) _.reduce(collection, _reduce, Driver.promise.fulfilled()) .then -> results ================================================ FILE: src/widgets/build/widgets.coffee ================================================ module.exports = -> World = @ @Widgets = {} #= include ../Widget.coffee #= include ../Widget.List.coffee #= include ../Widget.Form.coffee ================================================ FILE: test/integration/features/findwidget.feature ================================================ Feature: Reading from the DOM Background: When I view "sample.html" Scenario: Using the find based constructor When I eager find the "space9" element I should see "wormhole" Scenario: Getting the text of an element When I retrieve text of the "space9" element I should get "wormhole" Scenario: Getting the text of an element with a child selector When I retrieve text of the "space9" element as a child of "deep" I should get "wormhole" Scenario: When I search by text Given I search for "many money" I should get "many money" ================================================ FILE: test/integration/features/form.feature ================================================ Feature: Submit With Background: Given I view "form.html" Scenario: Clicking Submit Given I click submit Then I should see "field1 is and field2 is default" Scenario: When I submit Given I enter information and submit Then I should see "field1 is myEmail@gmail.com and field2 is default" Scenario: Clearing an input before filling Given I fill the field with default with something else Then I should only see something else Scenario: When I fill in fields Given I fill a form with: | name | value | | field1 | 1 | | field2 | 2 | Scenario: When I instantiate a form widget without a root selector Then the widget should use the default form selector to find the first available form element Scenario: When I instantiate a form widget with a root selector Then the widget should find the form with the supplied selector of "#form" Scenario: When I search for a nested option When I search for a nested option I should find it Scenario: When I select by value When I select an option by value Scenario: When I select by text When I select an option by text Scenario: Selecting with no selector When I try to select with no selector Scenario: Selecting with both selectors When I try to select with both selectors Scenario: Checking a checkbox When I click a checkbox Then the checkbox should be selected Scenario: Reading all fields of a form When I read all fields of a form I should see the results ================================================ FILE: test/integration/features/list.feature ================================================ Feature: Manipulating Lists Background: Given I view "list.html" Scenario: Getting items in a list Then I should see "6" items in a list Scenario: Getting itemClass dynamically Then I should get the alias "Iron Man" for the item with a super-hero class Scenario: Getting an item in a list Then I should see "geordi laforge" in position "4" of the list Then I should see html "
  • geordi laforge
  • " in position "4" of the list Scenario: Serializing items in a list Then I should see the following list: | data | | 7 of nine | | deanna troi | | geordi laforge | | John Crichton | | Tony Stark | Scenario: Filtering items in a list When I filter by "John" I should see "1" element Scenario: Finding the first matching element in a list When I find with "a" I should see "
  • data
  • " Scenario: Calling AT with a string When I call at with a string I should get an error Scenario: Getting length of a list When I call length I should receive 6 Scenario: Nested list lookup When I find the "span" within ".nested" I should see 3 items Scenario: Nested list lookup with additonal child lookup When I find the "3" child "span" within ".nested" and then I read the "p" I should see "protoss" Scenario: Reading at an index When I read at the "2" index of ul I should see "7 of nine" Scenario: Reading at an index with a transformer Given I should be able to read and transform a list item at an index Scenario: Reading at an index with a transformer and selector Given I should be able to read with a subselector and transform an item at an index Scenario: Reading at an index with selector When I read at the "2" child "span" within ".nested" inside "p" I should see "human" Scenario: Clicking on an index When I click on the "3" child of "ul" I should read "clicked" Scenario: Clicking at an index When I click at the "3" index of "ul" I should read "clicked" Scenario: Clicking at an index with selector When I click at the "5" index with selector "p" I should read "clicked" Scenario: Looping over items in a list with each When I click on each item in the list Then I should see that each list item was clicked Scenario: Invoking a method over the list with a string Given I can invoke click on each widget in the list Then I should see that each list item was clicked Scenario: Invoking a method over the list with a method Given I can invoke click on each widget in the list with a method Then I should see that each list item was clicked Scenario: Invoking a method over the list with arguments Given I can invoke read on each widget in the list with a transformer and selector Scenario: Visiblity on list items Given I can check the visibility on a list's items ================================================ FILE: test/integration/features/pending.feature ================================================ Feature: Environment Scenario: Check for pending method When I execute a step Then the step should have a pending method Scenario: Pending method pauses execution When I execute a step And I execute a pending step Then the following step should not execute Scenario: Check for Driver When I execute a step Then the environment should expose Driver ================================================ FILE: test/integration/features/readwidget.feature ================================================ Feature: Reading Widgets Background: When I view "sample.html" Scenario: Reading a flat element When I read the "h1" I should see "hello world" Scenario: Reading a flat element with a transformer When I read the "h1" with an all caps tranformer I should see "HELLO WORLD" Scenario: Reading a nested element When I find the "doge" element within ".wow" I should see "many money" Scenario: Reading attribute of element When I read the "width" attribute I should get "400px" Scenario: Reading attribute of element with selector When I read the "height" attribute of a nested element I should get "100" Scenario: Getting inner HTML When I get the innerHTML of ".wow" I should get "many money" Scenario: Getting outer HTML When I get the outerHTML of ".wow doge" I should get "many money" ================================================ FILE: test/integration/features/shorthand.feature ================================================ Feature: Shorthand Widget Methods Background: When I view "sample.html" Scenario: Click When I shorthand click an element Scenario: Fill When I shorthand fill an element Then I shorthand getValue the element Scenario: Hover When I shorthand hover an element Scenario: Double Click When I shorthand double click an element Scenario: isPresent When I shorthand isPresent an element Scenario: isVisible When I shorthand isVisible an element Scenario: getAttribute When I shorthand getAttribute an element Scenario: getText When I shorthand getText an element Scenario: getInnerHTML When I shorthand getInnerHTML an element Scenario: getOuterHTML When I shorthand getOuterHTML an element Scenario: hasClass When I shorthand call hasClass an element Scenario: sendKeys When I shorthand call hasClass an element Scenario: clear When I shorthand call clear an element ================================================ FILE: test/integration/features/simple.feature ================================================ Feature: Reading from the DOM Background: When I view "sample.html" Scenario: Filling an input box When I fill an input with "wow" I should get "wow" Scenario: Filling an input box with something invalid When I fill an input with nothing I should get an error Scenario: Calling Driver Visit When I call driver.visit Then the driver should get that URL ================================================ FILE: test/integration/features/widget.feature ================================================ Feature: Manipulating Widgets Background: When I view "sample.html" Scenario: Is Present When I see if "doge" is present within ".wow" I should get "true" Scenario: Is Not Present When I see if "dogey" is present within ".wow" I should get "false" Scenario: Is Visible When I see if ".wow" is visible I should get "true" Scenario: Is Visible with string syntax When I see if an element identified by a string is visible Scenario: Is Not Visible When I see if ".hidden" is visible I should get "false" Scenario: Is Visible on a non-present element When I see if ".suchwow" is visible I should get "false" Scenario: Sending Keys to element When I send "doge" to an element I should be able to read "doge" Scenario: Sending Keys with an object When I send keys to an element with an object I should be able to read them Scenario: Sending Keys with multiple arguments When I send keys to an element with multiple arguments I should be able to read them Scenario: Adding a class When I add class "foo" to ".wow" Then ".wow" should contain class "foo" Scenario: Adding a class with selector When I add class "foo" to "doge" in ".wow" Then "doge" should contain class "foo" Scenario: Removing a class When I remove class "doge" from ".hidden" Then ".hidden" should not contain class "doge" Scenario: Removing a class with selector When I remove class "inputbox" from "input" in "p" Then "input" should not contain class ".inputbox" Scenario: Toggling a class When I toggle class "doge" on ".hidden" Then ".hidden" should not contain class "doge" When I toggle class "doge" on ".hidden" Then ".hidden" should contain class "doge" Scenario: Toggling a class with selector When I toggle class "such" on "doge" in ".wow" Then "doge" should contain class "such" When I toggle class "such" on "doge" in ".wow" Then "doge" should not contain class "such" Scenario: Hovering over a element Given I should be able to hover over an element Scenario: Doubling clicking an element Given I should be able to double click an element Scenario: Clearing an input Given I should be able to clear an input Scenario: Finding all elements When I find all div elements in the body tag then I should get a list of them Scenario: Reading all elements When I find all dd on the page i should be able to read them all ================================================ FILE: test/integration/fixtures/form.html ================================================

    Formtastic

    Field1:
    Field2:
    ================================================ FILE: test/integration/fixtures/list.html ================================================
    • data
    • 7 of nine
    • deanna troi
    • geordi laforge
    • John Crichton

    • Tony Stark

    i am a headline

    orc

    human

    protoss

    ================================================ FILE: test/integration/fixtures/marionette.html ================================================ ================================================ FILE: test/integration/fixtures/sample.html ================================================

    hello world

    many money

    wormhole
    double me

    ok ok only on hover

    one
    two
    ================================================ FILE: test/integration/steps/find_steps.coffee ================================================ _ = require('lodash') expect = require("chai").expect module.exports = -> @When /^I eager find the "([^"]*)" element I should see "([^"]*)"$/, (selector, content) -> @Widget.find({ root: selector }).then (widget) -> widget.el.getText().should.eventually.equal(content) @When /^I retrieve text of the "([^"]*)" element I should get "([^"]*)"$/, (rootSelector, expected) -> new @Widget({ root: rootSelector }) .getText() .then (text) -> text.should.eql(expected) @When /^I retrieve text of the "([^"]*)" element as a child of "([^"]*)" I should get "([^"]*)"$/, (child, root, expected) -> new @Widget({ root: root }) .getText(child) .then (text) -> text.should.eql(expected) @Given /^I search for "([^"]*)" I should get "([^"]*)"$/, (search, found) -> new @Widget({ root: ".wow" }) .find({text: search}).then( (el) -> el.getText() ) .should.eventually.eql(found) ================================================ FILE: test/integration/steps/form_steps.coffee ================================================ _ = require('lodash') expect = require('chai').expect module.exports = -> world = this @Given /^I click submit$/, -> new this.Widgets.SimpleForm().submitForm() @Given /^I fill the field with default with something else$/, -> new @Widget({ root: "#field2" }) .fill({value: "doge"}) @Then /^I should only see something else$/, -> new @Widget({ root: "#field2" }) .getValue() .should.eventually.eql("doge") @Given /^I enter information and submit$/, -> form = new this.Widgets.SimpleForm() form.enter() @Then /^I should see "([^"]*)"$/, (text) -> div = new this.Widgets.Div() div.getText().should.eventually.eql(text) @Given /^I fill a form with:$/, (table) -> F = world.Widget.Form.extend({ root: 'form' fields: _.map(table.hashes(), "name") }) new F().submitWith(_.fromPairs(table.raw().slice(1))) @Then /^the widget should use the default form selector to find the first available form element$/, -> new @Widget.Form().getAttribute("class").should.eventually.eql("formula_1") @Then /^the widget should find the form with the supplied selector of "([^"]*)"$/, (selector) -> new @Widget.Form({root: selector}).getAttribute("id").should.eventually.eql("form") @When /^I search for a nested option I should find it$/, -> new @Widget({ root: "select" }).find("[value=\"wow3\"]").then (el) -> el.getText().then (val) -> val.should.eql("three") @When /^I select an option by value$/, -> _this = this new @Widget.Form({ root: "select" }) .select({value:"wow2"}).then -> new _this.Widget({ root: '#onClick' }) .read() .should.eventually.eql('two') @When /^I select an option by text$/, -> _this = this new @Widget.Form({ root: "select" }) .select({text:"three"}) .then -> new _this.Widget({ root: '#onClick' }) .read() .should.eventually.eql('three') @When /^I try to select with no selector$/, -> expect( => new @Widget.Form({ root: "select" }) .select() ).to.throw("You must provide something to select by.") @When /^I try to select with both selectors$/, -> expect( => new @Widget.Form({ root: "select" }) .select({ text: "three", value: "wow3"}) ).to.throw("You may only have one select by attribute") @When /^I read all fields of a form I should see the results$/, -> f = new @Widgets.SimpleForm() f.submitWith({ field1: "wow", field2: "such" }).then -> f.readAll().should.eventually.eql({ field1: "wow", field2: "such" }) @When /^I click a checkbox$/, -> @W.click('input[type="checkbox"]') @Then /^the checkbox should be selected$/, -> @W.find({root: 'input[type="checkbox"]'}) .then (widget) -> widget.el.isSelected() .should.eventually.eql(true) ================================================ FILE: test/integration/steps/helper_steps.coffee ================================================ Driver = require('selenium-webdriver') expect = require('chai').expect module.exports = -> @When /^I execute a step$/, -> @Then /^the step should have a pending method$/, -> expect(@Pending).to.exist @When /^I execute a pending step$/, -> @Pending() @Then /^the following step should not execute$/, -> throw new Error "this step should not execute" @Then /^the environment should expose Driver$/, -> expect(@Driver).to.equal(Driver) ================================================ FILE: test/integration/steps/list_steps.coffee ================================================ _ = require('lodash') expect = require('chai').expect module.exports = -> @Given /^I should see "([^"]*)" items in a list$/, (count) -> new @Widgets.List().items() .should.eventually.have.length(count) @Given /^I should get the identity "([^"]*)" for the item with a super-hero class$/, (identity)-> new @Widgets.List().items().then (items)-> for item in items item.getIdentity?() .should.eventually.equal(identity) @Given /^I should see "([^"]*)" in position "([^"]*)" of the list$/, (content, position) -> new @Widgets.List().at(+position-1) .then (item) -> item.find() .then (elm) -> elm.getText() .should.eventually.equal(content) @Given /^I should see html "([^"]*)" in position "([^"]*)" of the list$/, (content, position) -> new @Widgets.List().at(+position-1) .then (item) -> item.getHtml() .should.eventually.equal(content) @When /^I filter by "([^"]*)" I should see "([^"]*)" element$/, (string, count) -> new @Widgets.List().filterBy(string) .should.eventually.have.length(count) @Then /^I should see the following list:$/, (table) -> new @Widgets.List().toArray() .should.eventually.eql(_.flatten(table.raw())) @Then /^I should see stuff$/, (table) -> new @Widgets.List().toHtml() @When /^I find with "([^"]*)" I should see "([^"]*)"$/, (string, content) -> new @Widgets.List().findBy(string) .then (item) -> item.getHtml() .should.eventually.eql(content) @When /^I call length I should receive (\d+)$/, (expectedLength) -> new @Widgets.List().length() .should.eventually.eql(+expectedLength) @When /^I call at with a string I should get an error$/, -> expect( => new @Widgets.List().at("0") ) .to.throw("Argument must be a number. https://github.com/mojotech/pioneer/blob/master/docs/list.md#at") @When /^I find the "([^"]*)" within "([^"]*)" I should see (\d+) items$/, (itemSelector, root, count) -> new @Widgets.List({ root: root itemSelector: itemSelector }).items().should.eventually.have.length(+count) @When /^I find the "([^"]*)" child "([^"]*)" within "([^"]*)" and then I read the "([^"]*)" I should see "([^"]*)"$/, (index, itemSelector, root, childSelector, value) -> new @Widgets.List({ root: root itemSelector: itemSelector }) .at(+index-1) .then (child) -> child.read(childSelector).should.eventually.eql(value) @When /^I read at the "([^"]*)" index of ul I should see "([^"]*)"$/, (index, expected) -> new @Widgets.List() .readAt(+index-1) .should.eventually.eql(expected) @When /^I read at the "([^"]*)" child "([^"]*)" within "([^"]*)" inside "([^"]*)" I should see "([^"]*)"$/, (index, itemSelector, root, childSelector, expected) -> new @Widgets.List({ root: root itemSelector: itemSelector }) .readAt({ index: +index-1, selector: childSelector }) .should.eventually.eql(expected) @When /^I click on the "([^"]*)" child of "([^"]*)" I should read "([^"]*)"$/, (index, rootSelector, expected) -> _this = this new @Widgets.List({ root: rootSelector }) .at(index - 1) .then (item) -> item.click() .then -> new _this.Widget({ root: '#onSubmit' }) .read() .should.eventually.eql(expected) @When /^I click at the "([^"]*)" index of "([^"]*)" I should read "([^"]*)"$/, (index, selector, expected) -> _this = this new @Widgets.List({ root: selector }) .clickAt(index - 1) .then -> new _this.Widget({ root: '#onSubmit' }) .read() .should.eventually.eql(expected) @When /^I click at the "([^"]*)" index with selector "([^"]*)" I should read "([^"]*)"$/, (index, selector, expected) -> _this = this new @Widgets.List() .clickAt({ index: index - 1, selector: selector }) .then -> new _this.Widget({ root: '#onSubmit' }) .read() .should.eventually.eql(expected) @Given /^I should be able to read and transform a list item at an index$/, -> new @Widgets.List() .readAt({ index: 4, transformer: (val) -> val.toUpperCase() }) .should.eventually.eql("JOHN CRICHTON") @Given /^I should be able to read with a subselector and transform an item at an index$/, -> new @Widgets.List() .readAt({ index: 4, selector: "p", transformer: (val) -> val.toUpperCase() }) .should.eventually.eql("JOHN CRICHTON") @When /^I click on each item in the list$/, -> new @Widgets.List({root: "ul.click-list"}).clickEach() @Then /^I should see that each list item was clicked$/, -> new @Widgets.List({root: "ul.click-list"}).map((item) -> item.read() ).should.eventually.eql(["clicked", "clicked", "clicked"]) @Given /^I can invoke click on each widget in the list$/, -> new @Widgets.List({root: "ul.click-list"}).invoke('click') @Given /^I can invoke click on each widget in the list with a method$/, -> new @Widgets.List({root: "ul.click-list"}).invoke(@Widget::click) @Given /^I can invoke read on each widget in the list with a transformer and selector$/, -> new @Widgets.List({ root: ".nested", itemSelector: "span" }) .invoke({ method: "read", arguments: [{ transformer: (val) -> return val.toUpperCase() selector: "p" }] }).should.eventually.eql(["ORC", "HUMAN", "PROTOSS"]) @Given /^I can check the visibility on a list's items$/, -> new @Widgets.List({ root: ".nested", itemSelector: "span" }) .map (w) -> w.isVisible() .should.eventually .eql([true, true, true]) ================================================ FILE: test/integration/steps/read_steps.coffee ================================================ _ = require('lodash') expect = require("chai").expect module.exports = -> @When /^I read the "([^"]*)" I should see "([^"]*)"$/, (selector, content) -> new @Widget({ root: selector }) .read() .should.eventually.eql(content) @When /^I read the "([^"]*)" with an all caps tranformer I should see "([^"]*)"$/, (selector, content) -> new @Widget({ root: selector }) .read({ transformer: (str) -> str.toUpperCase() }) .should.eventually.eql(content) @When /^I find the "([^"]*)" element within "([^"]*)" I should see "([^"]*)"$/, (child, parent, content) -> base = new @Widget({ root: parent }) base.read(child) .should.eventually.eql(content) @When /^I read the "([^"]*)" attribute I should get "([^"]*)"$/, (attribute, expected) -> new @Widget({ root: ".wow" }) .getAttribute(attribute) .then (attr) -> attr.should.eql(expected) @When /^I read the "([^"]*)" attribute of a nested element I should get "([^"]*)"$/, (attr, expected) -> new @Widget({ root:".container" }).getAttribute({ selector: ".nested", attribute: attr }).should.eventually.eql(expected) @When /^I get the innerHTML of "([^"]*)" I should get "([^"]*)"$/, (rootSelector, expected) -> new @Widget({ root: rootSelector }) .getInnerHTML().then (html) -> html.trim().should.eql(expected) @When /^I get the outerHTML of "([^"]*)" I should get "([^"]*)"$/, (rootSelector, expected) -> new @Widget({ root: rootSelector }) .getOuterHTML().then (html) -> html.split('\n').map((string) -> string.trim() ) .join("").should.eql(expected) ================================================ FILE: test/integration/steps/shorthand.coffee ================================================ _ = require('lodash') module.exports = -> @When /^I shorthand double click an element$/, -> @W.doubleClick({ selector: '.double' }).then (w) -> w.read({selector: ".double"}).should.eventually.eql("wow such click") @When /^I shorthand hover an element$/, -> @W.hover({ selector: "h4" }).then (w) -> w.read({selector: "h4"}).should.eventually.eql("ok ok only on hover") @When /^I shorthand click an element$/, -> @W.click({selector: 'body'}) @When /^I shorthand fill an element$/, -> @W.fill({ selector: ".inputbox", value: "wow" }) @When /^I shorthand isPresent an element$/, -> @W.isPresent(".wow doge").should.eventually.eql(true) @When /^I shorthand isVisible an element$/, -> @W.isVisible({ selector: ".wow" }).should.eventually.eql(true) @When /^I shorthand getAttribute an element$/, -> @W.getAttribute({ attribute: "width", selector: ".wow" }).should.eventually.eql("400px") @When /^I shorthand getValue the element$/, -> @W.getValue({ selector: ".inputbox" }).should.eventually.eql("wow") @When /^I shorthand getText an element$/, -> @W.getText({ selector: "h1" }).should.eventually.eql("hello world") @When /^I shorthand getInnerHTML an element$/, -> @W.getInnerHTML({ selector: ".wow" }).then (html) -> html.trim() .should.eql("many money") @When /^I shorthand getOuterHTML an element$/, -> @W.getOuterHTML({ selector: ".wow doge" }).then (html) -> html.split('\n').map((string) -> string.trim() ) .join("") .should.eql("many money") @When /^I shorthand call hasClass an element$/, -> @W.hasClass({ selector: ".hidden", className: "doge" }).should.eventually.be.true @When /^I shorthand call sendKeys an element$/, -> @W.sendKeys({ selector: ".inputbox", keys: [ "dogecoins", Driver.Key.SPACE, "are", Driver.Key.SPACE, "worth", Driver.Key.SPACE, "alot" ] }).then => @getValue({ selector: ".inputbox" }).should.eventually.eql("dogecoins are worth alot") @When /^I shorthand call clear an element$/, -> new @W({ root: ".inputbox" }).sendKeys("pioneer is awesome man...").then => @W.clear({ selector: ".inputbox" }).then (widget) -> widget.getValue({selector: ".inputbox"}) .should.eventually.eql("") ================================================ FILE: test/integration/steps/steps.coffee ================================================ _ = require('lodash') expect = require("chai").expect module.exports = -> @When /^I fill an input with "([^"]*)" I should get "([^"]*)"$/, (write, read) -> new @Widget({ root: '.inputbox' }).fill(write) .then => @W.getValue({selector: ".inputbox"}).should.eventually.eql(read) @When /^I fill an input with nothing I should get an error$/, -> expect( => new @Widget({root: '.inputbox'}) .fill() ) .to.throw("You must pass a value to fill with. https://github.com/mojotech/pioneer/blob/master/docs/widget.md#fill") ================================================ FILE: test/integration/steps/util.coffee ================================================ _ = require('lodash') Path = require "path" fixturesBase = Path.resolve(__dirname, "../", "fixtures") module.exports = -> @When /^I view "([^"]*)"$/, (name) -> @driver.get("file:///"+ Path.join(fixturesBase, name)) @When /^I call driver.visit$/, -> @driver.visit("http://www.google.com/") @Then /^the driver should get that URL$/, -> @driver.getCurrentUrl() .should.eventually.contain("www.google.com") ================================================ FILE: test/integration/steps/widget_steps.coffee ================================================ _ = require('lodash') expect = require("chai").expect Driver = require('selenium-webdriver') module.exports = -> @When /^I see if "([^"]*)" is present within "([^"]*)" I should get "([^"]*)"$/, (child, root, isPresent) -> @Widget.find({ root: root }).then((widget) -> widget.isPresent(child) ) .then (present) -> expect(""+present).to.eql(isPresent) @When /^I see if "([^"]*)" is visible I should get "([^"]*)"$/, (selector,found) -> new @Widget({ root: selector }) .isVisible() .then (isFound) -> (isFound+"").should.eql(found) @When /^I see if an element identified by a string is visible$/, -> new @Widget({ root: ".wow" }) .isVisible("doge") .should.eventually.be.true @When /^I send "([^"]*)" to an element I should be able to read "([^"]*)"$/, (sent, read) -> w = new @Widget({ root: ".inputbox" }) w.sendKeys(sent) .then => new @Widget({ root: "p" }) .getValue(".inputbox").should.eventually.eql(read) @When /^I make sure inputbox is empty$/, -> new @Widget({root: ".inputbox"}).then (w) => w.find().then (el) -> el.clear() @Then /^I send keys to an element with an object I should be able to read them$/, -> w = new @Widget({ root: "p" }) w.sendKeys({ selector: ".inputbox", keys: [ "wow", Driver.Key.SPACE, "such", Driver.Key.SPACE, "send", Driver.Key.SPACE, "keys" ] }).then -> w.getValue({selector: ".inputbox"}) .should.eventually.eql("wow such send keys") @When /^I send keys to an element with multiple arguments I should be able to read them$/, -> new @Widget({ root: ".inputbox" }) .sendKeys("some", Driver.Key.SPACE, "important", Driver.Key.SPACE, "data") .then => @W.getValue({selector: ".inputbox"}) .should.eventually.eql("some important data") @When /^I add class "([^"]*)" to "([^"]*)"$/, (className, selector) -> new @Widget({ root: selector }) .addClass(className) @When /^I remove class "([^"]*)" from "([^"]*)"$/, (className, selector) -> new @Widget({ root: selector }) .removeClass(className) @When /^I toggle class "([^"]*)" on "([^"]*)"$/, (className, selector) -> new @Widget({ root: selector }) .toggleClass(className) @When /^I add class "([^"]*)" to "([^"]*)" in "([^"]*)"$/, (className, childSelector, selector) -> new @Widget({ root: selector }) .addClass({ selector: childSelector, className: className }) @When /^I remove class "([^"]*)" from "([^"]*)" in "([^"]*)"$/, (className, childSelector, selector) -> new @Widget({ root: selector }) .removeClass({ className: className, selector: childSelector }) @When /^I toggle class "([^"]*)" on "([^"]*)" in "([^"]*)"$/, (className, childSelector, selector) -> new @Widget({ root: selector }) .toggleClass({ className: className, selector: childSelector }) @Then /^"([^"]*)" should contain class "([^"]*)"$/, (selector, className) => widget = new @Widget({ root: selector }) .hasClass(className).should.eventually.be.true @Then /^"([^"]*)" should not contain class "([^"]*)"$/, (selector, className) => new @Widget({ root: selector }) .hasClass(className).should.eventually.be.false @Then /^"([^"]*)" should contain class "([^"]*)" in "([^"]*)"$/, (childSelector, className, selector) => widget = new @Widget({ root: selector }) .hasClass({ className: className selector: childSelector }).should.eventually.be.true @Then /^"([^"]*)" should not contain class "([^"]*)" in "([^"]*)"$/, (childSelector, className, selector) => widget = new @Widget({ root: selector }) .hasClass({ className: className selector: childSelector }).should.eventually.be.false @Given /^I should be able to hover over an element$/, -> new @W({ root: 'h4' }) .hover() .then (w) -> w.read() .should.eventually .eql("ok ok only on hover") @Given /^I should be able to double click an element$/, -> new @W({ root: '.double' }) .doubleClick() .then (w) -> w.read() .should.eventually .eql("wow such click") @Given /^I should be able to clear an input$/, -> w = new @W({ root: ".inputbox" }) w.sendKeys("filled with this").then => w.clear().then (widget) -> widget.getValue().should.eventually.eql("") @When /^I find all div elements in the body tag then I should get a list of them$/, -> new @Widget({ root: "body" }) .findAll("div") .should.eventually.be.an.instanceof(@W.List) @When /^I find all dd on the page i should be able to read them all$/, -> new @Widget({ root: "body" }) .findAll("dd") .then (list) -> list.invoke("read") .should.eventually.eql(["one", "two"]) ================================================ FILE: test/integration/widgets/div.coffee ================================================ module.exports = -> this.Widgets = this.Widgets || {} return this.Widgets.Div = this.Widget.extend root: "#onSubmit" getText: -> @find().then (el) -> el.getText() ================================================ FILE: test/integration/widgets/form.coffee ================================================ module.exports = -> this.Widgets = this.Widgets || {} return this.Widgets.SimpleForm = this.Widget.Form.extend root: '#form', fields: ["field1", "field2"] enter: -> @submitWith({field1: "myEmail@gmail.com"}) ================================================ FILE: test/integration/widgets/list.coffee ================================================ module.exports = -> @Widgets = @Widgets || {} @Widgets.List = @Widget.List.extend root: "ul" childSelector: "li" getItemClass: (el)-> el.getAttribute('class').then (className) => if className is 'super-hero' then @world.Widgets.ListItem else @itemClass clickEach: -> @each (item) -> item.click() toArray: -> @map (item) -> item.find().then (elm) -> elm.getText() filterBy: (string) -> @filter (item) -> item .find() .then (elm) -> elm.getText() .then (text) -> text.match(string) != null findBy: (string) -> @findWhere (item) -> item .find() .then (elm) -> elm.getText() .then (text) -> text.match(string) != null ================================================ FILE: test/integration/widgets/list_item.coffee ================================================ module.exports = -> this.Widgets = this.Widgets || {} return this.Widgets.ListItem = this.Widget.extend getIdentity: -> @getText().then (val) -> 'Iron Man' if val is 'Tony Stark' ================================================ FILE: test/mocha.opts ================================================ --reporter spec --require coffeescript/register ================================================ FILE: test/unit/bin.coffee ================================================ chai = require('chai') sinon = require("sinon") sinonChai = require("sinon-chai") chai.should() chai.use(sinonChai) Pioneer = require("../../lib/pioneer.js") describe "Pioneer Kickoff File", -> describe "isVersionRequested()", -> it "should return true when --version is passed", -> Pioneer::isVersionRequested({version: true}) .should.be.true it "should return true when -v is passed", -> Pioneer::isVersionRequested({v: true}) .should.be.true it "should return null when neither -v or --version is true", -> # expect(Pioneer::isVersionRequested({})) # .to.eql(undefined) describe "When Version is requested", -> beforeEach -> @sandbox = sinon.sandbox.create() @sandbox.stub(Pioneer.prototype, "isVersionRequested", -> true ) @sandbox.stub(Pioneer.prototype, "getSpecifications", -> true ) @consoleSpy = @sandbox.spy(console, 'log') afterEach -> @sandbox.restore() it "should log the current version", -> currentV = require('../../package').version new Pioneer("wow") @consoleSpy.should.have.been.calledWith(currentV); describe "isVerbose", -> describe "when only a command line value is passed", -> it "should treat true and 'true' as true", -> Pioneer::isVerbose({verbose: true}) .should.be.true Pioneer::isVerbose({verbose: "true"}) .should.be.true it "should treat missing or 'false' value as false", -> Pioneer::isVerbose({verbose: "false"}) .should.be.false Pioneer::isVerbose({}) .should.be.false describe "when only a config value is passed", -> it "should return true when passed a truthy value", -> Pioneer::isVerbose({}, {verbose: true}) .should.be.true it "should return false when passed a falsey value", -> Pioneer::isVerbose({}, {verbose: ""}) .should.be.false describe "when a config and command line value are passed", -> it "should defer to the command line value", -> Pioneer::isVerbose({verbose: true}, {verbose: false}) .should.be.true Pioneer::isVerbose({verbose: false}, {verbose: true}) .should.be.false ================================================ FILE: test/unit/config.coffee ================================================ chai = require('chai') sinon = require("sinon") sinonChai = require("sinon-chai") assert = require("assert") configBuilder = require('../../lib/config_builder') Pioneer = require('../../lib/pioneer.js') _ = require('lodash') path = require('path') fs = require('fs') rmdir = require('rimraf').sync CONFIG_NAMES = [ "tags", "feature", "require", "format", "error_formatter", "coffee", "driver", "preventReload", "scaffold" ] chai.should() chai.use(sinonChai) describe "Pioneer configuration", -> describe "parseAndValidateJSON()", -> beforeEach -> this.path = "wow" this.invalidJSON = "{\"someError\":\"JSON\"" this.validJSON = "{\"someobject\":\"that works\"}" it "should handle an invalid json object", -> assert.throws(( -> Pioneer::parseAndValidateJSON(this.invalidJSON, this.path)), Error, this.path + " does not include a valid JSON object" ) it "should handle a valid json object", -> Pioneer::parseAndValidateJSON(this.validJSON, this.path) .should.eql({ someobject: "that works" }) describe "configuration formatter", -> beforeEach -> process.argv = [] this.libPath = "wow" this.simpleConfig = [ { feature: 'test/integration/features' }, { require: [ 'test/integration/steps', 'test/integration/widgets' ] }, { format: 'pretty' }, { error_formatter: 'errorformat.js' }, { coffee: false }, { driver: 'phantomjs' }, { 'preventReload': true } ] this.multiTagConfig = [ { tags: ["@wow", "@doge"]} ] scaffoldStub = sinon.stub(configBuilder, "hasFeature", -> true) afterEach -> configBuilder.hasFeature.restore() it "should convertToExecOptions", -> configBuilder.convertToExecOptions(this.simpleConfig, this.libPath) .should.eql([ null null "--require" "wow/support" "test/integration/features" "--require" "test/integration/steps" "--require" "test/integration/widgets" "--format=pretty" "--error_formatter=errorformat.js" ]) process.argv.should.eql(["--driver=phantomjs", "--prevent-browser-reload"]) it "should convertToExecOptions with multiple tags", -> configBuilder.convertToExecOptions(this.multiTagConfig, this.libPath) .should.eql([null, null, "--require", "wow/support", "--tags=@wow, @doge"]) process.argv.should.eql([]) it "should push command line arguments for driver and reload", -> configBuilder.convertToExecOptions(this.simpleConfig, this.libPath) process.argv.should.eql(["--driver=phantomjs", "--prevent-browser-reload"]) describe "generating options", -> beforeEach -> stub = sinon.stub(configBuilder, "convertToExecOptions", (objArray, libPath) ->) afterEach -> configBuilder.convertToExecOptions.restore() it "should generate options with just commandline options", -> configBuilder.generateOptions({ driver:"pretty", require: ["that.js", "this.json", "totally.css"] feature:"test/integration/features" }, {}, this.libPath) configBuilder.convertToExecOptions .should.have.been .calledWith([ {feature: 'test/integration/features'}, {require: ["that.js", "this.json", "totally.css"]}, {driver: "pretty"} ]) it "should generate options with just config file options", -> configBuilder.generateOptions({ },{ tags:["@wow","@doge"], error_formatter: "such.js", require: ["that.js", "this.json", "totally.css"] }, this.libPath) configBuilder.convertToExecOptions .should.have.been .calledWith([ {tags: ['@wow','@doge']}, {require: ["that.js", "this.json", "totally.css"]}, {error_formatter: "such.js"} ]) it "should generate options with both config and commandline options", -> configBuilder.generateOptions({ coffee: true, driver: "phantomjs" },{ tags:["@wow","@doge"], error_formatter: "such.js", require: ["that.js", "this.json", "totally.css"] }, this.libPath) configBuilder.convertToExecOptions .should.have.been .calledWith([ {tags: ['@wow','@doge']}, {require: ["that.js", "this.json", "totally.css"]}, {error_formatter: "such.js"}, {coffee: true}, {driver: "phantomjs"} ]) it "should allow command line arguments to override config file arguments", -> configBuilder.generateOptions({ coffee: true, driver: "firefox", format: "pretty" },{ tags:["@wow","@doge"], driver: "chrome", require: ["that.js", "this.json", "totally.css"], coffee: false, format: "json" }, this.libPath) configBuilder.convertToExecOptions .should.have.been .calledWith([ {tags: ['@wow','@doge']}, {require: ["that.js", "this.json", "totally.css"]}, {format: "pretty"}, {coffee: true}, {driver: "firefox"} ]) it "should allow required files from both config file and commandline options", -> configBuilder.generateOptions({ require: ["wow.doge", "doge.script"] },{ require: ["that.js", "this.json", "totally.css"] }, this.libPath) configBuilder.convertToExecOptions .should.have.been .calledWith([ {require: ["wow.doge", "doge.script", "that.js", "this.json", "totally.css"]}, ]) describe "when no feature is specified", -> beforeEach -> this.libPath = "wow" execOptionsStub = sinon.stub(configBuilder, "convertToExecOptions", -> ) this.featureDir = path.join(process.cwd(), '/features') afterEach -> configBuilder.convertToExecOptions.restore() it "should not pass anything for features if the /features directory exists", -> fs.mkdirSync(this.featureDir) configBuilder.generateOptions({}, {}, this.libPath) configBuilder.convertToExecOptions .should.have.been .calledWith([]) rmdir(this.featureDir) it "should pass an unrecognized flag as the feature flag if theer is no /features directory", -> configBuilder.generateOptions({_:"such.doge"}, {}, this.libPath) configBuilder.convertToExecOptions .should.have.been .calledWith([ {feature: "such.doge"} ]) describe "preventReload flag", -> beforeEach -> this.libPath = "wow" process.argv = [] scaffoldStub = sinon.stub(configBuilder, "hasFeature", -> true) afterEach -> configBuilder.hasFeature.restore() it "should not prevent browser reload without any specifications" , -> configBuilder.generateOptions({}, {}, this.libPath) process.argv.should.eql([]) it "should not prevent browser reload when the config file specifies boolean false" , -> configBuilder.generateOptions({}, {"preventReload":false}, this.libPath) process.argv.should.eql([]) it "should not prevent browser reload when the config file specifies string false" , -> configBuilder.generateOptions({}, {"preventReload":"false"}, this.libPath) process.argv.should.eql([]) it "should not prevent browser reload when the config file specifies boolean true" , -> configBuilder.generateOptions({}, {"preventReload":true}, this.libPath) process.argv.should.eql(["--prevent-browser-reload"]) it "should not prevent browser reload when the config file specifies string true" , -> configBuilder.generateOptions({}, {"preventReload":"true"}, this.libPath) process.argv.should.eql(["--prevent-browser-reload"]) it "should prevent browser reload when specified on the commandline" , -> configBuilder.generateOptions({"preventReload": true}, {}, this.libPath) process.argv.should.eql(["--prevent-browser-reload"]) it "should prevent browser reload when specified on the commandline with string" , -> configBuilder.generateOptions({"preventReload": "true"}, {}, this.libPath) process.argv.should.eql(["--prevent-browser-reload"]) it "should not prevent browser reload when specified on the commandline" , -> configBuilder.generateOptions({"preventReload": false}, {}, this.libPath) process.argv.should.eql([]) it "should not prevent browser reload when specified on the commandline with string" , -> configBuilder.generateOptions({"preventReload": "false"}, {}, this.libPath) process.argv.should.eql([]) it "should prevent browser reload when specified on the commandline and false in config file" , -> configBuilder.generateOptions({"preventReload": true}, {"preventReload": false}, this.libPath) process.argv.should.eql(["--prevent-browser-reload"]) it "should not prevent browser reload when specified false on the commandline and true in config file" , -> configBuilder.generateOptions({"preventReload": false}, {"preventReload": true}, this.libPath) process.argv.should.eql([]) it "should only push the argument once when specified in both config and commandline", -> configBuilder.generateOptions({"preventReload": true}, {"preventReload": true}, this.libPath) process.argv.should.eql(["--prevent-browser-reload"]) describe "driver flag", -> beforeEach -> this.libPath = "wow" process.argv = [] scaffoldStub = sinon.stub(configBuilder, "hasFeature", -> true) afterEach -> configBuilder.hasFeature.restore() it "should not be included when not specified" , -> configBuilder.generateOptions({}, {}, this.libPath) process.argv.should.eql([]) it "should be included when specifed on the commandline" , -> configBuilder.generateOptions({"driver":"chrome"}, {}, this.libPath) process.argv.should.eql(["--driver=chrome"]) it "should be included when specifed on the commandline" , -> configBuilder.generateOptions({}, {"driver":"firefox"}, this.libPath) process.argv.should.eql(["--driver=firefox"]) it "should allow commandline to take precedence over config file", -> configBuilder.generateOptions({"driver":"phantomjs"}, {"driver":"firefox"}, this.libPath) process.argv.should.eql(["--driver=phantomjs"]) describe "coffee flag", -> beforeEach -> this.libPath = "wow" this.support = this.libPath + "/support" it "should pass --coffee when coffee is specified as true", -> configBuilder.convertToExecOptions([{"coffee": true}], this.libPath) .should.eql([ null, null, "--require", this.support, "--coffee" ]) it "should not pass --coffee when coffee is set to false in the config file", -> configBuilder.convertToExecOptions([{"coffee": false}], this.libPath) .should.eql([ null, null, "--require", this.support ]) it "should not pass --coffee when coffee is not specified anywhere", -> configBuilder.convertToExecOptions([{}], this.libPath) .should.eql([ null, null, "--require", this.support ]) describe "format flag", -> describe "isCucumberFormatter()", -> it "should recognize that pretty is a cucumber formatter", -> configBuilder.isCucumberFormatter("pretty").should.eql(true) it "should recognize that json is a cucumber formatter", -> configBuilder.isCucumberFormatter("json").should.eql(true) it "should recognize that progress is a cucumber formatter", -> configBuilder.isCucumberFormatter("progress").should.eql(true) it "should recognize that summary is a cucumber formatter", -> configBuilder.isCucumberFormatter("summary").should.eql(true) it "should recognize that pioneer is not a cucumber formatter", -> configBuilder.isCucumberFormatter("pioneer").should.eql(false) describe "custom formatter look ups", -> beforeEach -> this.libPath = "wow" this.formatterPath = path.join(process.cwd(), "testformatter.js") this.formatterContent = "wow such format" fs.writeFileSync(this.formatterPath, this.formatterContent) afterEach -> fs.unlinkSync(this.formatterPath) it "should recognize when I specify a file in my current working directory", -> configBuilder.convertToExecOptions([{ format: 'testformatter.js' }], this.libPath) .should.eql([ null, null, "--require", this.libPath + "/support", "--format=" + this.formatterPath, ]) it "should look in the lib directory if it doesn't exist in the current working directory", -> configBuilder.convertToExecOptions([{ format: 'superformatter.js' }], this.libPath) .should.eql([ null, null, "--require", this.libPath + "/support", "--format=" + path.join(this.libPath, 'superformatter.js'), ]) ================================================ FILE: test/unit/scaffold.coffee ================================================ sinon = require("sinon") assert = require("assert") _ = require('lodash') fs = require('fs') path = require('path') rmdir = require('rimraf').sync configBuilder = require('../../lib/config_builder') scaffoldBuilder = require('../../lib/scaffold_builder') describe "Scaffold Builder", -> beforeEach -> this.libPath = "wow" this.sandbox = sinon.sandbox.create() this.sandbox.stub(process, 'exit', ->) overwrite = this.sandbox.stub(scaffoldBuilder, "askToOverWrite", (file, data) -> fs.writeFileSync(file, data) ) afterEach -> this.sandbox.restore() it "should be called if no feature path is specified", -> scaffold = this.sandbox.stub(scaffoldBuilder, "featureNotSpecified", ->) noFeature = this.sandbox.stub(configBuilder, "hasFeature", -> false) configBuilder.generateOptions({ _: [] }, {}, this.libPath, ->) scaffold.callCount.should.eql(1) describe "hasFeature()", -> it "should return false when there is no feature file specified", -> configBuilder.hasFeature([{}]).should.eql(false) it "should return true with a feature file specified", -> configBuilder.hasFeature([{feature:"myFeatureFile"}]).should.eql(true) it "should return false with complicated options", -> configBuilder.hasFeature([{ tags: "@suchtag", require: ["file1", "file2", "file3"], coffe: true, error_formatter: "nice_errors.js" }]).should.eql(false) it "should return true with complicated options", -> configBuilder.hasFeature([{ feature: "featurefile", tags: "@suchtag", require: ["file1", "file2", "file3"], coffee: true, error_formatter: "nice_errors.js" }]).should.eql(true) describe "createScaffold()", -> beforeEach -> this.pioneerJSON = path.join(process.cwd(), '/pioneer.json') if(fs.existsSync(this.pioneerJSON)) this.format = fs.readFileSync(this.pioneerJSON) else this.format = null logs = this.sandbox.stub(scaffoldBuilder, "_logCompleted", -> ) if(fs.existsSync(this.pioneerJSON)) fs.unlinkSync(this.pioneerJSON) scaffoldBuilder.createScaffold() afterEach -> rmdir(path.join(process.cwd(), '/tests'), (error)->) scaffoldBuilder.askToOverWrite.restore() if(this.format) fs.writeFileSync(this.pioneerJSON, this.format) else fs.unlinkSync(path.join(process.cwd(), '/pioneer.json')) it "should create a tests/ directory", -> fs.existsSync(path.join(process.cwd(), '/tests')).should.be.true it "should create a features/ directory", -> fs.existsSync(path.join(process.cwd(), '/tests/features')).should.be.true it "should create a fixtures/ directory", -> fs.existsSync(path.join(process.cwd(), '/tests/fixtures')).should.be.true it "should create a steps/ directory", -> fs.existsSync(path.join(process.cwd(), '/tests/steps')).should.be.true it "should create a simple feature", -> fs.existsSync(path.join(process.cwd(), '/tests/features/simple.feature')).should.be.true it "should create simple stpes", -> fs.existsSync(path.join(process.cwd(), '/tests/steps/simple.js')).should.be.true it "should create a pioneer.json file if one doesn't exist", -> fs.existsSync(this.pioneerJSON).should.be.true ================================================ FILE: test/unit/widget.coffee ================================================ promise = require("bluebird") sinon = require("sinon") assert = require("assert") ROOT = driver: wait: -> promise.resolve() findElement: -> promise.resolve("fake element") require("../../lib/environment").call(ROOT) require("../../lib/support/widgets").call(ROOT) describe "widgets", -> describe "root should be overideable", -> before -> this.OptionWidget = new ROOT.Widget( root: "div" ) this.ExtendWidget = new (ROOT.Widget.extend({ root: "wow" })) it "should persit when passed via the constructor", -> assert.equal(this.OptionWidget.root, "div") it "should persit when passed via an extend", -> assert.equal(this.ExtendWidget.root, "wow") describe "initialize should be overideable", -> beforeEach -> this.spy = sinon.spy() it "should work when defined as a constructor arg", -> new ROOT.Widget initialize: this.spy assert(this.spy.called, true) it "should work when defined using the extend syntax", -> new (ROOT.Widget.extend initialize: this.spy ) assert(this.spy.called, true) describe "find based constructor", -> it "should return a thenable interface", -> assert.notEqual(ROOT.Widget.find(root: "body").then, undefined) it "should set the el property", -> ROOT.Widget.find(root: "body").then (widget) -> assert.notEqual(widget.el, undefined) it "should set attributes based on find args", -> ROOT.Widget.find(root: "body").then (widget) -> widget.root.should.eql("body")