├── .eslintrc.json ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── docs ├── ISSUE_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE.md └── commandoptions.txt ├── features ├── .gitkeep ├── ClickWhenActiveTest.feature ├── cat.feature ├── dog.feature └── uploadFileTest.feature ├── hooks.ts ├── lib ├── base.feature ├── base.steps.ts ├── core │ └── variableOperations.ts ├── domain │ ├── ICommonVariable.ts │ ├── IIntVariable.ts │ ├── IStringVariable.ts │ ├── Ihooks.ts │ ├── elementObject.ts │ ├── repoElement.ts │ ├── variableObject.ts │ └── variableType.ts └── services │ ├── element.service.ts │ └── variable.service.ts ├── package-lock.json ├── package.json ├── protractor.ci.conf.js ├── protractor.conf.js ├── reports └── .gitkeep ├── repository └── google.rep.csv ├── results └── reports │ └── .gitkeep ├── tsconfig.json └── tslint.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb-base" 3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | .vscode 60 | 61 | reports/* 62 | !reports/.gitkeep 63 | results/reports/* 64 | !results/reports/.gitkeep 65 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at surenr@99x.lk. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to DynamoDB Data Transform 2 | 3 | First off, thanks for taking the time to contribute! 4 | 5 | The following is a set of guidelines for contributing to 99x Technology and its appications, which are hosted in the [99X Technology](https://github.com/99xt) on GitHub. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. 6 | 7 | ## How Can I Contribute? 8 | 9 | ### Reporting Bugs 10 | 11 | This section guides you through submitting a bug report for this application. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. 12 | 13 | 14 | > **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. 15 | 16 | #### How Do I Submit A (Good) Bug Report? 17 | 18 | Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). After you've determined where your bug is related to, create an issue on that repository and provide the following information by filling in [the template](ISSUE_TEMPLATE.md). 19 | 20 | Explain the problem and include additional details to help maintainers reproduce the problem: 21 | 22 | * **Use a clear and descriptive title** for the issue to identify the problem. 23 | * **Describe the exact steps which reproduce the problem** in as many details as possible. 24 | * **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines). 25 | * **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. 26 | * **Explain which behavior you expected to see instead and why.** 27 | * **Include screenshots and animated GIFs** which show you the described steps and clearly demonstrate the problem. 28 | 29 | ### Suggesting Enhancements 30 | 31 | This section guides you through submitting an enhancement suggestion for this application, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion :pencil: and find related suggestions :mag_right:. 32 | 33 | #### How Do I Submit A (Good) Enhancement Suggestion? 34 | 35 | Enhancement suggestions are tracked as [GitHub issues](https://guides.github.com/features/issues/). After you've determined where your enhancement suggestion is related to, create an issue on that repository and provide the following information: 36 | 37 | * **Use a clear and descriptive title** for the issue to identify the suggestion. 38 | * **Provide a step-by-step description of the suggested enhancement** in as many details as possible. 39 | * **Provide specific examples to demonstrate the steps**. Include copy/pasteable snippets which you use in those examples, as [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines). 40 | * **Describe the current behavior** and **explain which behavior you expected to see instead** and why. 41 | * **Explain why this enhancement would be useful** 42 | 43 | #### Local development 44 | 45 | All packages can be developed locally. 46 | 47 | ``` 48 | $ git clone url-to-git-repository 49 | $ cd path-to-package/ 50 | ``` 51 | 52 | ### Pull Requests 53 | 54 | * Fill in [the required template](PULL_REQUEST_TEMPLATE.md) 55 | * Do not include issue numbers in the PR title 56 | * Include screenshots and animated GIFs in your pull request whenever possible. 57 | 58 | ## Styleguides 59 | 60 | ### Git Commit Messages 61 | 62 | * Use the present tense ("Add feature" not "Added feature") 63 | * Use the imperative mood ("Move cursor to..." not "Moves cursor to...") 64 | * Limit the first line to 72 characters or less 65 | * Reference issues and pull requests liberally after the first line 66 | * When only changing documentation, include `[ci skip]` in the commit description 67 | * Consider starting the commit message with an applicable emoji: 68 | * :art: `:art:` when improving the format/structure of the code 69 | * :racehorse: `:racehorse:` when improving performance 70 | * :non-potable_water: `:non-potable_water:` when plugging memory leaks 71 | * :memo: `:memo:` when writing docs 72 | * :penguin: `:penguin:` when fixing something on Linux 73 | * :apple: `:apple:` when fixing something on macOS 74 | * :checkered_flag: `:checkered_flag:` when fixing something on Windows 75 | * :bug: `:bug:` when fixing a bug 76 | * :fire: `:fire:` when removing code or files 77 | * :green_heart: `:green_heart:` when fixing the CI build 78 | * :white_check_mark: `:white_check_mark:` when adding tests 79 | * :lock: `:lock:` when dealing with security 80 | * :arrow_up: `:arrow_up:` when upgrading dependencies 81 | * :arrow_down: `:arrow_down:` when downgrading dependencies 82 | * :shirt: `:shirt:` when removing linter warnings 83 | 84 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 99X Technology 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodeSpecJS 2 | Welcome to the CodeSpecJS. A Protractor and Cucumber.JS based framework that allow users to write UI Automation Tests without writing a single line of code. 3 | 4 | Gherkin grammar is very popular among many BDD frameworks. CodeSpecJS is targeting to take it to the next level by eliminating the need to write code associated with the Gherkin grammar. 5 | 6 | ## Key Feature 7 | * Zero code UI Test Automation. I.e. You will not write a single line of code to define your tests. you will be using a set of well defined Gherkin grammar to define your tests. Having no code to write provide some unique advantages 8 | * Learning curve to implement UI Automation tests is minimized. 9 | * Not depended on any specific programing language. CodeSpecJS grammar is written in pure english. Any one can understand it. 10 | * No need to maintain test code bases, because with CodeSpecJS, there's none. 11 | * Time taken to write tests are reduced drastically. 12 | * No need to worry about inner workings of underline frameworks, As developers/testers, we just need to concentrate about test logic. 13 | * Real quick startup time. You can write your first UI Automation test within minutes 14 | 15 | * Since all test are using Gherkin to define them, they are easy to write and well understood by all parties (i.e. stake holders, developers, testers etc.) 16 | * You will be able to map real agile story definitions directly to CodeSpecJS tests since both use almost the same specification structure 17 | * Provide grammar to support for all the necessary UI Automation Actions 18 | * [URL Navigation](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#url-navigation) 19 | * [Clicking on UI Elements](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#click-on-ui-elements) 20 | * [Verifying content of UI Elements](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#verify-ui-element-content) 21 | * [Waiting for UI elements to appear](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#wait-for-an-ui-element-to-appear-or-to-show-a-given-content) 22 | * [Waiting for UI elements to show a specific content](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#wait-for-an-ui-element-to-appear-or-to-show-a-given-content) 23 | * [Wait a given number of seconds for application to complete its tasks](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#wait-for-an-ui-element-to-appear-or-to-show-a-given-content) 24 | * [Working with html select drop down lists](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#select-drop-down-lists) 25 | * [Working with Popup windows](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#working-with-popup-windows-and-iframes) 26 | * [Working with iframes](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#working-with-popup-windows-and-iframes) 27 | * [Working with Alert Message Dialogs ](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#working-with-alertsconfirmation-and-prompt-dialogs) 28 | * [Working with Prompt Dialogs](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#working-with-alertsconfirmation-and-prompt-dialogs) 29 | * [Drag and Drop UI elements](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar#drag-and-drop-items) 30 | 31 | 32 | ## Getting Started 33 | ### Step 1: Setting up the development environment 34 | 35 | 1. You need to install [ NodeJs with NPM ](https://nodejs.org/en/). You'll also need to install and configure [ Git ](https://git-scm.com/). 36 | 2. Latest version of Chrome 37 | 38 | ### Step 2: Clone the project 39 | ``` 40 | git clone https://github.com/99xt/CodeSpecJS.git 41 | ``` 42 | ### Step 3: Install node packages 43 | Step inside the project root folder and issue the following command to install node dependencies. 44 | ``` 45 | npm install 46 | ``` 47 | 48 | ### Step 4: Open sample tests 49 | use VS Code to open the project 50 | ``` 51 | code . 52 | ``` 53 | now navigate to 'features' folder and open 'cat.feature' file see the readable test case 54 | ``` 55 | Feature: As a user I want to test google search so that I can search for Cats 56 | Scenario: Search google for cats 57 | Given Navigate to "http://www.google.com" 58 | And Wait for "Google Main Search Text Box" to appear 59 | Then I enter "Cats" to the "Google Main Search Text Box" 60 | And Click on "Search Button" 61 | And Wait for "Second Result Element Cats" to contain text "Cats" 62 | ``` 63 | 64 | * This is a standard [Cucumber](https://cucumber.io/) feature specification file. 65 | * We are using CodeSpecJS pre-defined grammar to write the test above. A full set of Supported grammar with detail description can be found [here](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar) 66 | 67 | Thats it, you are now ready to run the test. 68 | 69 | ### Step 5: Running the test 70 | Inside the project root folder, issue the following command 71 | ``` 72 | npm run test 73 | ``` 74 | **Note that first time execution may take few minutes since system need to download browser drivers and configure them** 75 | You should see your test executed in Chrome browser, Results will be shown in your console log. A detailed HTML report is generated under 76 | \/results/reports. Open the html report and see the detailed results. 77 | 78 | Where to go from here? 79 | 1. [Improve the tests you wrote here by learning how to integrate an Object Repository](https://github.com/99xt/CodeSpecJS/wiki/Creating-an-Object-Repository) 80 | 2. [See what are the other pre-defined CodeSpecJS grammar you can use in your tests and experiment with them](https://github.com/99xt/CodeSpecJS/wiki/CodeSpecJS-Supported-Grammar) 81 | 3. [Learn how to integrate your test project with Jenkins (a proven Continuos Integration environment )](https://github.com/99xt/CodeSpecJS/wiki/Configuring-Jenkins-Environment) 82 | 4. [Improve your productivity even more by configuring your IDE to auto complete CodeSpecJs Grammar](https://github.com/99xt/CodeSpecJS/wiki/Configuring-IDE-Autocomplete-for-CodeSpecJS-Grammar) -------------------------------------------------------------------------------- /docs/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | **Actual Behaviour** 2 | 3 | Please state here what is currently happening. 4 | 5 | **Expected Behaviour** 6 | 7 | State here what the feature should enable the user to do. 8 | 9 | **Steps to reproduce it** 10 | 11 | Add steps to reproduce bugs or add information on the place where the feature should be implemented. Add links to a sample deployment or code. 12 | 13 | **LogCat for the issue** 14 | 15 | Provide logs for the crash here 16 | 17 | **Screenshots of the issue** 18 | 19 | Where-ever possible attach a screenshot of the issue. 20 | 21 | **Would you like to work on the issue?** 22 | 23 | Please let us know if you can work on it or the issue should be assigned to someone else. 24 | -------------------------------------------------------------------------------- /docs/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Fixes issue #[Add issue number here. If you do not solve the issue entirely, please change the message e.g. "First steps for issues #IssueNumber] 2 | 3 | Changes: [Add here what changes were made in this issue and if possible provide links.] 4 | 5 | Demo Link: [Add here the link where your changes can be seen] 6 | 7 | Screenshots for the change: 8 | -------------------------------------------------------------------------------- /docs/commandoptions.txt: -------------------------------------------------------------------------------- 1 | npm run test -- --specs=features/google.feature --cucumberOpts.name='Search for Cats' --cucumberOpts.name='Search for Dogs' -------------------------------------------------------------------------------- /features/.gitkeep: -------------------------------------------------------------------------------- 1 | #This file will ensure reports folder is committed -------------------------------------------------------------------------------- /features/ClickWhenActiveTest.feature: -------------------------------------------------------------------------------- 1 | Feature: I want to click on a button only when it is enabled and visible 2 | Scenario: Is button active Test 3 | Given navigate to "https://jsfiddle.net/nivedithak/bLbqb482/7/" 4 | And Wait for "iframe" with the "xpath" of "//*[@id='result']/iframe" to appear 5 | Then Switch to iframe "iframe" with the "xpath" of "//*[@id='result']/iframe" 6 | Then Click on "button" with the "id" of "Button" when active 7 | And Wait for "3" seconds 8 | Then Accept the confirmation alert 9 | And Wait for "2" seconds -------------------------------------------------------------------------------- /features/cat.feature: -------------------------------------------------------------------------------- 1 | Feature: As a user I want to test google search so that I can search for Cats 2 | Scenario: Search google for cats 3 | Given Navigate to "http://www.google.com" 4 | And Wait for "Google Main Search Text Box" to appear 5 | Then I enter "Cats" to the "Google Main Search Text Box" 6 | And Click on "Search Button" 7 | And Wait for "Second Result Element Cats" to contain text "Cats" 8 | -------------------------------------------------------------------------------- /features/dog.feature: -------------------------------------------------------------------------------- 1 | Feature: As a user I want to test google search so that I can search for Dogs 2 | Scenario: Search google for Dogs 3 | Given Navigate to "http://www.google.com" 4 | And Wait for "Google Main Search Text Box" to appear 5 | Then I enter "Dogs" to the "Google Main Search Text Box" 6 | And Click on "Search Button" 7 | And Wait for "Second Result Element Dogs" to contain text "Dog" -------------------------------------------------------------------------------- /features/uploadFileTest.feature: -------------------------------------------------------------------------------- 1 | Feature: I want test uploading a file 2 | Scenario: upload image test 1 3 | Given Navigate to "https://www.jqueryscript.net/demo/Image-Upload-Preview-Plugin-With-jQuery-Bootstrap-img-upload/" 4 | Then I Upload "C:\Users\NIvedithaK\Desktop\doggie.jpg" to "uploadbutton" with the "xpath" of "/html/body/div[2]/form/div/div/div[2]/div/span[1]/input" 5 | Then Wait for "3" seconds 6 | 7 | Scenario: upload image test 2 8 | Given Navigate to "http://talkerscode.com/webtricks/demo/demo_preview-image-before-upload-using-javascript.php" 9 | Then Wait for "Choose Button" with the "xpath" of "//*[@id='wrapper']/input" to appear 10 | When I Upload "C:\Users\NIvedithaK\Documents\Deathstar.png" to "Choose File" with the "xpath" of "//*[@id='wrapper']/input" 11 | When Wait for "3" seconds 12 | -------------------------------------------------------------------------------- /hooks.ts: -------------------------------------------------------------------------------- 1 | import { IHooks } from "./lib/domain/ihooks"; 2 | 3 | export class Hooks implements IHooks { 4 | beforeScenario(): void { 5 | console.log('Execute this code before each scenario'); 6 | } 7 | afterScenario(): void { 8 | console.log('Execute this code after each scenario'); 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /lib/base.feature: -------------------------------------------------------------------------------- 1 | Feature: Base pre-build scenarios for UI Automation 2 | As a Developer I want to list down all the possible steps so that intellisence can capture it 3 | 4 | Scenario: Protractor and cucumber Test 5 | When Navigate to "" 6 | 7 | When I enter "" to the "" with the "" of "" 8 | When I enter "" 9 | 10 | When Click on "" with the "" of "" 11 | When Click on "" 12 | 13 | When The content of "" with the "" of "" has text "" 14 | When The content of "" has text "" 15 | When Element "" contains text "" 16 | 17 | When Wait for "" to appear 18 | When Wait for "" with the "" of "" to appear 19 | When Wait for "" to contain text "" 20 | When Wait for "" with the "" of "" to contain text "" 21 | When Wait for "" seconds 22 | 23 | When Switch to main frame 24 | When Switch to iframe "" 25 | When Switch to iframe "" with the "" of "" 26 | When Switch to popup window "" 27 | 28 | When Select value "" from "" 29 | When Select value "" from "" with the "" of "" 30 | 31 | When Accept the confirmation alert 32 | When The alert message says "" 33 | When I Dismiss the confirm dialog 34 | When I Accept the confirm dialog 35 | When I enter "" into prompt 36 | When I drag "" and drop on to "" 37 | When I drag "" with the "" of "" and drop on to "" with the "" of "" 38 | 39 | When I read the content of element "" with the "" of "" and store in variable "" as a "" 40 | When I read the content of element "" and store in variable "" as a "" 41 | When I store the value "" in variable "" as a "" 42 | When The value in variable "" of type "" equals to "" 43 | When The value in variable "" of type "" equals to variable "" 44 | When I Add variable "" to "" and store in "" 45 | When I Subtract variable "" from "" and store in "" 46 | When I Multiply variable "" from "" and store in "" 47 | When I Divide variable "" from "" and store in "" 48 | When I populate "" with the "" of "" with the value of variable "" of type "" 49 | When I populate "" with the value of variable "" of type "" 50 | 51 | When I Upload "" to "" with the "" of "" 52 | When I Upload "" to "" 53 | 54 | When Click on "" with the "" of "" when active 55 | When Click on "" when active -------------------------------------------------------------------------------- /lib/base.steps.ts: -------------------------------------------------------------------------------- 1 | import { before, after, binding, when, then, given } from 'cucumber-tsflow'; 2 | import { 3 | browser, 4 | element, 5 | by, 6 | ElementFinder, 7 | ExpectedConditions 8 | } from 'protractor'; 9 | import { ElementService } from './services/element.service'; 10 | import { VariableService } from './services/variable.service'; 11 | import { VariableType } from './domain/variableType'; 12 | import { ICommonVariable } from './domain/ICommonVariable'; 13 | import { IHooks } from './domain/Ihooks'; 14 | import { Hooks } from '../hooks'; 15 | let chai = require('chai').use(require('chai-as-promised')); 16 | let expect = chai.expect; 17 | let assert = chai.assert; 18 | 19 | @binding() 20 | class BaseSteps { 21 | elementService: ElementService; 22 | variableService: VariableService; 23 | lifeCycleHooks: IHooks; 24 | defaultElementTimeout: number; 25 | constructor() { 26 | this.elementService = ElementService.GetInstance(); 27 | this.variableService = VariableService.GetInstance(); 28 | this.lifeCycleHooks = new Hooks(); 29 | this.defaultElementTimeout = 10000; 30 | } 31 | 32 | 33 | @before() 34 | public beforeEveryScenarios(): void { 35 | this.lifeCycleHooks.beforeScenario(); 36 | } 37 | 38 | @after() 39 | public afterEveryScenario(): void { 40 | this.lifeCycleHooks.afterScenario(); 41 | } 42 | // @after() 43 | // public afterAllScenarios(scenario): void { 44 | // if (scenario.status === 'failed') { 45 | // let world = this; 46 | // browser.takeScreenshot().then(function (png) { 47 | // var decodedImage = new Buffer(png.replace(/^data:image\/(png|gif|jpeg);base64,/, ''), 'base64'); 48 | 49 | // ScenarioContext.attach(decodedImage, 'image/png'); 50 | // }); 51 | // } 52 | // } 53 | 54 | private getWebElement( 55 | elementKey: string, 56 | selectionMethod: string, 57 | selectionValue: string 58 | ): ElementFinder { 59 | if (selectionMethod && selectionValue) { 60 | let webElement = element( 61 | this.elementService.getElementSource(selectionMethod, selectionValue) 62 | ); 63 | if (!webElement) 64 | throw new Error( 65 | 'Element "' + 66 | elementKey + 67 | '" not found in dom. Selection Method: "' + 68 | selectionMethod + 69 | '", Selection Value: "' + 70 | selectionValue + 71 | '"' 72 | ); 73 | this.elementService.addNewElement(elementKey, webElement); 74 | return webElement; 75 | } else { 76 | let webElement = this.elementService.getElementByKey(elementKey); 77 | if (!webElement) 78 | throw new Error( 79 | 'Element "' + elementKey + '" not found in object repository.' 80 | ); 81 | return webElement; 82 | } 83 | } 84 | 85 | @given(/^[I|i] navigate to "([^"]*)"$/, null, 160 * 1000) 86 | @given(/[N|n]avigate to "([^"]*)"$/, null, 160 * 1000) 87 | public navigateToUrl(url: string): void { 88 | return assert.eventually.equal( 89 | browser.get(url).then( 90 | () => { 91 | return url; 92 | }, 93 | (error: any) => { 94 | throw new Error(error.message); 95 | } 96 | ), 97 | url, 98 | 'Navigated to the wrong url.' 99 | ); 100 | } 101 | 102 | @given(/^[E|e]nter "([^"]*)" to the "([^"]*)"$/, null, 60 * 1000) 103 | @given(/^[I|i] enter "([^"]*)" to the "([^"]*)"$/, null, 60 * 1000) 104 | public enterTextToElement(inputValue: string, elementKey: string) { 105 | this.enterTextToElementWithSelectionMethod( 106 | inputValue, 107 | elementKey, 108 | null, 109 | null 110 | ); 111 | } 112 | 113 | @given( 114 | /^I enter "([^"]*)" to the "([^"]*)" with the "([^"]*)" of "([^"]*)"$/, 115 | null, 116 | 60 * 1000 117 | ) 118 | public enterTextToElementWithSelectionMethod( 119 | inputValue: string, 120 | elementKey: string, 121 | selectionMethod: string, 122 | selectionValue: string 123 | ) { 124 | let inputElement = this.getWebElement( 125 | elementKey, 126 | selectionMethod, 127 | selectionValue 128 | ); 129 | 130 | return assert.eventually.equal( 131 | inputElement.sendKeys(inputValue).then( 132 | () => { 133 | return true; 134 | }, 135 | (error: any) => { 136 | throw new Error(error.message); 137 | } 138 | ), 139 | true, 140 | 'This had better be true, eventually' 141 | ); 142 | } 143 | 144 | @given(/^Click on "([^"]*)"$/, null, 60 * 1000) 145 | public clickOnElement(elementKey) { 146 | this.clickOnElementWithSelectionMethod(elementKey, null, null); 147 | } 148 | 149 | @given( 150 | /^Click on "([^"]*)" with the "([^"]*)" of "([^"]*)"$/, 151 | null, 152 | 60 * 1000 153 | ) 154 | public clickOnElementWithSelectionMethod( 155 | elementKey, 156 | selectionMethod, 157 | selectionValue 158 | ) { 159 | let elementToClick = this.getWebElement( 160 | elementKey, 161 | selectionMethod, 162 | selectionValue 163 | ); 164 | return assert.eventually.equal( 165 | elementToClick.click().then( 166 | () => { 167 | console.log("now clicked button") 168 | return true; 169 | }, 170 | (error: any) => { 171 | throw new Error(error.message); 172 | } 173 | ), 174 | true, 175 | 'Element "' + elementKey + '" click failed' 176 | ); 177 | } 178 | 179 | @given(/^Wait for "([^"]*)" seconds$/, null, 60 * 1000) 180 | public waitForGivenSeconds(seconds): void { 181 | let waitMils = parseInt(seconds) * 1000; 182 | return assert.eventually.equal( 183 | browser.driver.sleep(waitMils).then( 184 | () => { 185 | return waitMils; 186 | }, 187 | (error: any) => { 188 | throw new Error(error.message); 189 | } 190 | ), 191 | waitMils, 192 | 'Operation failed.' 193 | ); 194 | } 195 | 196 | @given(/^The content of "([^"]*)" has text "([^"]*)"$/, null, 60 * 1000) 197 | public verifyElementText(elementKey, expectedText) { 198 | return this.verifyElementTextWithSelectionMethod( 199 | elementKey, 200 | null, 201 | null, 202 | expectedText 203 | ); 204 | } 205 | 206 | @given( 207 | /^The content of "([^"]*)" with the "([^"]*)" of "([^"]*)" has text "([^"]*)"$/, 208 | null, 209 | 60 * 1000 210 | ) 211 | public verifyElementTextWithSelectionMethod( 212 | elementKey: string, 213 | selectionMethod: string, 214 | selectionValue: string, 215 | expectedText: string 216 | ) { 217 | let elementToVerify = this.getWebElement( 218 | elementKey, 219 | selectionMethod, 220 | selectionValue 221 | ); 222 | return expect(elementToVerify.getText()).to.eventually.equal(expectedText); 223 | } 224 | 225 | @given(/^Element "([^"]*)" contains text "([^"]*)"$/, null, 60 * 1000) 226 | public assertElementContainText(elementKey: string, targetText: string) { 227 | let element = this.getWebElement(elementKey, null, null); 228 | return expect(element.getText()).to.eventually.equal(targetText); 229 | } 230 | 231 | @given(/^Switch to popup window "([^"]*)"$/, null, 60 * 1000) 232 | public switchWindowOrTab(windowOrTabIndex: string) { 233 | let index = parseInt(windowOrTabIndex); 234 | if (isNaN(index)) throw new Error('Window or tab index should be a number'); 235 | // // browser.ignoreSynchronization = true; 236 | // browser.waitForAngular(); 237 | // browser.sleep(500); 238 | 239 | browser.driver.getAllWindowHandles().then(function (handles) { 240 | return assert.eventually.equal( 241 | browser.driver 242 | .switchTo() 243 | .window(handles[index]) 244 | .then( 245 | () => { 246 | // browser.ignoreSynchronization = false; 247 | return index; 248 | }, 249 | (error: any) => { 250 | throw new Error(error.message); 251 | } 252 | ), 253 | index, 254 | 'Operation failed.' 255 | ); 256 | }, 257 | (error: any) => { 258 | throw new Error(error.message); 259 | }); 260 | } 261 | 262 | @given(/^Switch to iframe "([^"]*)"$/, null, 60 * 1000) 263 | public switchToIframe(elementKey) { 264 | return this.switchToIframeWithSelection(elementKey, null, null); 265 | } 266 | 267 | @given( 268 | /^Switch to iframe "([^"]*)" with the "([^"]*)" of "([^"]*)"$/, 269 | null, 270 | 60 * 1000 271 | ) 272 | public switchToIframeWithSelection( 273 | elementKey, 274 | selectionMethod, 275 | selectionValue 276 | ) { 277 | let iframeToSwitch = this.getWebElement( 278 | elementKey, 279 | selectionMethod, 280 | selectionValue 281 | ); 282 | // browser.ignoreSynchronization = true; 283 | return assert.eventually.equal( 284 | browser.driver 285 | .switchTo() 286 | .frame(iframeToSwitch.getWebElement()) 287 | .then( 288 | () => { 289 | // browser.ignoreSynchronization = false; 290 | return elementKey; 291 | }, 292 | (error: any) => { 293 | // browser.ignoreSynchronization = false; 294 | throw new Error(error.message); 295 | } 296 | ), 297 | elementKey, 298 | 'Operation failed.' 299 | ); 300 | } 301 | 302 | @given(/^Switch to main frame$/, null, 60 * 1000) 303 | public switchToMainFrame() { 304 | // browser.ignoreSynchronization = true; 305 | return assert.eventually.equal( 306 | browser.driver 307 | .switchTo() 308 | .defaultContent() 309 | .then( 310 | () => { 311 | // browser.ignoreSynchronization = false; 312 | return true; 313 | }, 314 | (error: any) => { 315 | // browser.ignoreSynchronization = false; 316 | throw new Error(error.message); 317 | } 318 | ), 319 | true, 320 | 'Operation failed.' 321 | ); 322 | } 323 | 324 | @given(/^Wait for "([^"]*)" to contain text "([^"]*)"$/, null, 60 * 1000) 325 | public waitForElementToContainText(elementKey: string, targetText: string) { 326 | return this.waitForElementToContainTextWithSelection( 327 | elementKey, 328 | null, 329 | null, 330 | targetText 331 | ); 332 | } 333 | 334 | @given( 335 | /^Wait for "([^"]*)" with the "([^"]*)" of "([^"]*)" to contain text "([^"]*)"$/, 336 | null, 337 | 60 * 1000 338 | ) 339 | public waitForElementToContainTextWithSelection( 340 | elementKey: string, 341 | selectionMethod: string, 342 | selectionValue: string, 343 | targetText: string 344 | ) { 345 | let elementToWait = this.getWebElement( 346 | elementKey, 347 | selectionMethod, 348 | selectionValue 349 | ); 350 | let expectedCondition = ExpectedConditions.textToBePresentInElement( 351 | elementToWait, 352 | targetText 353 | ); 354 | // browser.ignoreSynchronization = true; 355 | return assert.eventually.equal( 356 | browser.driver.wait(expectedCondition, this.defaultElementTimeout).then( 357 | () => { 358 | // browser.ignoreSynchronization = false; 359 | return elementToWait.getText(); 360 | }, 361 | (error: any) => { 362 | // browser.ignoreSynchronization = false; 363 | throw new Error(error.message); 364 | } 365 | ), 366 | targetText, 367 | 'Operation failed.' 368 | ); 369 | } 370 | 371 | @given(/^Wait for "([^"]*)" to appear$/, null, 60 * 1000) 372 | public waitForElementToBeVisible(elementKey: string) { 373 | return this.waitForElementToBeVisibleWithSelection(elementKey, null, null); 374 | } 375 | 376 | @given( 377 | /^Wait for "([^"]*)" with the "([^"]*)" of "([^"]*)" to appear$/, 378 | null, 379 | 60 * 1000 380 | ) 381 | public waitForElementToBeVisibleWithSelection( 382 | elementKey, 383 | selectionMethod, 384 | selectionValue 385 | ) { 386 | let elementToWait = this.getWebElement( 387 | elementKey, 388 | selectionMethod, 389 | selectionValue 390 | ); 391 | let expectedCondition = ExpectedConditions.visibilityOf(elementToWait); 392 | // browser.ignoreSynchronization = true; 393 | return assert.eventually.equal( 394 | browser.driver.wait(expectedCondition, this.defaultElementTimeout).then( 395 | () => { 396 | // browser.ignoreSynchronization = false; 397 | return true; 398 | }, 399 | (error: any) => { 400 | // browser.ignoreSynchronization = false; 401 | throw new Error(error.message); 402 | } 403 | ), 404 | true, 405 | 'Operation failed.' 406 | ); 407 | } 408 | 409 | @given(/^I read the content of element "([^"]*)" and store in variable "([^"]*)" as a "([^"]*)"$/, null, 60 * 1000) 410 | public readContentAndStoreInVariable( 411 | elementKey: string, 412 | variableKey: string, 413 | variableType: string 414 | ) { 415 | return this.readContentWithSelectionAndStoreInVariable( 416 | elementKey, 417 | null, 418 | null, 419 | variableKey, 420 | variableType 421 | ); 422 | } 423 | 424 | @given(/^I read the content of element "([^"]*)" with the "([^"]*)" of "([^"]*)" and store in variable "([^"]*)" as a "([^"]*)"$/, null, 60 * 1000) 425 | public readContentWithSelectionAndStoreInVariable( 426 | elementKey: string, 427 | selectionMethod: string, 428 | selectionValue: string, 429 | variableKey: string, 430 | variableType: string 431 | ) { 432 | let elementToStore = this.getWebElement( 433 | elementKey, 434 | selectionMethod, 435 | selectionValue 436 | ); 437 | return assert.eventually.equal( 438 | elementToStore.getText().then( 439 | (value: string) => { 440 | this.variableService.addVariable(variableKey, variableType, value); 441 | return true; 442 | }, 443 | (error: any) => { 444 | throw new Error(error); 445 | } 446 | ), 447 | true, 448 | 'Operation failed.' 449 | ); 450 | } 451 | 452 | @given(/^I store the value "([^"]*)" in variable "([^"]*)" as a "([^"]*)"$/, null, 60 * 1000) 453 | public storeVariableValue( 454 | value: string, 455 | variableKey: string, 456 | variableType: string 457 | ) { 458 | const storeVariable = () => { 459 | this.variableService.addVariable(variableKey, variableType, value); 460 | return true; 461 | }; 462 | return assert.eventually.equal( 463 | Promise.resolve(storeVariable()), 464 | true, 465 | 'Operation failed' 466 | ); 467 | } 468 | 469 | @given(/^I populate "([^"]*)" with the value of variable "([^"]*)" of type "([^"]*)"$/, null, 60 * 1000) 470 | public populateElementUsingVariableValue(elementKey: string, variableKey: string, variableType: string) { 471 | return this.populateElementWithSelectionUsingVariableValue(elementKey, null, null, variableKey, variableType); 472 | } 473 | 474 | @given(/^I populate "([^"]*)" with the "([^"]*)" of "([^"]*)" with the value of variable "([^"]*)" of type "([^"]*)"$/, null, 60 * 1000) 475 | public populateElementWithSelectionUsingVariableValue(elementKey: string, elementSelectionType: string, elementSelectionValue: string, 476 | variableKey: string, variableType: string) { 477 | let inputElement = this.getWebElement(elementKey, elementSelectionType, elementSelectionValue); 478 | let variableValue = null; 479 | switch (variableType.toLowerCase()) { 480 | case VariableType.String: 481 | variableValue = this.variableService.getStringVariable(variableKey).getValue(); 482 | break; 483 | case VariableType.Number: 484 | variableValue = this.variableService.getNumberVariable(variableKey).getValue(); 485 | break; 486 | default: 487 | throw new Error('Invalid variable type'); 488 | } 489 | if (!variableValue) throw new Error('Invalid variable value'); 490 | 491 | return assert.eventually.equal( 492 | inputElement.sendKeys(variableValue).then(() => { return true; }, (error: any) => { 493 | throw new Error(error.message); 494 | } 495 | ), true, 'Operation failed'); 496 | } 497 | 498 | 499 | @given( 500 | /^The value in variable "([^"]*)" of type "([^"]*)" equals to "([^"]*)"$/, null, 60 * 1000 501 | ) 502 | public compareVariableValues( 503 | variableKey: string, 504 | variableType: string, 505 | variableValue: string 506 | ) { 507 | const getVariableByType = () => { 508 | switch (variableType.toLocaleLowerCase()) { 509 | case VariableType.String: 510 | return this.variableService.getStringVariable(variableKey).getValue(); 511 | case VariableType.Number: 512 | return this.variableService.getNumberVariable(variableKey).getValue(); 513 | default: 514 | throw new Error('Invalid variable type "' + variableType + '"'); 515 | } 516 | }; 517 | return assert.eventually.equal( 518 | Promise.resolve(getVariableByType()), 519 | variableValue, 520 | 'Operation failed' 521 | ); 522 | } 523 | 524 | @given(/^I drag "([^"]*)" and drop on to "([^"]*)"$/, null, 60 * 1000) 525 | public dragAndDropElement(dragElementKey: string, dropElementKey: string) { 526 | return this.dragAndDropElementsWithSelection(dragElementKey, null, null, dropElementKey, null, null); 527 | } 528 | 529 | @given(/^I drag "([^"]*)" with the "([^"]*)" of "([^"]*)" and drop on to "([^"]*)" with the "([^"]*)" of "([^"]*)"$/, null, 60 * 1000) 530 | public dragAndDropElementsWithSelection(dragElementKey: string, dragElementSelectionMethod: string, dragElementSelectionValue: string, 531 | dropElementKey: string, dropElementSelectionMethod: string, dropElementSelectionValue: string) { 532 | 533 | let dragElement = this.getWebElement(dragElementKey, dragElementSelectionMethod, dragElementSelectionValue); 534 | let dropElement = this.getWebElement(dropElementKey, dropElementSelectionMethod, dropElementSelectionValue); 535 | 536 | return assert.eventually.equal( 537 | browser.driver.actions().dragAndDrop(dragElement, dropElement).perform().then(() => { return true; }, (error: any) => { 538 | throw new Error(error.message); 539 | } 540 | ), true, 'Operation failed'); 541 | 542 | } 543 | 544 | 545 | 546 | @given(/^Accept the confirmation alert$/, null, 60 * 1000) 547 | @given(/^I Accept the confirm dialog$/, null, 60 * 1000) 548 | public AcceptBrowserAlert() { 549 | return assert.eventually.equal( 550 | browser.driver.switchTo().alert().accept().then(() => { 551 | return true; 552 | }, (error: any) => { 553 | throw new Error(error.message); 554 | } 555 | ), true, 'Operation failed'); 556 | } 557 | 558 | @given(/^The alert message says "([^"]*)"$/, null, 60 * 1000) 559 | public CheckAlertMessageText(textToCompare: string) { 560 | return assert.eventually.equal( 561 | browser.driver.switchTo().alert().getText().then((text: string) => { 562 | return text.trim() === textToCompare.trim(); 563 | }, (error: any) => { 564 | throw new Error(error.message); 565 | } 566 | ), true, 'Operation failed'); 567 | } 568 | 569 | @given(/^I Dismiss the confirm dialog$/, null, 60 * 1000) 570 | public DisMissConfirmation() { 571 | return assert.eventually.equal( 572 | browser.driver.switchTo().alert().dismiss().then(() => { 573 | return true; 574 | }, (error: any) => { 575 | throw new Error(error.message); 576 | } 577 | ), true, 'Operation failed'); 578 | } 579 | 580 | @given(/^I Accept the confirm dialog$/, null, 60 * 1000) 581 | public AcceptConfirmation() { 582 | return assert.eventually.equal( 583 | browser.driver.switchTo().alert().accept().then(() => { 584 | return true; 585 | }, (error: any) => { 586 | throw new Error(error.message); 587 | } 588 | ), true, 'Operation failed'); 589 | } 590 | 591 | @given(/^I enter "([^"]*)" into prompt$/, null, 60 * 1000) 592 | public typeInPrompt(textToCompare: string) { 593 | return assert.eventually.equal( 594 | browser.driver.switchTo().alert().sendKeys(textToCompare).then(() => { 595 | return true; 596 | }, (error: any) => { 597 | throw new Error(error.message); 598 | } 599 | ), true, 'Operation failed'); 600 | } 601 | 602 | @given(/^The value in variable "([^"]*)" of type "([^"]*)" equals to variable "([^"]*)"$/, null, 60 * 1000) 603 | public compareVariableWithVariable(variableOne: string, variableType: string, variableTwo: string) { 604 | let comparison = null; 605 | const getVariableByType = () => { 606 | switch (variableType.toLocaleLowerCase()) { 607 | case VariableType.String: 608 | comparison = this.variableService.getStringVariable(variableTwo).getValue(); 609 | return this.variableService.getStringVariable(variableOne).getValue(); 610 | case VariableType.Number: 611 | comparison = this.variableService.getNumberVariable(variableTwo).getValue(); 612 | return this.variableService.getNumberVariable(variableOne).getValue(); 613 | default: 614 | throw new Error('Invalid variable type "' + variableType + '"'); 615 | } 616 | }; 617 | return assert.eventually.equal(Promise.resolve(getVariableByType()), comparison, 'Operation failed'); 618 | } 619 | 620 | @given(/^I Add variable "([^"]*)" to "([^"]*)" and store in "([^"]*)"$/, null, 60 * 1000) 621 | public addNumericValues(variableKey1: string, variableKey2: string, newVariable: string) { 622 | let valOne = this.getVariable(variableKey1, VariableType.Number).toNumber(); 623 | let valTwo = this.getVariable(variableKey2, VariableType.Number).toNumber(); 624 | const addVariables = () => { 625 | let newVal = valOne + valTwo; 626 | this.variableService.addVariable(newVariable, VariableType.Number, newVal.toString()); 627 | return true; 628 | } 629 | return assert.eventually.equal(Promise.resolve(addVariables()), true, 'Operation failed'); 630 | 631 | } 632 | 633 | @given(/^I Subtract variable "([^"]*)" from "([^"]*)" and store in "([^"]*)"$/, null, 60 * 1000) 634 | public subTractNumericValues(variableKey1: string, variableKey2: string, newVariable: string) { 635 | let valOne = this.getVariable(variableKey1, VariableType.Number).toNumber(); 636 | let valTwo = this.getVariable(variableKey2, VariableType.Number).toNumber(); 637 | const subtractVariables = () => { 638 | let newVal = valOne - valTwo; 639 | this.variableService.addVariable(newVariable, VariableType.Number, newVal.toString()); 640 | return true; 641 | } 642 | return assert.eventually.equal(Promise.resolve(subtractVariables()), true, 'Operation failed'); 643 | 644 | } 645 | 646 | @given(/^I Multiply variable "([^"]*)" from "([^"]*)" and store in "([^"]*)"$/, null, 60 * 1000) 647 | public multiplyNumericValues(variableKey1: string, variableKey2: string, newVariable: string) { 648 | let valOne = this.getVariable(variableKey1, VariableType.Number).toNumber(); 649 | let valTwo = this.getVariable(variableKey2, VariableType.Number).toNumber(); 650 | const multiplyVariables = () => { 651 | let newVal = valOne * valTwo; 652 | this.variableService.addVariable(newVariable, VariableType.Number, newVal.toString()); 653 | return true; 654 | } 655 | return assert.eventually.equal(Promise.resolve(multiplyVariables()), true, 'Operation failed'); 656 | 657 | } 658 | 659 | @given(/^I Divide variable "([^"]*)" from "([^"]*)" and store in "([^"]*)"$/, null, 60 * 1000) 660 | public divideNumericValues(variableKey1: string, variableKey2: string, newVariable: string) { 661 | let valOne = this.getVariable(variableKey1, VariableType.Number).toNumber(); 662 | let valTwo = this.getVariable(variableKey2, VariableType.Number).toNumber(); 663 | const divideVariables = () => { 664 | let newVal = valOne / valTwo; 665 | this.variableService.addVariable(newVariable, VariableType.Number, newVal.toString()); 666 | return true; 667 | } 668 | return assert.eventually.equal(Promise.resolve(divideVariables()), true, 'Operation failed'); 669 | 670 | } 671 | 672 | @given(/^I Upload "([^"]*)" to "([^"]*)"$/, null, 60 * 1000) 673 | public uploadFile(filePath: string, elementKey: string) { 674 | this.uploadFileWithSelectionMethod(filePath, elementKey, null, null); 675 | } 676 | 677 | 678 | @given(/^I Upload "([^"]*)" to "([^"]*)" with the "([^"]*)" of "([^"]*)"$/, null, 60 * 1000) 679 | public uploadFileWithSelectionMethod(filePath: string, elementKey: string, selectionMethod: string, selectionValue: string) { 680 | let uploadElement = this.getWebElement(elementKey, selectionMethod, selectionValue); 681 | return assert.eventually.equal( 682 | uploadElement.sendKeys(filePath).then( 683 | () => { 684 | return true; 685 | }, (error: any) => { 686 | throw new Error(error.message); 687 | } 688 | ), true, 'Failed to upload file' 689 | ); 690 | } 691 | 692 | @given(/^Click on "([^"]*)" when active$/, null, 60 * 1000) 693 | public clickOnElementWhenActive(elementKey: string) { 694 | return this.clickOnElementWhenActiveWithSelectionMethod(elementKey, null, null); 695 | } 696 | 697 | 698 | @given(/^Click on "([^"]*)" with the "([^"]*)" of "([^"]*)" when active$/, null, 60 * 1000) 699 | public clickOnElementWhenActiveWithSelectionMethod(elementKey: string, selectionMethod: string, selectionValue: string) { 700 | 701 | let element = this.getWebElement(elementKey, selectionMethod, selectionValue); 702 | let isvisible = ExpectedConditions.visibilityOf(element); 703 | let isClickable = ExpectedConditions.elementToBeClickable(element); 704 | 705 | return assert.eventually.equal( 706 | browser.driver.wait(function () { 707 | return element.isDisplayed().then(function (displayed) { 708 | if (!displayed) { 709 | return false; 710 | } 711 | return element.isEnabled(); 712 | }); 713 | }, this.defaultElementTimeout).then(() => { 714 | element.click(); 715 | return true; 716 | }, (error: any) => { 717 | throw new Error(error.message); 718 | }), true, 'Operation click failed' 719 | ); 720 | 721 | } 722 | 723 | private getVariable(variableKey: string, variableType: string): ICommonVariable { 724 | switch (variableType.toLocaleLowerCase()) { 725 | case VariableType.Number: 726 | return this.variableService.getNumberVariable(variableKey); 727 | case VariableType.String: 728 | return this.variableService.getStringVariable(variableKey); 729 | } 730 | } 731 | } 732 | 733 | export = BaseSteps; 734 | -------------------------------------------------------------------------------- /lib/core/variableOperations.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/99x/CodeSpecJS/7db9b0d8682c5ca304136617457899f52ca368bb/lib/core/variableOperations.ts -------------------------------------------------------------------------------- /lib/domain/ICommonVariable.ts: -------------------------------------------------------------------------------- 1 | export interface ICommonVariable { 2 | getKey(): string; 3 | getValue(): string; 4 | setValue(newValue: string): void; 5 | toNumber(): number; 6 | toString(): string; 7 | } -------------------------------------------------------------------------------- /lib/domain/IIntVariable.ts: -------------------------------------------------------------------------------- 1 | import { ICommonVariable } from "./ICommonVariable"; 2 | 3 | export interface IIntVariable extends ICommonVariable { 4 | add(otherVariable: number): IIntVariable; 5 | subtract(otherVariable: number): IIntVariable; 6 | multiply(otherVariable: number): IIntVariable; 7 | divide(otherVariable: number): IIntVariable; 8 | } -------------------------------------------------------------------------------- /lib/domain/IStringVariable.ts: -------------------------------------------------------------------------------- 1 | import { ICommonVariable } from "./ICommonVariable"; 2 | 3 | export interface IStringVariable extends ICommonVariable { 4 | addString(otherVariable: object): IStringVariable; 5 | 6 | } -------------------------------------------------------------------------------- /lib/domain/Ihooks.ts: -------------------------------------------------------------------------------- 1 | export interface IHooks { 2 | beforeScenario(): void; 3 | afterScenario(): void; 4 | } -------------------------------------------------------------------------------- /lib/domain/elementObject.ts: -------------------------------------------------------------------------------- 1 | import { ElementFinder } from "protractor/built"; 2 | 3 | export class ElementObject { 4 | Key: string; 5 | UIElement: ElementFinder 6 | constructor(key: string, uiElement: ElementFinder){ 7 | this.Key = key; 8 | this.UIElement = uiElement; 9 | } 10 | } -------------------------------------------------------------------------------- /lib/domain/repoElement.ts: -------------------------------------------------------------------------------- 1 | export class RepoElement { 2 | elementKey: string; 3 | selectionMethod: string; 4 | value: string; 5 | constructor(elementKey: string, selectionMethod: string, value: string){ 6 | this.elementKey = elementKey; 7 | this.selectionMethod = selectionMethod; 8 | this.value = value; 9 | } 10 | } -------------------------------------------------------------------------------- /lib/domain/variableObject.ts: -------------------------------------------------------------------------------- 1 | import { IIntVariable } from "./IIntVariable"; 2 | import { IStringVariable } from "./IStringVariable"; 3 | 4 | export class VariableObject implements IIntVariable, IStringVariable { 5 | key: string; 6 | value: string; 7 | constructor(key: string, value: string) { 8 | this.key = key; 9 | this.value = value; 10 | } 11 | 12 | setValue(newValue: string): void { 13 | this.value = newValue; 14 | } 15 | 16 | getKey(): string { 17 | return this.key; 18 | } 19 | getValue(): string { 20 | return this.value; 21 | } 22 | toString(): string { 23 | return this.value.toString(); 24 | } 25 | toNumber(): number { 26 | return parseInt(this.getValue()); 27 | } 28 | add(otherVariable: number): IIntVariable { 29 | let localValue = this.toNumber(); 30 | let newNumber = localValue + otherVariable; 31 | let returnVariable: IIntVariable = new VariableObject(this.getKey(), newNumber.toString()); 32 | return returnVariable; 33 | 34 | } 35 | addString(otherVariable: object): IStringVariable { 36 | let newString = this.toString() + otherVariable.toString(); 37 | let returnVariable: IStringVariable = new VariableObject(this.getKey(), newString.toString()); 38 | return returnVariable; 39 | } 40 | subtract(otherVariable: number): IIntVariable { 41 | let localValue = this.toNumber(); 42 | let newNumber = localValue - otherVariable; 43 | let returnVariable: IIntVariable = new VariableObject(this.getKey(), newNumber.toString()); 44 | return returnVariable; 45 | } 46 | multiply(otherVariable: number): IIntVariable { 47 | let localValue = this.toNumber(); 48 | let newNumber = localValue * otherVariable; 49 | let returnVariable: IIntVariable = new VariableObject(this.getKey(), newNumber.toString()); 50 | return returnVariable; 51 | } 52 | divide(otherVariable: number): IIntVariable { 53 | let localValue = this.toNumber(); 54 | let newNumber = localValue / otherVariable; 55 | let returnVariable: IIntVariable = new VariableObject(this.getKey(), newNumber.toString()); 56 | return returnVariable; 57 | } 58 | } -------------------------------------------------------------------------------- /lib/domain/variableType.ts: -------------------------------------------------------------------------------- 1 | export enum VariableType { 2 | String = "string", 3 | Number = "number", 4 | } -------------------------------------------------------------------------------- /lib/services/element.service.ts: -------------------------------------------------------------------------------- 1 | import { browser, ElementHelper, element, by, ElementFinder } from 'protractor'; 2 | import { ElementObject } from "../domain/elementObject"; 3 | import { ProtractorLocator } from "protractor/built/locators"; 4 | import { promise as wdpromise } from 'selenium-webdriver' 5 | import * as _ from "lodash"; 6 | import { RepoElement } from "../domain/repoElement"; 7 | 8 | declare var OBJECT_REPO: any; 9 | 10 | export class ElementService { 11 | private elementCache: ElementObject[]; 12 | private static singleTon: ElementService; 13 | 14 | private constructor() { 15 | 16 | this.elementCache = new Array(); 17 | //TODO: Read the object repo from excel or CSV file and populate elementCache 18 | if (browser.params.OBJECT_REPO) { 19 | let objectRepoElements = browser.params.OBJECT_REPO; 20 | objectRepoElements.forEach((object: RepoElement) => { 21 | let elementFinderObj = element(this.getElementSource(object.selectionMethod, object.value)); 22 | this.elementCache.push(new ElementObject(object.elementKey, elementFinderObj)); 23 | }) 24 | } 25 | } 26 | 27 | public static GetInstance() { 28 | return this.singleTon || (this.singleTon = new this()); 29 | } 30 | 31 | isExistingElement(elementKey: string): boolean { 32 | let targetElement = _.find(this.elementCache, (object: ElementObject) => { 33 | return elementKey === object.Key; 34 | }); 35 | return targetElement ? true : false; 36 | } 37 | 38 | addNewElement(elementKey: string, element: ElementFinder): void { 39 | if (!this.isExistingElement(elementKey)) { 40 | this.elementCache.push(new ElementObject(elementKey, element)); 41 | } 42 | } 43 | 44 | getElementByKey(elementKey: string): ElementFinder { 45 | let targetElement = _.find(this.elementCache, (object: ElementObject) => { 46 | return elementKey === object.Key; 47 | }); 48 | return targetElement ? targetElement.UIElement : null; 49 | 50 | } 51 | 52 | getElementSource(method: string, value: string) { 53 | if (method && value) { 54 | switch (method.toLowerCase()) { 55 | case "model": 56 | return by.model(value); 57 | case "id": 58 | return by.id(value); 59 | case "xpath": 60 | return by.xpath(value); 61 | case "binding": 62 | return by.binding(value); 63 | case "css": 64 | return by.css(value); 65 | } 66 | } else { 67 | throw new Error('Invalid parameters'); 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /lib/services/variable.service.ts: -------------------------------------------------------------------------------- 1 | import * as _ from "lodash"; 2 | import { IStringVariable } from '../domain/IStringVariable'; 3 | import { IIntVariable } from '../domain/IIntVariable'; 4 | import { VariableObject } from '../domain/variableObject'; 5 | import { VariableType } from '../domain/variableType'; 6 | import { ICommonVariable } from "../domain/ICommonVariable"; 7 | 8 | export class VariableService { 9 | private stringVariables: IStringVariable[]; 10 | private numberVariables: IIntVariable[]; 11 | private static singleTon: VariableService; 12 | 13 | private constructor() { 14 | this.stringVariables = new Array(); 15 | this.numberVariables = new Array(); 16 | 17 | } 18 | 19 | public static GetInstance() { 20 | return this.singleTon || (this.singleTon = new this()); 21 | } 22 | 23 | isExistingString(variableKey: string): IStringVariable { 24 | let targetVariable = _.find(this.stringVariables, (object: IStringVariable) => { 25 | return object.getKey() === variableKey; 26 | }) 27 | 28 | return targetVariable; 29 | } 30 | 31 | isExistingNumber(variableKey: string): IIntVariable { 32 | let targetVariable = _.find(this.numberVariables, (object: IIntVariable) => { 33 | return object.getKey() === variableKey; 34 | }) 35 | 36 | return targetVariable; 37 | } 38 | 39 | 40 | addVariable(variableKey: string, variableType: string, variableValue: string): void { 41 | switch (variableType.toLowerCase()) { 42 | case VariableType.String: 43 | let existingString = this.isExistingString(variableKey); 44 | if (existingString) { 45 | this.stringVariables.forEach((element: IStringVariable) => { 46 | if (element.getKey() === variableKey) { 47 | element.setValue(variableValue); 48 | } 49 | }); 50 | } else { 51 | this.stringVariables.push(new VariableObject(variableKey, variableValue)); 52 | } 53 | break; 54 | case VariableType.Number: 55 | let existingNumber = this.isExistingNumber(variableKey); 56 | if (existingNumber) { 57 | this.numberVariables.forEach((element: IIntVariable) => { 58 | if (element.getKey() === variableKey) { 59 | element.setValue(variableValue); 60 | } 61 | }); 62 | } else { 63 | this.numberVariables.push(new VariableObject(variableKey, variableValue)); 64 | } 65 | break; 66 | } 67 | } 68 | 69 | getNumberVariable(variableKey: string): IIntVariable { 70 | 71 | let variable = _.find(this.numberVariables, (object: IIntVariable) => { 72 | return variableKey === object.getKey(); 73 | }); 74 | if (variable) return variable; 75 | throw new Error('Variable "' + variableKey + '" not found'); 76 | } 77 | 78 | getStringVariable(variableKey: string): IStringVariable { 79 | let variable = _.find(this.stringVariables, (object: IStringVariable) => { 80 | return variableKey === object.getKey(); 81 | }); 82 | if (variable) return variable; 83 | throw new Error('Variable "' + variableKey + '" not found'); 84 | } 85 | 86 | getVariable(variableKey: string, variableType: string): ICommonVariable{ 87 | switch(variableType.toLowerCase()){ 88 | case VariableType.String: 89 | return this.getStringVariable(variableKey); 90 | case VariableType.Number: 91 | return this.getNumberVariable(variableKey); 92 | } 93 | } 94 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CodeSpecJS", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.0.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | }, 26 | "dependencies": { 27 | "ansi-styles": { 28 | "version": "3.2.1", 29 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 30 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 31 | "dev": true, 32 | "requires": { 33 | "color-convert": "^1.9.0" 34 | } 35 | }, 36 | "chalk": { 37 | "version": "2.4.1", 38 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 39 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 40 | "dev": true, 41 | "requires": { 42 | "ansi-styles": "^3.2.1", 43 | "escape-string-regexp": "^1.0.5", 44 | "supports-color": "^5.3.0" 45 | } 46 | }, 47 | "js-tokens": { 48 | "version": "4.0.0", 49 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 50 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 51 | "dev": true 52 | }, 53 | "supports-color": { 54 | "version": "5.5.0", 55 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 56 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 57 | "dev": true, 58 | "requires": { 59 | "has-flag": "^3.0.0" 60 | } 61 | } 62 | } 63 | }, 64 | "@types/chai": { 65 | "version": "4.1.7", 66 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", 67 | "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", 68 | "dev": true 69 | }, 70 | "@types/chai-as-promised": { 71 | "version": "0.0.31", 72 | "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-0.0.31.tgz", 73 | "integrity": "sha512-DWT96QeM5AeASIkChnFtEOy6O45WvKmaw27MPhAKLkx06TaFNqrzJuWVurKjCEo3PqVV89YLR2iVON8PhTRaLg==", 74 | "dev": true, 75 | "requires": { 76 | "@types/chai": "*" 77 | } 78 | }, 79 | "@types/lodash": { 80 | "version": "4.14.118", 81 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.118.tgz", 82 | "integrity": "sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw==" 83 | }, 84 | "@types/lodash-es": { 85 | "version": "4.17.1", 86 | "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.1.tgz", 87 | "integrity": "sha512-3EDZjphPfdjnsWvY11ufYImFMPyQJwIH1eFYRgWQsjOctce06fmNgVf5sfvXBRiaS1o0X50bAln1lfWs8ZO3BA==", 88 | "dev": true, 89 | "requires": { 90 | "@types/lodash": "*" 91 | } 92 | }, 93 | "@types/node": { 94 | "version": "6.14.1", 95 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.1.tgz", 96 | "integrity": "sha512-lfydm+Ul6buYjF6AmcenFjqVYB+tpNlGlwWLr43J1Cok4ybLQimrM8rdB1MdrjtyWdYRceZNgsAeSRZhFxNajQ==", 97 | "dev": true 98 | }, 99 | "@types/q": { 100 | "version": "0.0.32", 101 | "resolved": "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", 102 | "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", 103 | "dev": true 104 | }, 105 | "@types/selenium-webdriver": { 106 | "version": "3.0.12", 107 | "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.12.tgz", 108 | "integrity": "sha512-hYn+eoOehVUIdMwp5h34ZsGAO1ydja10GDup4BwyoFCdcH5MQ35nQq+AInSaBMEMopD5hEooFCyKo2Pajbe1ag==", 109 | "dev": true 110 | }, 111 | "acorn": { 112 | "version": "6.0.4", 113 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", 114 | "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", 115 | "dev": true 116 | }, 117 | "acorn-jsx": { 118 | "version": "5.0.0", 119 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", 120 | "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", 121 | "dev": true 122 | }, 123 | "adm-zip": { 124 | "version": "0.4.11", 125 | "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", 126 | "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", 127 | "dev": true 128 | }, 129 | "agent-base": { 130 | "version": "4.3.0", 131 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 132 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 133 | "requires": { 134 | "es6-promisify": "^5.0.0" 135 | } 136 | }, 137 | "ajv": { 138 | "version": "5.5.2", 139 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 140 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 141 | "dev": true, 142 | "requires": { 143 | "co": "^4.6.0", 144 | "fast-deep-equal": "^1.0.0", 145 | "fast-json-stable-stringify": "^2.0.0", 146 | "json-schema-traverse": "^0.3.0" 147 | } 148 | }, 149 | "ansi-escapes": { 150 | "version": "3.1.0", 151 | "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 152 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 153 | "dev": true 154 | }, 155 | "ansi-regex": { 156 | "version": "2.1.1", 157 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 158 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 159 | "dev": true 160 | }, 161 | "ansi-styles": { 162 | "version": "2.2.1", 163 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 164 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 165 | "dev": true 166 | }, 167 | "any-promise": { 168 | "version": "1.3.0", 169 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 170 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", 171 | "dev": true 172 | }, 173 | "argparse": { 174 | "version": "1.0.10", 175 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 176 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 177 | "dev": true, 178 | "requires": { 179 | "sprintf-js": "~1.0.2" 180 | } 181 | }, 182 | "arguments-extended": { 183 | "version": "0.0.3", 184 | "resolved": "https://registry.npmjs.org/arguments-extended/-/arguments-extended-0.0.3.tgz", 185 | "integrity": "sha1-YQfkkX0OtvCk3WYyD8Fa/HLvSUY=", 186 | "requires": { 187 | "extended": "~0.0.3", 188 | "is-extended": "~0.0.8" 189 | } 190 | }, 191 | "array-extended": { 192 | "version": "0.0.11", 193 | "resolved": "https://registry.npmjs.org/array-extended/-/array-extended-0.0.11.tgz", 194 | "integrity": "sha1-1xRK50jek8pybxIQCdv/FibRZL0=", 195 | "requires": { 196 | "arguments-extended": "~0.0.3", 197 | "extended": "~0.0.3", 198 | "is-extended": "~0.0.3" 199 | } 200 | }, 201 | "array-union": { 202 | "version": "1.0.2", 203 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 204 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 205 | "dev": true, 206 | "requires": { 207 | "array-uniq": "^1.0.1" 208 | } 209 | }, 210 | "array-uniq": { 211 | "version": "1.0.3", 212 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 213 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 214 | "dev": true 215 | }, 216 | "arrify": { 217 | "version": "1.0.1", 218 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 219 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 220 | "dev": true 221 | }, 222 | "asn1": { 223 | "version": "0.2.4", 224 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 225 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 226 | "dev": true, 227 | "requires": { 228 | "safer-buffer": "~2.1.0" 229 | } 230 | }, 231 | "assert-plus": { 232 | "version": "1.0.0", 233 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 234 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 235 | "dev": true 236 | }, 237 | "assertion-error": { 238 | "version": "1.1.0", 239 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 240 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 241 | "dev": true 242 | }, 243 | "assertion-error-formatter": { 244 | "version": "2.0.1", 245 | "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-2.0.1.tgz", 246 | "integrity": "sha512-cjC3jUCh9spkroKue5PDSKH5RFQ/KNuZJhk3GwHYmB/8qqETxLOmMdLH+ohi/VukNzxDlMvIe7zScvLoOdhb6Q==", 247 | "dev": true, 248 | "requires": { 249 | "diff": "^3.0.0", 250 | "pad-right": "^0.2.2", 251 | "repeat-string": "^1.6.1" 252 | } 253 | }, 254 | "asynckit": { 255 | "version": "0.4.0", 256 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 257 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 258 | "dev": true 259 | }, 260 | "aws-sign2": { 261 | "version": "0.7.0", 262 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 263 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 264 | "dev": true 265 | }, 266 | "aws4": { 267 | "version": "1.8.0", 268 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 269 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 270 | "dev": true 271 | }, 272 | "babel-code-frame": { 273 | "version": "6.26.0", 274 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 275 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 276 | "dev": true, 277 | "requires": { 278 | "chalk": "^1.1.3", 279 | "esutils": "^2.0.2", 280 | "js-tokens": "^3.0.2" 281 | } 282 | }, 283 | "babel-polyfill": { 284 | "version": "6.5.0", 285 | "resolved": "http://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.5.0.tgz", 286 | "integrity": "sha1-ho+PAq0CCB4IepZdLg0/TvjFfMM=", 287 | "dev": true, 288 | "requires": { 289 | "babel-regenerator-runtime": "^6.3.13", 290 | "babel-runtime": "^5.0.0", 291 | "core-js": "^1.0.1" 292 | }, 293 | "dependencies": { 294 | "babel-runtime": { 295 | "version": "5.8.38", 296 | "resolved": "http://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", 297 | "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", 298 | "dev": true, 299 | "requires": { 300 | "core-js": "^1.0.0" 301 | } 302 | }, 303 | "core-js": { 304 | "version": "1.2.7", 305 | "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 306 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", 307 | "dev": true 308 | } 309 | } 310 | }, 311 | "babel-regenerator-runtime": { 312 | "version": "6.5.0", 313 | "resolved": "http://registry.npmjs.org/babel-regenerator-runtime/-/babel-regenerator-runtime-6.5.0.tgz", 314 | "integrity": "sha1-DkHNHJ+ARCRm8BXHSf/4upj44RA=", 315 | "dev": true 316 | }, 317 | "babel-runtime": { 318 | "version": "6.26.0", 319 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 320 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 321 | "dev": true, 322 | "requires": { 323 | "core-js": "^2.4.0", 324 | "regenerator-runtime": "^0.11.0" 325 | } 326 | }, 327 | "balanced-match": { 328 | "version": "1.0.0", 329 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 330 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 331 | "dev": true 332 | }, 333 | "bcrypt-pbkdf": { 334 | "version": "1.0.2", 335 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 336 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 337 | "dev": true, 338 | "requires": { 339 | "tweetnacl": "^0.14.3" 340 | } 341 | }, 342 | "blocking-proxy": { 343 | "version": "1.0.1", 344 | "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", 345 | "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", 346 | "dev": true, 347 | "requires": { 348 | "minimist": "^1.2.0" 349 | } 350 | }, 351 | "bluebird": { 352 | "version": "3.5.2", 353 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", 354 | "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", 355 | "dev": true 356 | }, 357 | "brace-expansion": { 358 | "version": "1.1.11", 359 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 360 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 361 | "dev": true, 362 | "requires": { 363 | "balanced-match": "^1.0.0", 364 | "concat-map": "0.0.1" 365 | } 366 | }, 367 | "browserstack": { 368 | "version": "1.5.1", 369 | "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.1.tgz", 370 | "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==", 371 | "dev": true, 372 | "requires": { 373 | "https-proxy-agent": "^2.2.1" 374 | } 375 | }, 376 | "buffer-alloc": { 377 | "version": "1.2.0", 378 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 379 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 380 | "requires": { 381 | "buffer-alloc-unsafe": "^1.1.0", 382 | "buffer-fill": "^1.0.0" 383 | } 384 | }, 385 | "buffer-alloc-unsafe": { 386 | "version": "1.1.0", 387 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 388 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 389 | }, 390 | "buffer-fill": { 391 | "version": "1.0.0", 392 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 393 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 394 | }, 395 | "buffer-from": { 396 | "version": "1.1.1", 397 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 398 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 399 | }, 400 | "builtin-modules": { 401 | "version": "1.1.1", 402 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 403 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 404 | "dev": true 405 | }, 406 | "caller-path": { 407 | "version": "0.1.0", 408 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 409 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 410 | "dev": true, 411 | "requires": { 412 | "callsites": "^0.2.0" 413 | } 414 | }, 415 | "callsite": { 416 | "version": "1.0.0", 417 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 418 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", 419 | "dev": true 420 | }, 421 | "callsites": { 422 | "version": "0.2.0", 423 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 424 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 425 | "dev": true 426 | }, 427 | "caseless": { 428 | "version": "0.12.0", 429 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 430 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 431 | "dev": true 432 | }, 433 | "chai": { 434 | "version": "4.2.0", 435 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 436 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 437 | "dev": true, 438 | "requires": { 439 | "assertion-error": "^1.1.0", 440 | "check-error": "^1.0.2", 441 | "deep-eql": "^3.0.1", 442 | "get-func-name": "^2.0.0", 443 | "pathval": "^1.1.0", 444 | "type-detect": "^4.0.5" 445 | } 446 | }, 447 | "chai-as-promised": { 448 | "version": "7.1.1", 449 | "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", 450 | "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", 451 | "dev": true, 452 | "requires": { 453 | "check-error": "^1.0.2" 454 | } 455 | }, 456 | "chalk": { 457 | "version": "1.1.3", 458 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 459 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 460 | "dev": true, 461 | "requires": { 462 | "ansi-styles": "^2.2.1", 463 | "escape-string-regexp": "^1.0.2", 464 | "has-ansi": "^2.0.0", 465 | "strip-ansi": "^3.0.0", 466 | "supports-color": "^2.0.0" 467 | } 468 | }, 469 | "chardet": { 470 | "version": "0.7.0", 471 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 472 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 473 | "dev": true 474 | }, 475 | "check-error": { 476 | "version": "1.0.2", 477 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 478 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 479 | "dev": true 480 | }, 481 | "circular-json": { 482 | "version": "0.3.3", 483 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 484 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 485 | "dev": true 486 | }, 487 | "cli-cursor": { 488 | "version": "2.1.0", 489 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 490 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 491 | "dev": true, 492 | "requires": { 493 | "restore-cursor": "^2.0.0" 494 | } 495 | }, 496 | "cli-table": { 497 | "version": "0.3.1", 498 | "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", 499 | "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", 500 | "dev": true, 501 | "requires": { 502 | "colors": "1.0.3" 503 | }, 504 | "dependencies": { 505 | "colors": { 506 | "version": "1.0.3", 507 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 508 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", 509 | "dev": true 510 | } 511 | } 512 | }, 513 | "cli-width": { 514 | "version": "2.2.0", 515 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 516 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 517 | "dev": true 518 | }, 519 | "co": { 520 | "version": "4.6.0", 521 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 522 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 523 | "dev": true 524 | }, 525 | "color-convert": { 526 | "version": "1.9.3", 527 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 528 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 529 | "dev": true, 530 | "requires": { 531 | "color-name": "1.1.3" 532 | } 533 | }, 534 | "color-name": { 535 | "version": "1.1.3", 536 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 537 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 538 | "dev": true 539 | }, 540 | "colors": { 541 | "version": "1.3.2", 542 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", 543 | "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", 544 | "dev": true 545 | }, 546 | "combined-stream": { 547 | "version": "1.0.7", 548 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 549 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 550 | "dev": true, 551 | "requires": { 552 | "delayed-stream": "~1.0.0" 553 | } 554 | }, 555 | "commander": { 556 | "version": "2.19.0", 557 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", 558 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", 559 | "dev": true 560 | }, 561 | "concat-map": { 562 | "version": "0.0.1", 563 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 564 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 565 | "dev": true 566 | }, 567 | "core-js": { 568 | "version": "2.5.7", 569 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", 570 | "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", 571 | "dev": true 572 | }, 573 | "core-util-is": { 574 | "version": "1.0.2", 575 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 576 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 577 | }, 578 | "cross-spawn": { 579 | "version": "6.0.5", 580 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 581 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 582 | "requires": { 583 | "nice-try": "^1.0.4", 584 | "path-key": "^2.0.1", 585 | "semver": "^5.5.0", 586 | "shebang-command": "^1.2.0", 587 | "which": "^1.2.9" 588 | } 589 | }, 590 | "csv-parser": { 591 | "version": "2.1.0", 592 | "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-2.1.0.tgz", 593 | "integrity": "sha512-U2kdS/NTK5wyXkFcqxw8xooYgt5AvGHxA9rjKBHryu2cKHygOehThG1+w3dWeJV0RYw3gJ6SsZmMCSU2B9jQrg==", 594 | "requires": { 595 | "buffer-alloc": "^1.1.0", 596 | "buffer-from": "^1.0.0", 597 | "execa": "^1.0.0", 598 | "generate-function": "^1.0.1", 599 | "generate-object-property": "^1.0.0", 600 | "minimist": "^1.2.0", 601 | "ndjson": "^1.4.0" 602 | } 603 | }, 604 | "cucumber": { 605 | "version": "2.3.1", 606 | "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-2.3.1.tgz", 607 | "integrity": "sha1-N5GlH/0MYUYq1X/bjtER1VtRzeM=", 608 | "dev": true, 609 | "requires": { 610 | "assertion-error-formatter": "^2.0.0", 611 | "babel-runtime": "^6.11.6", 612 | "bluebird": "^3.4.1", 613 | "cli-table": "^0.3.1", 614 | "colors": "^1.1.2", 615 | "commander": "^2.9.0", 616 | "cucumber-expressions": "^3.0.0", 617 | "cucumber-tag-expressions": "^1.0.0", 618 | "duration": "^0.2.0", 619 | "figures": "2.0.0", 620 | "gherkin": "^4.1.0", 621 | "glob": "^7.0.0", 622 | "indent-string": "^3.1.0", 623 | "is-generator": "^1.0.2", 624 | "is-stream": "^1.1.0", 625 | "lodash": "^4.0.0", 626 | "mz": "^2.4.0", 627 | "progress": "^2.0.0", 628 | "resolve": "^1.3.3", 629 | "stack-chain": "^1.3.5", 630 | "stacktrace-js": "^2.0.0", 631 | "string-argv": "0.0.2", 632 | "upper-case-first": "^1.1.2", 633 | "util-arity": "^1.0.2", 634 | "verror": "^1.9.0" 635 | } 636 | }, 637 | "cucumber-expressions": { 638 | "version": "3.0.0", 639 | "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-3.0.0.tgz", 640 | "integrity": "sha1-TPQkgT2uOWzJ2rcUuBBLRZvvwyw=", 641 | "dev": true 642 | }, 643 | "cucumber-html-reporter": { 644 | "version": "4.0.4", 645 | "resolved": "https://registry.npmjs.org/cucumber-html-reporter/-/cucumber-html-reporter-4.0.4.tgz", 646 | "integrity": "sha512-1Slz4r2WyPBXuOVDPVX0ZfuHrfMSyLgbX48FzB3qb4BEa+YiUy8o+iE1hbgwv1ItZfxek8JwUKVCnuruF/Wz0w==", 647 | "requires": { 648 | "find": "^0.2.7", 649 | "fs-extra": "^3.0.1", 650 | "js-base64": "^2.3.2", 651 | "jsonfile": "^3.0.0", 652 | "lodash": "^4.17.5", 653 | "opn": "5.3.0" 654 | } 655 | }, 656 | "cucumber-tag-expressions": { 657 | "version": "1.1.1", 658 | "resolved": "https://registry.npmjs.org/cucumber-tag-expressions/-/cucumber-tag-expressions-1.1.1.tgz", 659 | "integrity": "sha1-f1x7cACbwrZmWRv+ZIVFeL7e6Fo=", 660 | "dev": true 661 | }, 662 | "cucumber-tsflow": { 663 | "version": "2.2.0", 664 | "resolved": "https://registry.npmjs.org/cucumber-tsflow/-/cucumber-tsflow-2.2.0.tgz", 665 | "integrity": "sha1-tlJXNFh06kvKCLuiMuD6d50X3As=", 666 | "dev": true, 667 | "requires": { 668 | "babel-polyfill": "~6.5.0", 669 | "callsite": "~1.0.0", 670 | "underscore": "~1.8.3" 671 | } 672 | }, 673 | "d": { 674 | "version": "1.0.0", 675 | "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz", 676 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 677 | "dev": true, 678 | "requires": { 679 | "es5-ext": "^0.10.9" 680 | } 681 | }, 682 | "dashdash": { 683 | "version": "1.14.1", 684 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 685 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 686 | "dev": true, 687 | "requires": { 688 | "assert-plus": "^1.0.0" 689 | } 690 | }, 691 | "date-extended": { 692 | "version": "0.0.6", 693 | "resolved": "https://registry.npmjs.org/date-extended/-/date-extended-0.0.6.tgz", 694 | "integrity": "sha1-I4AtV90b94GIE/4MMuhRqG2iZ8k=", 695 | "requires": { 696 | "array-extended": "~0.0.3", 697 | "extended": "~0.0.3", 698 | "is-extended": "~0.0.3" 699 | } 700 | }, 701 | "debug": { 702 | "version": "3.2.6", 703 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 704 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 705 | "requires": { 706 | "ms": "^2.1.1" 707 | } 708 | }, 709 | "declare.js": { 710 | "version": "0.0.8", 711 | "resolved": "https://registry.npmjs.org/declare.js/-/declare.js-0.0.8.tgz", 712 | "integrity": "sha1-BHit/5VkwAT1Hfc9i8E0AZ0o3N4=" 713 | }, 714 | "deep-eql": { 715 | "version": "3.0.1", 716 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 717 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 718 | "dev": true, 719 | "requires": { 720 | "type-detect": "^4.0.0" 721 | } 722 | }, 723 | "deep-is": { 724 | "version": "0.1.3", 725 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 726 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 727 | "dev": true 728 | }, 729 | "del": { 730 | "version": "2.2.2", 731 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 732 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 733 | "dev": true, 734 | "requires": { 735 | "globby": "^5.0.0", 736 | "is-path-cwd": "^1.0.0", 737 | "is-path-in-cwd": "^1.0.0", 738 | "object-assign": "^4.0.1", 739 | "pify": "^2.0.0", 740 | "pinkie-promise": "^2.0.0", 741 | "rimraf": "^2.2.8" 742 | } 743 | }, 744 | "delayed-stream": { 745 | "version": "1.0.0", 746 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 747 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 748 | "dev": true 749 | }, 750 | "diff": { 751 | "version": "3.5.0", 752 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 753 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 754 | "dev": true 755 | }, 756 | "doctrine": { 757 | "version": "2.1.0", 758 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 759 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 760 | "dev": true, 761 | "requires": { 762 | "esutils": "^2.0.2" 763 | } 764 | }, 765 | "duration": { 766 | "version": "0.2.2", 767 | "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", 768 | "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", 769 | "dev": true, 770 | "requires": { 771 | "d": "1", 772 | "es5-ext": "~0.10.46" 773 | } 774 | }, 775 | "ecc-jsbn": { 776 | "version": "0.1.2", 777 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 778 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 779 | "dev": true, 780 | "requires": { 781 | "jsbn": "~0.1.0", 782 | "safer-buffer": "^2.1.0" 783 | } 784 | }, 785 | "end-of-stream": { 786 | "version": "1.4.1", 787 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 788 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 789 | "requires": { 790 | "once": "^1.4.0" 791 | } 792 | }, 793 | "error-stack-parser": { 794 | "version": "2.0.2", 795 | "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", 796 | "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", 797 | "dev": true, 798 | "requires": { 799 | "stackframe": "^1.0.4" 800 | } 801 | }, 802 | "es5-ext": { 803 | "version": "0.10.46", 804 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", 805 | "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", 806 | "dev": true, 807 | "requires": { 808 | "es6-iterator": "~2.0.3", 809 | "es6-symbol": "~3.1.1", 810 | "next-tick": "1" 811 | } 812 | }, 813 | "es6-iterator": { 814 | "version": "2.0.3", 815 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 816 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 817 | "dev": true, 818 | "requires": { 819 | "d": "1", 820 | "es5-ext": "^0.10.35", 821 | "es6-symbol": "^3.1.1" 822 | } 823 | }, 824 | "es6-promise": { 825 | "version": "4.2.8", 826 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 827 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 828 | }, 829 | "es6-promisify": { 830 | "version": "5.0.0", 831 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 832 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 833 | "requires": { 834 | "es6-promise": "^4.0.3" 835 | } 836 | }, 837 | "es6-symbol": { 838 | "version": "3.1.1", 839 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 840 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 841 | "dev": true, 842 | "requires": { 843 | "d": "1", 844 | "es5-ext": "~0.10.14" 845 | } 846 | }, 847 | "escape-string-regexp": { 848 | "version": "1.0.5", 849 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 850 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 851 | "dev": true 852 | }, 853 | "eslint": { 854 | "version": "5.8.0", 855 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.8.0.tgz", 856 | "integrity": "sha512-Zok6Bru3y2JprqTNm14mgQ15YQu/SMDkWdnmHfFg770DIUlmMFd/gqqzCHekxzjHZJxXv3tmTpH0C1icaYJsRQ==", 857 | "dev": true, 858 | "requires": { 859 | "@babel/code-frame": "^7.0.0", 860 | "ajv": "^6.5.3", 861 | "chalk": "^2.1.0", 862 | "cross-spawn": "^6.0.5", 863 | "debug": "^4.0.1", 864 | "doctrine": "^2.1.0", 865 | "eslint-scope": "^4.0.0", 866 | "eslint-utils": "^1.3.1", 867 | "eslint-visitor-keys": "^1.0.0", 868 | "espree": "^4.0.0", 869 | "esquery": "^1.0.1", 870 | "esutils": "^2.0.2", 871 | "file-entry-cache": "^2.0.0", 872 | "functional-red-black-tree": "^1.0.1", 873 | "glob": "^7.1.2", 874 | "globals": "^11.7.0", 875 | "ignore": "^4.0.6", 876 | "imurmurhash": "^0.1.4", 877 | "inquirer": "^6.1.0", 878 | "is-resolvable": "^1.1.0", 879 | "js-yaml": "^3.12.0", 880 | "json-stable-stringify-without-jsonify": "^1.0.1", 881 | "levn": "^0.3.0", 882 | "lodash": "^4.17.5", 883 | "minimatch": "^3.0.4", 884 | "mkdirp": "^0.5.1", 885 | "natural-compare": "^1.4.0", 886 | "optionator": "^0.8.2", 887 | "path-is-inside": "^1.0.2", 888 | "pluralize": "^7.0.0", 889 | "progress": "^2.0.0", 890 | "regexpp": "^2.0.1", 891 | "require-uncached": "^1.0.3", 892 | "semver": "^5.5.1", 893 | "strip-ansi": "^4.0.0", 894 | "strip-json-comments": "^2.0.1", 895 | "table": "^5.0.2", 896 | "text-table": "^0.2.0" 897 | }, 898 | "dependencies": { 899 | "ajv": { 900 | "version": "6.5.5", 901 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", 902 | "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", 903 | "dev": true, 904 | "requires": { 905 | "fast-deep-equal": "^2.0.1", 906 | "fast-json-stable-stringify": "^2.0.0", 907 | "json-schema-traverse": "^0.4.1", 908 | "uri-js": "^4.2.2" 909 | } 910 | }, 911 | "ansi-regex": { 912 | "version": "3.0.0", 913 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 914 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 915 | "dev": true 916 | }, 917 | "ansi-styles": { 918 | "version": "3.2.1", 919 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 920 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 921 | "dev": true, 922 | "requires": { 923 | "color-convert": "^1.9.0" 924 | } 925 | }, 926 | "chalk": { 927 | "version": "2.4.1", 928 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 929 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 930 | "dev": true, 931 | "requires": { 932 | "ansi-styles": "^3.2.1", 933 | "escape-string-regexp": "^1.0.5", 934 | "supports-color": "^5.3.0" 935 | } 936 | }, 937 | "debug": { 938 | "version": "4.1.0", 939 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", 940 | "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", 941 | "dev": true, 942 | "requires": { 943 | "ms": "^2.1.1" 944 | } 945 | }, 946 | "fast-deep-equal": { 947 | "version": "2.0.1", 948 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 949 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 950 | "dev": true 951 | }, 952 | "json-schema-traverse": { 953 | "version": "0.4.1", 954 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 955 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 956 | "dev": true 957 | }, 958 | "strip-ansi": { 959 | "version": "4.0.0", 960 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 961 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 962 | "dev": true, 963 | "requires": { 964 | "ansi-regex": "^3.0.0" 965 | } 966 | }, 967 | "supports-color": { 968 | "version": "5.5.0", 969 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 970 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 971 | "dev": true, 972 | "requires": { 973 | "has-flag": "^3.0.0" 974 | } 975 | } 976 | } 977 | }, 978 | "eslint-scope": { 979 | "version": "4.0.0", 980 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", 981 | "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", 982 | "dev": true, 983 | "requires": { 984 | "esrecurse": "^4.1.0", 985 | "estraverse": "^4.1.1" 986 | } 987 | }, 988 | "eslint-utils": { 989 | "version": "1.4.3", 990 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 991 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 992 | "dev": true, 993 | "requires": { 994 | "eslint-visitor-keys": "^1.1.0" 995 | }, 996 | "dependencies": { 997 | "eslint-visitor-keys": { 998 | "version": "1.1.0", 999 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 1000 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 1001 | "dev": true 1002 | } 1003 | } 1004 | }, 1005 | "eslint-visitor-keys": { 1006 | "version": "1.0.0", 1007 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 1008 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 1009 | "dev": true 1010 | }, 1011 | "espree": { 1012 | "version": "4.1.0", 1013 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", 1014 | "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", 1015 | "dev": true, 1016 | "requires": { 1017 | "acorn": "^6.0.2", 1018 | "acorn-jsx": "^5.0.0", 1019 | "eslint-visitor-keys": "^1.0.0" 1020 | } 1021 | }, 1022 | "esprima": { 1023 | "version": "4.0.1", 1024 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1025 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1026 | "dev": true 1027 | }, 1028 | "esquery": { 1029 | "version": "1.0.1", 1030 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 1031 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 1032 | "dev": true, 1033 | "requires": { 1034 | "estraverse": "^4.0.0" 1035 | } 1036 | }, 1037 | "esrecurse": { 1038 | "version": "4.2.1", 1039 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 1040 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 1041 | "dev": true, 1042 | "requires": { 1043 | "estraverse": "^4.1.0" 1044 | } 1045 | }, 1046 | "estraverse": { 1047 | "version": "4.2.0", 1048 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 1049 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 1050 | "dev": true 1051 | }, 1052 | "esutils": { 1053 | "version": "2.0.2", 1054 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 1055 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 1056 | "dev": true 1057 | }, 1058 | "execa": { 1059 | "version": "1.0.0", 1060 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 1061 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 1062 | "requires": { 1063 | "cross-spawn": "^6.0.0", 1064 | "get-stream": "^4.0.0", 1065 | "is-stream": "^1.1.0", 1066 | "npm-run-path": "^2.0.0", 1067 | "p-finally": "^1.0.0", 1068 | "signal-exit": "^3.0.0", 1069 | "strip-eof": "^1.0.0" 1070 | } 1071 | }, 1072 | "exit": { 1073 | "version": "0.1.2", 1074 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 1075 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 1076 | "dev": true 1077 | }, 1078 | "extend": { 1079 | "version": "3.0.2", 1080 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1081 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1082 | "dev": true 1083 | }, 1084 | "extended": { 1085 | "version": "0.0.6", 1086 | "resolved": "https://registry.npmjs.org/extended/-/extended-0.0.6.tgz", 1087 | "integrity": "sha1-f7i/e52uOXWG5IVwrP1kLHjlBmk=", 1088 | "requires": { 1089 | "extender": "~0.0.5" 1090 | } 1091 | }, 1092 | "extender": { 1093 | "version": "0.0.10", 1094 | "resolved": "https://registry.npmjs.org/extender/-/extender-0.0.10.tgz", 1095 | "integrity": "sha1-WJwHSCvmGhRgttgfnCSqZ+jzJM0=", 1096 | "requires": { 1097 | "declare.js": "~0.0.4" 1098 | } 1099 | }, 1100 | "external-editor": { 1101 | "version": "3.0.3", 1102 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", 1103 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", 1104 | "dev": true, 1105 | "requires": { 1106 | "chardet": "^0.7.0", 1107 | "iconv-lite": "^0.4.24", 1108 | "tmp": "^0.0.33" 1109 | }, 1110 | "dependencies": { 1111 | "tmp": { 1112 | "version": "0.0.33", 1113 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1114 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1115 | "dev": true, 1116 | "requires": { 1117 | "os-tmpdir": "~1.0.2" 1118 | } 1119 | } 1120 | } 1121 | }, 1122 | "extsprintf": { 1123 | "version": "1.4.0", 1124 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", 1125 | "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", 1126 | "dev": true 1127 | }, 1128 | "fast-csv": { 1129 | "version": "2.4.1", 1130 | "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-2.4.1.tgz", 1131 | "integrity": "sha1-vX3SaDkfcpNntZRFuN0K0CaIGyY=", 1132 | "requires": { 1133 | "extended": "0.0.6", 1134 | "is-extended": "0.0.10", 1135 | "object-extended": "0.0.7", 1136 | "string-extended": "0.0.8" 1137 | } 1138 | }, 1139 | "fast-deep-equal": { 1140 | "version": "1.1.0", 1141 | "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 1142 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 1143 | "dev": true 1144 | }, 1145 | "fast-json-stable-stringify": { 1146 | "version": "2.0.0", 1147 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 1148 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 1149 | "dev": true 1150 | }, 1151 | "fast-levenshtein": { 1152 | "version": "2.0.6", 1153 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1154 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1155 | "dev": true 1156 | }, 1157 | "figures": { 1158 | "version": "2.0.0", 1159 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 1160 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 1161 | "dev": true, 1162 | "requires": { 1163 | "escape-string-regexp": "^1.0.5" 1164 | } 1165 | }, 1166 | "file-entry-cache": { 1167 | "version": "2.0.0", 1168 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 1169 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 1170 | "dev": true, 1171 | "requires": { 1172 | "flat-cache": "^1.2.1", 1173 | "object-assign": "^4.0.1" 1174 | } 1175 | }, 1176 | "find": { 1177 | "version": "0.2.9", 1178 | "resolved": "https://registry.npmjs.org/find/-/find-0.2.9.tgz", 1179 | "integrity": "sha1-S3Px/55WrZG3bnFkB/5f/mVUu4w=", 1180 | "requires": { 1181 | "traverse-chain": "~0.1.0" 1182 | } 1183 | }, 1184 | "flat-cache": { 1185 | "version": "1.3.0", 1186 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 1187 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 1188 | "dev": true, 1189 | "requires": { 1190 | "circular-json": "^0.3.1", 1191 | "del": "^2.0.2", 1192 | "graceful-fs": "^4.1.2", 1193 | "write": "^0.2.1" 1194 | } 1195 | }, 1196 | "forever-agent": { 1197 | "version": "0.6.1", 1198 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1199 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 1200 | "dev": true 1201 | }, 1202 | "form-data": { 1203 | "version": "2.3.3", 1204 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 1205 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 1206 | "dev": true, 1207 | "requires": { 1208 | "asynckit": "^0.4.0", 1209 | "combined-stream": "^1.0.6", 1210 | "mime-types": "^2.1.12" 1211 | } 1212 | }, 1213 | "fs-extra": { 1214 | "version": "3.0.1", 1215 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 1216 | "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", 1217 | "requires": { 1218 | "graceful-fs": "^4.1.2", 1219 | "jsonfile": "^3.0.0", 1220 | "universalify": "^0.1.0" 1221 | } 1222 | }, 1223 | "fs.realpath": { 1224 | "version": "1.0.0", 1225 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1226 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1227 | "dev": true 1228 | }, 1229 | "functional-red-black-tree": { 1230 | "version": "1.0.1", 1231 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1232 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1233 | "dev": true 1234 | }, 1235 | "generate-function": { 1236 | "version": "1.1.0", 1237 | "resolved": "http://registry.npmjs.org/generate-function/-/generate-function-1.1.0.tgz", 1238 | "integrity": "sha1-VMIbCAGSsW2Yd3ecW7gWZudyNl8=" 1239 | }, 1240 | "generate-object-property": { 1241 | "version": "1.2.0", 1242 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 1243 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 1244 | "requires": { 1245 | "is-property": "^1.0.0" 1246 | } 1247 | }, 1248 | "get-func-name": { 1249 | "version": "2.0.0", 1250 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 1251 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 1252 | "dev": true 1253 | }, 1254 | "get-stream": { 1255 | "version": "4.1.0", 1256 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 1257 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 1258 | "requires": { 1259 | "pump": "^3.0.0" 1260 | } 1261 | }, 1262 | "getpass": { 1263 | "version": "0.1.7", 1264 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1265 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1266 | "dev": true, 1267 | "requires": { 1268 | "assert-plus": "^1.0.0" 1269 | } 1270 | }, 1271 | "gherkin": { 1272 | "version": "4.1.3", 1273 | "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-4.1.3.tgz", 1274 | "integrity": "sha1-EWh9uTl235djMSWmsiKKGkv9+iQ=", 1275 | "dev": true 1276 | }, 1277 | "glob": { 1278 | "version": "7.1.3", 1279 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1280 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1281 | "dev": true, 1282 | "requires": { 1283 | "fs.realpath": "^1.0.0", 1284 | "inflight": "^1.0.4", 1285 | "inherits": "2", 1286 | "minimatch": "^3.0.4", 1287 | "once": "^1.3.0", 1288 | "path-is-absolute": "^1.0.0" 1289 | } 1290 | }, 1291 | "globals": { 1292 | "version": "11.8.0", 1293 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", 1294 | "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", 1295 | "dev": true 1296 | }, 1297 | "globby": { 1298 | "version": "5.0.0", 1299 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 1300 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 1301 | "dev": true, 1302 | "requires": { 1303 | "array-union": "^1.0.1", 1304 | "arrify": "^1.0.0", 1305 | "glob": "^7.0.3", 1306 | "object-assign": "^4.0.1", 1307 | "pify": "^2.0.0", 1308 | "pinkie-promise": "^2.0.0" 1309 | } 1310 | }, 1311 | "graceful-fs": { 1312 | "version": "4.1.15", 1313 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 1314 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 1315 | }, 1316 | "har-schema": { 1317 | "version": "2.0.0", 1318 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1319 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 1320 | "dev": true 1321 | }, 1322 | "har-validator": { 1323 | "version": "5.1.0", 1324 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 1325 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 1326 | "dev": true, 1327 | "requires": { 1328 | "ajv": "^5.3.0", 1329 | "har-schema": "^2.0.0" 1330 | } 1331 | }, 1332 | "has-ansi": { 1333 | "version": "2.0.0", 1334 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1335 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1336 | "dev": true, 1337 | "requires": { 1338 | "ansi-regex": "^2.0.0" 1339 | } 1340 | }, 1341 | "has-flag": { 1342 | "version": "3.0.0", 1343 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1344 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1345 | "dev": true 1346 | }, 1347 | "http-signature": { 1348 | "version": "1.2.0", 1349 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1350 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1351 | "dev": true, 1352 | "requires": { 1353 | "assert-plus": "^1.0.0", 1354 | "jsprim": "^1.2.2", 1355 | "sshpk": "^1.7.0" 1356 | } 1357 | }, 1358 | "https-proxy-agent": { 1359 | "version": "2.2.4", 1360 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 1361 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 1362 | "requires": { 1363 | "agent-base": "^4.3.0", 1364 | "debug": "^3.1.0" 1365 | } 1366 | }, 1367 | "iconv-lite": { 1368 | "version": "0.4.24", 1369 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1370 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1371 | "dev": true, 1372 | "requires": { 1373 | "safer-buffer": ">= 2.1.2 < 3" 1374 | } 1375 | }, 1376 | "ignore": { 1377 | "version": "4.0.6", 1378 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1379 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1380 | "dev": true 1381 | }, 1382 | "immediate": { 1383 | "version": "3.0.6", 1384 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1385 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", 1386 | "dev": true 1387 | }, 1388 | "imurmurhash": { 1389 | "version": "0.1.4", 1390 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1391 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1392 | "dev": true 1393 | }, 1394 | "indent-string": { 1395 | "version": "3.2.0", 1396 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", 1397 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", 1398 | "dev": true 1399 | }, 1400 | "inflight": { 1401 | "version": "1.0.6", 1402 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1403 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1404 | "dev": true, 1405 | "requires": { 1406 | "once": "^1.3.0", 1407 | "wrappy": "1" 1408 | } 1409 | }, 1410 | "inherits": { 1411 | "version": "2.0.3", 1412 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1413 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1414 | }, 1415 | "ini": { 1416 | "version": "1.3.5", 1417 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1418 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1419 | "dev": true 1420 | }, 1421 | "inquirer": { 1422 | "version": "6.2.0", 1423 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", 1424 | "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", 1425 | "dev": true, 1426 | "requires": { 1427 | "ansi-escapes": "^3.0.0", 1428 | "chalk": "^2.0.0", 1429 | "cli-cursor": "^2.1.0", 1430 | "cli-width": "^2.0.0", 1431 | "external-editor": "^3.0.0", 1432 | "figures": "^2.0.0", 1433 | "lodash": "^4.17.10", 1434 | "mute-stream": "0.0.7", 1435 | "run-async": "^2.2.0", 1436 | "rxjs": "^6.1.0", 1437 | "string-width": "^2.1.0", 1438 | "strip-ansi": "^4.0.0", 1439 | "through": "^2.3.6" 1440 | }, 1441 | "dependencies": { 1442 | "ansi-regex": { 1443 | "version": "3.0.0", 1444 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1445 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1446 | "dev": true 1447 | }, 1448 | "ansi-styles": { 1449 | "version": "3.2.1", 1450 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1451 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1452 | "dev": true, 1453 | "requires": { 1454 | "color-convert": "^1.9.0" 1455 | } 1456 | }, 1457 | "chalk": { 1458 | "version": "2.4.1", 1459 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 1460 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 1461 | "dev": true, 1462 | "requires": { 1463 | "ansi-styles": "^3.2.1", 1464 | "escape-string-regexp": "^1.0.5", 1465 | "supports-color": "^5.3.0" 1466 | } 1467 | }, 1468 | "strip-ansi": { 1469 | "version": "4.0.0", 1470 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1471 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1472 | "dev": true, 1473 | "requires": { 1474 | "ansi-regex": "^3.0.0" 1475 | } 1476 | }, 1477 | "supports-color": { 1478 | "version": "5.5.0", 1479 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1480 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1481 | "dev": true, 1482 | "requires": { 1483 | "has-flag": "^3.0.0" 1484 | } 1485 | } 1486 | } 1487 | }, 1488 | "is-extended": { 1489 | "version": "0.0.10", 1490 | "resolved": "https://registry.npmjs.org/is-extended/-/is-extended-0.0.10.tgz", 1491 | "integrity": "sha1-JE4UDfdbscmjEG9BL/GC+1NKbWI=", 1492 | "requires": { 1493 | "extended": "~0.0.3" 1494 | } 1495 | }, 1496 | "is-fullwidth-code-point": { 1497 | "version": "2.0.0", 1498 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1499 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1500 | "dev": true 1501 | }, 1502 | "is-generator": { 1503 | "version": "1.0.3", 1504 | "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", 1505 | "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=", 1506 | "dev": true 1507 | }, 1508 | "is-path-cwd": { 1509 | "version": "1.0.0", 1510 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1511 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1512 | "dev": true 1513 | }, 1514 | "is-path-in-cwd": { 1515 | "version": "1.0.1", 1516 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 1517 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 1518 | "dev": true, 1519 | "requires": { 1520 | "is-path-inside": "^1.0.0" 1521 | } 1522 | }, 1523 | "is-path-inside": { 1524 | "version": "1.0.1", 1525 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1526 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1527 | "dev": true, 1528 | "requires": { 1529 | "path-is-inside": "^1.0.1" 1530 | } 1531 | }, 1532 | "is-promise": { 1533 | "version": "2.1.0", 1534 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1535 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1536 | "dev": true 1537 | }, 1538 | "is-property": { 1539 | "version": "1.0.2", 1540 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1541 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 1542 | }, 1543 | "is-resolvable": { 1544 | "version": "1.1.0", 1545 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1546 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1547 | "dev": true 1548 | }, 1549 | "is-stream": { 1550 | "version": "1.1.0", 1551 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1552 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1553 | }, 1554 | "is-typedarray": { 1555 | "version": "1.0.0", 1556 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1557 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1558 | "dev": true 1559 | }, 1560 | "is-wsl": { 1561 | "version": "1.1.0", 1562 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 1563 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" 1564 | }, 1565 | "isarray": { 1566 | "version": "1.0.0", 1567 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1568 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1569 | }, 1570 | "isexe": { 1571 | "version": "2.0.0", 1572 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1573 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1574 | }, 1575 | "isstream": { 1576 | "version": "0.1.2", 1577 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1578 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1579 | "dev": true 1580 | }, 1581 | "jasmine": { 1582 | "version": "2.8.0", 1583 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", 1584 | "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", 1585 | "dev": true, 1586 | "requires": { 1587 | "exit": "^0.1.2", 1588 | "glob": "^7.0.6", 1589 | "jasmine-core": "~2.8.0" 1590 | } 1591 | }, 1592 | "jasmine-core": { 1593 | "version": "2.8.0", 1594 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", 1595 | "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", 1596 | "dev": true 1597 | }, 1598 | "jasminewd2": { 1599 | "version": "2.2.0", 1600 | "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", 1601 | "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", 1602 | "dev": true 1603 | }, 1604 | "js-base64": { 1605 | "version": "2.4.9", 1606 | "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", 1607 | "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==" 1608 | }, 1609 | "js-tokens": { 1610 | "version": "3.0.2", 1611 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1612 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1613 | "dev": true 1614 | }, 1615 | "js-yaml": { 1616 | "version": "3.13.1", 1617 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1618 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1619 | "dev": true, 1620 | "requires": { 1621 | "argparse": "^1.0.7", 1622 | "esprima": "^4.0.0" 1623 | } 1624 | }, 1625 | "jsbn": { 1626 | "version": "0.1.1", 1627 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1628 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1629 | "dev": true 1630 | }, 1631 | "json-schema": { 1632 | "version": "0.2.3", 1633 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1634 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1635 | "dev": true 1636 | }, 1637 | "json-schema-traverse": { 1638 | "version": "0.3.1", 1639 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1640 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1641 | "dev": true 1642 | }, 1643 | "json-stable-stringify-without-jsonify": { 1644 | "version": "1.0.1", 1645 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1646 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1647 | "dev": true 1648 | }, 1649 | "json-stringify-safe": { 1650 | "version": "5.0.1", 1651 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1652 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1653 | }, 1654 | "jsonfile": { 1655 | "version": "3.0.1", 1656 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 1657 | "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", 1658 | "requires": { 1659 | "graceful-fs": "^4.1.6" 1660 | } 1661 | }, 1662 | "jsprim": { 1663 | "version": "1.4.1", 1664 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1665 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1666 | "dev": true, 1667 | "requires": { 1668 | "assert-plus": "1.0.0", 1669 | "extsprintf": "1.3.0", 1670 | "json-schema": "0.2.3", 1671 | "verror": "1.10.0" 1672 | }, 1673 | "dependencies": { 1674 | "extsprintf": { 1675 | "version": "1.3.0", 1676 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 1677 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 1678 | "dev": true 1679 | } 1680 | } 1681 | }, 1682 | "jszip": { 1683 | "version": "3.1.5", 1684 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", 1685 | "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", 1686 | "dev": true, 1687 | "requires": { 1688 | "core-js": "~2.3.0", 1689 | "es6-promise": "~3.0.2", 1690 | "lie": "~3.1.0", 1691 | "pako": "~1.0.2", 1692 | "readable-stream": "~2.0.6" 1693 | }, 1694 | "dependencies": { 1695 | "core-js": { 1696 | "version": "2.3.0", 1697 | "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", 1698 | "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", 1699 | "dev": true 1700 | }, 1701 | "es6-promise": { 1702 | "version": "3.0.2", 1703 | "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", 1704 | "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", 1705 | "dev": true 1706 | }, 1707 | "process-nextick-args": { 1708 | "version": "1.0.7", 1709 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1710 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1711 | "dev": true 1712 | }, 1713 | "readable-stream": { 1714 | "version": "2.0.6", 1715 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 1716 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 1717 | "dev": true, 1718 | "requires": { 1719 | "core-util-is": "~1.0.0", 1720 | "inherits": "~2.0.1", 1721 | "isarray": "~1.0.0", 1722 | "process-nextick-args": "~1.0.6", 1723 | "string_decoder": "~0.10.x", 1724 | "util-deprecate": "~1.0.1" 1725 | } 1726 | }, 1727 | "string_decoder": { 1728 | "version": "0.10.31", 1729 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1730 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1731 | "dev": true 1732 | } 1733 | } 1734 | }, 1735 | "levn": { 1736 | "version": "0.3.0", 1737 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1738 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1739 | "dev": true, 1740 | "requires": { 1741 | "prelude-ls": "~1.1.2", 1742 | "type-check": "~0.3.2" 1743 | } 1744 | }, 1745 | "lie": { 1746 | "version": "3.1.1", 1747 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", 1748 | "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", 1749 | "dev": true, 1750 | "requires": { 1751 | "immediate": "~3.0.5" 1752 | } 1753 | }, 1754 | "lodash": { 1755 | "version": "4.17.15", 1756 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1757 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 1758 | }, 1759 | "make-error": { 1760 | "version": "1.3.5", 1761 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 1762 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 1763 | "dev": true 1764 | }, 1765 | "mime-db": { 1766 | "version": "1.37.0", 1767 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 1768 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 1769 | "dev": true 1770 | }, 1771 | "mime-types": { 1772 | "version": "2.1.21", 1773 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 1774 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 1775 | "dev": true, 1776 | "requires": { 1777 | "mime-db": "~1.37.0" 1778 | } 1779 | }, 1780 | "mimic-fn": { 1781 | "version": "1.2.0", 1782 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1783 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1784 | "dev": true 1785 | }, 1786 | "minimatch": { 1787 | "version": "3.0.4", 1788 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1789 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1790 | "dev": true, 1791 | "requires": { 1792 | "brace-expansion": "^1.1.7" 1793 | } 1794 | }, 1795 | "minimist": { 1796 | "version": "1.2.0", 1797 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1798 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1799 | }, 1800 | "mkdirp": { 1801 | "version": "0.5.1", 1802 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1803 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1804 | "dev": true, 1805 | "requires": { 1806 | "minimist": "0.0.8" 1807 | }, 1808 | "dependencies": { 1809 | "minimist": { 1810 | "version": "0.0.8", 1811 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1812 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1813 | "dev": true 1814 | } 1815 | } 1816 | }, 1817 | "ms": { 1818 | "version": "2.1.1", 1819 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1820 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1821 | }, 1822 | "mute-stream": { 1823 | "version": "0.0.7", 1824 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1825 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1826 | "dev": true 1827 | }, 1828 | "mz": { 1829 | "version": "2.7.0", 1830 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1831 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1832 | "dev": true, 1833 | "requires": { 1834 | "any-promise": "^1.0.0", 1835 | "object-assign": "^4.0.1", 1836 | "thenify-all": "^1.0.0" 1837 | } 1838 | }, 1839 | "natural-compare": { 1840 | "version": "1.4.0", 1841 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1842 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1843 | "dev": true 1844 | }, 1845 | "ndjson": { 1846 | "version": "1.5.0", 1847 | "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", 1848 | "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=", 1849 | "requires": { 1850 | "json-stringify-safe": "^5.0.1", 1851 | "minimist": "^1.2.0", 1852 | "split2": "^2.1.0", 1853 | "through2": "^2.0.3" 1854 | } 1855 | }, 1856 | "next-tick": { 1857 | "version": "1.0.0", 1858 | "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", 1859 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", 1860 | "dev": true 1861 | }, 1862 | "nice-try": { 1863 | "version": "1.0.5", 1864 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1865 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 1866 | }, 1867 | "npm-run-path": { 1868 | "version": "2.0.2", 1869 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1870 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1871 | "requires": { 1872 | "path-key": "^2.0.0" 1873 | } 1874 | }, 1875 | "oauth-sign": { 1876 | "version": "0.9.0", 1877 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1878 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1879 | "dev": true 1880 | }, 1881 | "object-assign": { 1882 | "version": "4.1.1", 1883 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1884 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1885 | "dev": true 1886 | }, 1887 | "object-extended": { 1888 | "version": "0.0.7", 1889 | "resolved": "https://registry.npmjs.org/object-extended/-/object-extended-0.0.7.tgz", 1890 | "integrity": "sha1-hP0j9WsVWCrrPoiwXLVdJDLWijM=", 1891 | "requires": { 1892 | "array-extended": "~0.0.4", 1893 | "extended": "~0.0.3", 1894 | "is-extended": "~0.0.3" 1895 | } 1896 | }, 1897 | "once": { 1898 | "version": "1.4.0", 1899 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1900 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1901 | "requires": { 1902 | "wrappy": "1" 1903 | } 1904 | }, 1905 | "onetime": { 1906 | "version": "2.0.1", 1907 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1908 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1909 | "dev": true, 1910 | "requires": { 1911 | "mimic-fn": "^1.0.0" 1912 | } 1913 | }, 1914 | "opn": { 1915 | "version": "5.3.0", 1916 | "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz", 1917 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", 1918 | "requires": { 1919 | "is-wsl": "^1.1.0" 1920 | } 1921 | }, 1922 | "optimist": { 1923 | "version": "0.6.1", 1924 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1925 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1926 | "dev": true, 1927 | "requires": { 1928 | "minimist": "~0.0.1", 1929 | "wordwrap": "~0.0.2" 1930 | }, 1931 | "dependencies": { 1932 | "minimist": { 1933 | "version": "0.0.10", 1934 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1935 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 1936 | "dev": true 1937 | } 1938 | } 1939 | }, 1940 | "optionator": { 1941 | "version": "0.8.2", 1942 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1943 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1944 | "dev": true, 1945 | "requires": { 1946 | "deep-is": "~0.1.3", 1947 | "fast-levenshtein": "~2.0.4", 1948 | "levn": "~0.3.0", 1949 | "prelude-ls": "~1.1.2", 1950 | "type-check": "~0.3.2", 1951 | "wordwrap": "~1.0.0" 1952 | }, 1953 | "dependencies": { 1954 | "wordwrap": { 1955 | "version": "1.0.0", 1956 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1957 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1958 | "dev": true 1959 | } 1960 | } 1961 | }, 1962 | "os-tmpdir": { 1963 | "version": "1.0.2", 1964 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1965 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1966 | "dev": true 1967 | }, 1968 | "p-finally": { 1969 | "version": "1.0.0", 1970 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1971 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1972 | }, 1973 | "pad-right": { 1974 | "version": "0.2.2", 1975 | "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", 1976 | "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", 1977 | "dev": true, 1978 | "requires": { 1979 | "repeat-string": "^1.5.2" 1980 | } 1981 | }, 1982 | "pako": { 1983 | "version": "1.0.6", 1984 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", 1985 | "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", 1986 | "dev": true 1987 | }, 1988 | "path-is-absolute": { 1989 | "version": "1.0.1", 1990 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1991 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1992 | "dev": true 1993 | }, 1994 | "path-is-inside": { 1995 | "version": "1.0.2", 1996 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1997 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1998 | "dev": true 1999 | }, 2000 | "path-key": { 2001 | "version": "2.0.1", 2002 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2003 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 2004 | }, 2005 | "path-parse": { 2006 | "version": "1.0.6", 2007 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2008 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 2009 | "dev": true 2010 | }, 2011 | "pathval": { 2012 | "version": "1.1.0", 2013 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 2014 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 2015 | "dev": true 2016 | }, 2017 | "performance-now": { 2018 | "version": "2.1.0", 2019 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2020 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 2021 | "dev": true 2022 | }, 2023 | "pify": { 2024 | "version": "2.3.0", 2025 | "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2026 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2027 | "dev": true 2028 | }, 2029 | "pinkie": { 2030 | "version": "2.0.4", 2031 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2032 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2033 | "dev": true 2034 | }, 2035 | "pinkie-promise": { 2036 | "version": "2.0.1", 2037 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2038 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2039 | "dev": true, 2040 | "requires": { 2041 | "pinkie": "^2.0.0" 2042 | } 2043 | }, 2044 | "pluralize": { 2045 | "version": "7.0.0", 2046 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 2047 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 2048 | "dev": true 2049 | }, 2050 | "prelude-ls": { 2051 | "version": "1.1.2", 2052 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2053 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2054 | "dev": true 2055 | }, 2056 | "process-nextick-args": { 2057 | "version": "2.0.0", 2058 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 2059 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 2060 | }, 2061 | "progress": { 2062 | "version": "2.0.1", 2063 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", 2064 | "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", 2065 | "dev": true 2066 | }, 2067 | "protractor": { 2068 | "version": "5.4.1", 2069 | "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.1.tgz", 2070 | "integrity": "sha512-ORey5ewQMYiXQxcQohsqEiKYOg/r5yJoJbt0tuROmmgajdg/CA3gTOZNIFJncUVMAJIk5YFqBBLUjKVmQO6tfA==", 2071 | "dev": true, 2072 | "requires": { 2073 | "@types/node": "^6.0.46", 2074 | "@types/q": "^0.0.32", 2075 | "@types/selenium-webdriver": "^3.0.0", 2076 | "blocking-proxy": "^1.0.0", 2077 | "browserstack": "^1.5.1", 2078 | "chalk": "^1.1.3", 2079 | "glob": "^7.0.3", 2080 | "jasmine": "2.8.0", 2081 | "jasminewd2": "^2.1.0", 2082 | "optimist": "~0.6.0", 2083 | "q": "1.4.1", 2084 | "saucelabs": "^1.5.0", 2085 | "selenium-webdriver": "3.6.0", 2086 | "source-map-support": "~0.4.0", 2087 | "webdriver-js-extender": "2.1.0", 2088 | "webdriver-manager": "^12.0.6" 2089 | }, 2090 | "dependencies": { 2091 | "webdriver-manager": { 2092 | "version": "12.1.0", 2093 | "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", 2094 | "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", 2095 | "dev": true, 2096 | "requires": { 2097 | "adm-zip": "^0.4.9", 2098 | "chalk": "^1.1.1", 2099 | "del": "^2.2.0", 2100 | "glob": "^7.0.3", 2101 | "ini": "^1.3.4", 2102 | "minimist": "^1.2.0", 2103 | "q": "^1.4.1", 2104 | "request": "^2.87.0", 2105 | "rimraf": "^2.5.2", 2106 | "semver": "^5.3.0", 2107 | "xml2js": "^0.4.17" 2108 | } 2109 | } 2110 | } 2111 | }, 2112 | "protractor-cucumber-framework": { 2113 | "version": "6.1.1", 2114 | "resolved": "https://registry.npmjs.org/protractor-cucumber-framework/-/protractor-cucumber-framework-6.1.1.tgz", 2115 | "integrity": "sha512-zbV/JWCtpr3FrEP1tpFZeOnytuYjAVnTtE85LDOmSDFFM6fcso1X4VypwEpcvW4adSN+cBuYnCKcdm/kay1slg==", 2116 | "dev": true, 2117 | "requires": { 2118 | "debug": "^3.1.0", 2119 | "glob": "^7.1.2", 2120 | "q": "^1.5.1", 2121 | "tmp": "^0.0.33" 2122 | }, 2123 | "dependencies": { 2124 | "q": { 2125 | "version": "1.5.1", 2126 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 2127 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 2128 | "dev": true 2129 | }, 2130 | "tmp": { 2131 | "version": "0.0.33", 2132 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2133 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2134 | "dev": true, 2135 | "requires": { 2136 | "os-tmpdir": "~1.0.2" 2137 | } 2138 | } 2139 | } 2140 | }, 2141 | "psl": { 2142 | "version": "1.1.29", 2143 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 2144 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", 2145 | "dev": true 2146 | }, 2147 | "pump": { 2148 | "version": "3.0.0", 2149 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2150 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2151 | "requires": { 2152 | "end-of-stream": "^1.1.0", 2153 | "once": "^1.3.1" 2154 | } 2155 | }, 2156 | "punycode": { 2157 | "version": "1.4.1", 2158 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2159 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2160 | "dev": true 2161 | }, 2162 | "q": { 2163 | "version": "1.4.1", 2164 | "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", 2165 | "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", 2166 | "dev": true 2167 | }, 2168 | "qs": { 2169 | "version": "6.5.2", 2170 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2171 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 2172 | "dev": true 2173 | }, 2174 | "readable-stream": { 2175 | "version": "2.3.6", 2176 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2177 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2178 | "requires": { 2179 | "core-util-is": "~1.0.0", 2180 | "inherits": "~2.0.3", 2181 | "isarray": "~1.0.0", 2182 | "process-nextick-args": "~2.0.0", 2183 | "safe-buffer": "~5.1.1", 2184 | "string_decoder": "~1.1.1", 2185 | "util-deprecate": "~1.0.1" 2186 | } 2187 | }, 2188 | "regenerator-runtime": { 2189 | "version": "0.11.1", 2190 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 2191 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", 2192 | "dev": true 2193 | }, 2194 | "regexpp": { 2195 | "version": "2.0.1", 2196 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 2197 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 2198 | "dev": true 2199 | }, 2200 | "repeat-string": { 2201 | "version": "1.6.1", 2202 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2203 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2204 | "dev": true 2205 | }, 2206 | "request": { 2207 | "version": "2.88.0", 2208 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 2209 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 2210 | "dev": true, 2211 | "requires": { 2212 | "aws-sign2": "~0.7.0", 2213 | "aws4": "^1.8.0", 2214 | "caseless": "~0.12.0", 2215 | "combined-stream": "~1.0.6", 2216 | "extend": "~3.0.2", 2217 | "forever-agent": "~0.6.1", 2218 | "form-data": "~2.3.2", 2219 | "har-validator": "~5.1.0", 2220 | "http-signature": "~1.2.0", 2221 | "is-typedarray": "~1.0.0", 2222 | "isstream": "~0.1.2", 2223 | "json-stringify-safe": "~5.0.1", 2224 | "mime-types": "~2.1.19", 2225 | "oauth-sign": "~0.9.0", 2226 | "performance-now": "^2.1.0", 2227 | "qs": "~6.5.2", 2228 | "safe-buffer": "^5.1.2", 2229 | "tough-cookie": "~2.4.3", 2230 | "tunnel-agent": "^0.6.0", 2231 | "uuid": "^3.3.2" 2232 | } 2233 | }, 2234 | "require-uncached": { 2235 | "version": "1.0.3", 2236 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 2237 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 2238 | "dev": true, 2239 | "requires": { 2240 | "caller-path": "^0.1.0", 2241 | "resolve-from": "^1.0.0" 2242 | } 2243 | }, 2244 | "resolve": { 2245 | "version": "1.8.1", 2246 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 2247 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 2248 | "dev": true, 2249 | "requires": { 2250 | "path-parse": "^1.0.5" 2251 | } 2252 | }, 2253 | "resolve-from": { 2254 | "version": "1.0.1", 2255 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 2256 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 2257 | "dev": true 2258 | }, 2259 | "restore-cursor": { 2260 | "version": "2.0.0", 2261 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2262 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2263 | "dev": true, 2264 | "requires": { 2265 | "onetime": "^2.0.0", 2266 | "signal-exit": "^3.0.2" 2267 | } 2268 | }, 2269 | "rimraf": { 2270 | "version": "2.6.2", 2271 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 2272 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 2273 | "dev": true, 2274 | "requires": { 2275 | "glob": "^7.0.5" 2276 | } 2277 | }, 2278 | "run-async": { 2279 | "version": "2.3.0", 2280 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 2281 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 2282 | "dev": true, 2283 | "requires": { 2284 | "is-promise": "^2.1.0" 2285 | } 2286 | }, 2287 | "rxjs": { 2288 | "version": "6.3.3", 2289 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", 2290 | "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", 2291 | "dev": true, 2292 | "requires": { 2293 | "tslib": "^1.9.0" 2294 | } 2295 | }, 2296 | "safe-buffer": { 2297 | "version": "5.1.2", 2298 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2299 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2300 | }, 2301 | "safer-buffer": { 2302 | "version": "2.1.2", 2303 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2304 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2305 | "dev": true 2306 | }, 2307 | "saucelabs": { 2308 | "version": "1.5.0", 2309 | "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", 2310 | "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", 2311 | "dev": true, 2312 | "requires": { 2313 | "https-proxy-agent": "^2.2.1" 2314 | } 2315 | }, 2316 | "sax": { 2317 | "version": "1.2.4", 2318 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 2319 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 2320 | "dev": true 2321 | }, 2322 | "selenium-webdriver": { 2323 | "version": "3.6.0", 2324 | "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", 2325 | "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", 2326 | "dev": true, 2327 | "requires": { 2328 | "jszip": "^3.1.3", 2329 | "rimraf": "^2.5.4", 2330 | "tmp": "0.0.30", 2331 | "xml2js": "^0.4.17" 2332 | } 2333 | }, 2334 | "semver": { 2335 | "version": "5.6.0", 2336 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 2337 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 2338 | }, 2339 | "shebang-command": { 2340 | "version": "1.2.0", 2341 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2342 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2343 | "requires": { 2344 | "shebang-regex": "^1.0.0" 2345 | } 2346 | }, 2347 | "shebang-regex": { 2348 | "version": "1.0.0", 2349 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2350 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 2351 | }, 2352 | "signal-exit": { 2353 | "version": "3.0.2", 2354 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2355 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2356 | }, 2357 | "slice-ansi": { 2358 | "version": "1.0.0", 2359 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 2360 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 2361 | "dev": true, 2362 | "requires": { 2363 | "is-fullwidth-code-point": "^2.0.0" 2364 | } 2365 | }, 2366 | "source-map": { 2367 | "version": "0.5.6", 2368 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 2369 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", 2370 | "dev": true 2371 | }, 2372 | "source-map-support": { 2373 | "version": "0.4.18", 2374 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 2375 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 2376 | "dev": true, 2377 | "requires": { 2378 | "source-map": "^0.5.6" 2379 | } 2380 | }, 2381 | "split2": { 2382 | "version": "2.2.0", 2383 | "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", 2384 | "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", 2385 | "requires": { 2386 | "through2": "^2.0.2" 2387 | } 2388 | }, 2389 | "sprintf-js": { 2390 | "version": "1.0.3", 2391 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2392 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2393 | "dev": true 2394 | }, 2395 | "sshpk": { 2396 | "version": "1.15.2", 2397 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 2398 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 2399 | "dev": true, 2400 | "requires": { 2401 | "asn1": "~0.2.3", 2402 | "assert-plus": "^1.0.0", 2403 | "bcrypt-pbkdf": "^1.0.0", 2404 | "dashdash": "^1.12.0", 2405 | "ecc-jsbn": "~0.1.1", 2406 | "getpass": "^0.1.1", 2407 | "jsbn": "~0.1.0", 2408 | "safer-buffer": "^2.0.2", 2409 | "tweetnacl": "~0.14.0" 2410 | } 2411 | }, 2412 | "stack-chain": { 2413 | "version": "1.3.7", 2414 | "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", 2415 | "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=", 2416 | "dev": true 2417 | }, 2418 | "stack-generator": { 2419 | "version": "2.0.3", 2420 | "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.3.tgz", 2421 | "integrity": "sha512-kdzGoqrnqsMxOEuXsXyQTmvWXZmG0f3Ql2GDx5NtmZs59sT2Bt9Vdyq0XdtxUi58q/+nxtbF9KOQ9HkV1QznGg==", 2422 | "dev": true, 2423 | "requires": { 2424 | "stackframe": "^1.0.4" 2425 | } 2426 | }, 2427 | "stackframe": { 2428 | "version": "1.0.4", 2429 | "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", 2430 | "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", 2431 | "dev": true 2432 | }, 2433 | "stacktrace-gps": { 2434 | "version": "3.0.2", 2435 | "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.2.tgz", 2436 | "integrity": "sha512-9o+nWhiz5wFnrB3hBHs2PTyYrS60M1vvpSzHxwxnIbtY2q9Nt51hZvhrG1+2AxD374ecwyS+IUwfkHRE/2zuGg==", 2437 | "dev": true, 2438 | "requires": { 2439 | "source-map": "0.5.6", 2440 | "stackframe": "^1.0.4" 2441 | } 2442 | }, 2443 | "stacktrace-js": { 2444 | "version": "2.0.0", 2445 | "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.0.tgz", 2446 | "integrity": "sha1-d2ymRqlbxsayuQd2U2p/xyxt21g=", 2447 | "dev": true, 2448 | "requires": { 2449 | "error-stack-parser": "^2.0.1", 2450 | "stack-generator": "^2.0.1", 2451 | "stacktrace-gps": "^3.0.1" 2452 | } 2453 | }, 2454 | "string-argv": { 2455 | "version": "0.0.2", 2456 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", 2457 | "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", 2458 | "dev": true 2459 | }, 2460 | "string-extended": { 2461 | "version": "0.0.8", 2462 | "resolved": "https://registry.npmjs.org/string-extended/-/string-extended-0.0.8.tgz", 2463 | "integrity": "sha1-dBlX3/SHsCcqee7FpE8jnubxfM0=", 2464 | "requires": { 2465 | "array-extended": "~0.0.5", 2466 | "date-extended": "~0.0.3", 2467 | "extended": "~0.0.3", 2468 | "is-extended": "~0.0.3" 2469 | } 2470 | }, 2471 | "string-width": { 2472 | "version": "2.1.1", 2473 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2474 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2475 | "dev": true, 2476 | "requires": { 2477 | "is-fullwidth-code-point": "^2.0.0", 2478 | "strip-ansi": "^4.0.0" 2479 | }, 2480 | "dependencies": { 2481 | "ansi-regex": { 2482 | "version": "3.0.0", 2483 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2484 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2485 | "dev": true 2486 | }, 2487 | "strip-ansi": { 2488 | "version": "4.0.0", 2489 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2490 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2491 | "dev": true, 2492 | "requires": { 2493 | "ansi-regex": "^3.0.0" 2494 | } 2495 | } 2496 | } 2497 | }, 2498 | "string_decoder": { 2499 | "version": "1.1.1", 2500 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2501 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2502 | "requires": { 2503 | "safe-buffer": "~5.1.0" 2504 | } 2505 | }, 2506 | "strip-ansi": { 2507 | "version": "3.0.1", 2508 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2509 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2510 | "dev": true, 2511 | "requires": { 2512 | "ansi-regex": "^2.0.0" 2513 | } 2514 | }, 2515 | "strip-eof": { 2516 | "version": "1.0.0", 2517 | "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2518 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 2519 | }, 2520 | "strip-json-comments": { 2521 | "version": "2.0.1", 2522 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2523 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2524 | "dev": true 2525 | }, 2526 | "supports-color": { 2527 | "version": "2.0.0", 2528 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2529 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2530 | "dev": true 2531 | }, 2532 | "table": { 2533 | "version": "5.1.0", 2534 | "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", 2535 | "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", 2536 | "dev": true, 2537 | "requires": { 2538 | "ajv": "^6.5.3", 2539 | "lodash": "^4.17.10", 2540 | "slice-ansi": "1.0.0", 2541 | "string-width": "^2.1.1" 2542 | }, 2543 | "dependencies": { 2544 | "ajv": { 2545 | "version": "6.5.5", 2546 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", 2547 | "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", 2548 | "dev": true, 2549 | "requires": { 2550 | "fast-deep-equal": "^2.0.1", 2551 | "fast-json-stable-stringify": "^2.0.0", 2552 | "json-schema-traverse": "^0.4.1", 2553 | "uri-js": "^4.2.2" 2554 | } 2555 | }, 2556 | "fast-deep-equal": { 2557 | "version": "2.0.1", 2558 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 2559 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 2560 | "dev": true 2561 | }, 2562 | "json-schema-traverse": { 2563 | "version": "0.4.1", 2564 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2565 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2566 | "dev": true 2567 | } 2568 | } 2569 | }, 2570 | "text-table": { 2571 | "version": "0.2.0", 2572 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2573 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2574 | "dev": true 2575 | }, 2576 | "thenify": { 2577 | "version": "3.3.0", 2578 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", 2579 | "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", 2580 | "dev": true, 2581 | "requires": { 2582 | "any-promise": "^1.0.0" 2583 | } 2584 | }, 2585 | "thenify-all": { 2586 | "version": "1.6.0", 2587 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2588 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", 2589 | "dev": true, 2590 | "requires": { 2591 | "thenify": ">= 3.1.0 < 4" 2592 | } 2593 | }, 2594 | "through": { 2595 | "version": "2.3.8", 2596 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 2597 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2598 | "dev": true 2599 | }, 2600 | "through2": { 2601 | "version": "2.0.3", 2602 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 2603 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 2604 | "requires": { 2605 | "readable-stream": "^2.1.5", 2606 | "xtend": "~4.0.1" 2607 | } 2608 | }, 2609 | "tmp": { 2610 | "version": "0.0.30", 2611 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", 2612 | "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", 2613 | "dev": true, 2614 | "requires": { 2615 | "os-tmpdir": "~1.0.1" 2616 | } 2617 | }, 2618 | "tough-cookie": { 2619 | "version": "2.4.3", 2620 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 2621 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 2622 | "dev": true, 2623 | "requires": { 2624 | "psl": "^1.1.24", 2625 | "punycode": "^1.4.1" 2626 | } 2627 | }, 2628 | "traverse-chain": { 2629 | "version": "0.1.0", 2630 | "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", 2631 | "integrity": "sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=" 2632 | }, 2633 | "ts-node": { 2634 | "version": "7.0.1", 2635 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", 2636 | "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", 2637 | "dev": true, 2638 | "requires": { 2639 | "arrify": "^1.0.0", 2640 | "buffer-from": "^1.1.0", 2641 | "diff": "^3.1.0", 2642 | "make-error": "^1.1.1", 2643 | "minimist": "^1.2.0", 2644 | "mkdirp": "^0.5.1", 2645 | "source-map-support": "^0.5.6", 2646 | "yn": "^2.0.0" 2647 | }, 2648 | "dependencies": { 2649 | "source-map": { 2650 | "version": "0.6.1", 2651 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2652 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2653 | "dev": true 2654 | }, 2655 | "source-map-support": { 2656 | "version": "0.5.9", 2657 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", 2658 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", 2659 | "dev": true, 2660 | "requires": { 2661 | "buffer-from": "^1.0.0", 2662 | "source-map": "^0.6.0" 2663 | } 2664 | } 2665 | } 2666 | }, 2667 | "tslib": { 2668 | "version": "1.9.3", 2669 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 2670 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 2671 | "dev": true 2672 | }, 2673 | "tslint": { 2674 | "version": "5.11.0", 2675 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", 2676 | "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", 2677 | "dev": true, 2678 | "requires": { 2679 | "babel-code-frame": "^6.22.0", 2680 | "builtin-modules": "^1.1.1", 2681 | "chalk": "^2.3.0", 2682 | "commander": "^2.12.1", 2683 | "diff": "^3.2.0", 2684 | "glob": "^7.1.1", 2685 | "js-yaml": "^3.7.0", 2686 | "minimatch": "^3.0.4", 2687 | "resolve": "^1.3.2", 2688 | "semver": "^5.3.0", 2689 | "tslib": "^1.8.0", 2690 | "tsutils": "^2.27.2" 2691 | }, 2692 | "dependencies": { 2693 | "ansi-styles": { 2694 | "version": "3.2.1", 2695 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2696 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2697 | "dev": true, 2698 | "requires": { 2699 | "color-convert": "^1.9.0" 2700 | } 2701 | }, 2702 | "chalk": { 2703 | "version": "2.4.1", 2704 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 2705 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 2706 | "dev": true, 2707 | "requires": { 2708 | "ansi-styles": "^3.2.1", 2709 | "escape-string-regexp": "^1.0.5", 2710 | "supports-color": "^5.3.0" 2711 | } 2712 | }, 2713 | "supports-color": { 2714 | "version": "5.5.0", 2715 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2716 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2717 | "dev": true, 2718 | "requires": { 2719 | "has-flag": "^3.0.0" 2720 | } 2721 | } 2722 | } 2723 | }, 2724 | "tsutils": { 2725 | "version": "2.29.0", 2726 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 2727 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 2728 | "dev": true, 2729 | "requires": { 2730 | "tslib": "^1.8.1" 2731 | } 2732 | }, 2733 | "tunnel-agent": { 2734 | "version": "0.6.0", 2735 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2736 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2737 | "dev": true, 2738 | "requires": { 2739 | "safe-buffer": "^5.0.1" 2740 | } 2741 | }, 2742 | "tweetnacl": { 2743 | "version": "0.14.5", 2744 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2745 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2746 | "dev": true 2747 | }, 2748 | "type-check": { 2749 | "version": "0.3.2", 2750 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2751 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2752 | "dev": true, 2753 | "requires": { 2754 | "prelude-ls": "~1.1.2" 2755 | } 2756 | }, 2757 | "type-detect": { 2758 | "version": "4.0.8", 2759 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 2760 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 2761 | "dev": true 2762 | }, 2763 | "typescript": { 2764 | "version": "2.9.2", 2765 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", 2766 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", 2767 | "dev": true 2768 | }, 2769 | "underscore": { 2770 | "version": "1.8.3", 2771 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", 2772 | "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", 2773 | "dev": true 2774 | }, 2775 | "universalify": { 2776 | "version": "0.1.2", 2777 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 2778 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 2779 | }, 2780 | "upper-case": { 2781 | "version": "1.1.3", 2782 | "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", 2783 | "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", 2784 | "dev": true 2785 | }, 2786 | "upper-case-first": { 2787 | "version": "1.1.2", 2788 | "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", 2789 | "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", 2790 | "dev": true, 2791 | "requires": { 2792 | "upper-case": "^1.1.1" 2793 | } 2794 | }, 2795 | "uri-js": { 2796 | "version": "4.2.2", 2797 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2798 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2799 | "dev": true, 2800 | "requires": { 2801 | "punycode": "^2.1.0" 2802 | }, 2803 | "dependencies": { 2804 | "punycode": { 2805 | "version": "2.1.1", 2806 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2807 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2808 | "dev": true 2809 | } 2810 | } 2811 | }, 2812 | "util-arity": { 2813 | "version": "1.1.0", 2814 | "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", 2815 | "integrity": "sha1-WdAa8f2z/t4KxOYysKtfbOl8kzA=", 2816 | "dev": true 2817 | }, 2818 | "util-deprecate": { 2819 | "version": "1.0.2", 2820 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2821 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2822 | }, 2823 | "uuid": { 2824 | "version": "3.3.2", 2825 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2826 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 2827 | "dev": true 2828 | }, 2829 | "verror": { 2830 | "version": "1.10.0", 2831 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2832 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2833 | "dev": true, 2834 | "requires": { 2835 | "assert-plus": "^1.0.0", 2836 | "core-util-is": "1.0.2", 2837 | "extsprintf": "^1.2.0" 2838 | } 2839 | }, 2840 | "webdriver-js-extender": { 2841 | "version": "2.1.0", 2842 | "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", 2843 | "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", 2844 | "dev": true, 2845 | "requires": { 2846 | "@types/selenium-webdriver": "^3.0.0", 2847 | "selenium-webdriver": "^3.0.1" 2848 | } 2849 | }, 2850 | "which": { 2851 | "version": "1.3.1", 2852 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2853 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2854 | "requires": { 2855 | "isexe": "^2.0.0" 2856 | } 2857 | }, 2858 | "wordwrap": { 2859 | "version": "0.0.3", 2860 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2861 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 2862 | "dev": true 2863 | }, 2864 | "wrappy": { 2865 | "version": "1.0.2", 2866 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2867 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2868 | }, 2869 | "write": { 2870 | "version": "0.2.1", 2871 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2872 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2873 | "dev": true, 2874 | "requires": { 2875 | "mkdirp": "^0.5.1" 2876 | } 2877 | }, 2878 | "xml2js": { 2879 | "version": "0.4.19", 2880 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 2881 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 2882 | "dev": true, 2883 | "requires": { 2884 | "sax": ">=0.6.0", 2885 | "xmlbuilder": "~9.0.1" 2886 | } 2887 | }, 2888 | "xmlbuilder": { 2889 | "version": "9.0.7", 2890 | "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 2891 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 2892 | "dev": true 2893 | }, 2894 | "xtend": { 2895 | "version": "4.0.1", 2896 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2897 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 2898 | }, 2899 | "yn": { 2900 | "version": "2.0.0", 2901 | "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", 2902 | "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", 2903 | "dev": true 2904 | } 2905 | } 2906 | } 2907 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CodeSpecJS", 3 | "version": "0.0.1", 4 | "description": "UI Automation testing without writing code", 5 | "main": "index.js", 6 | "scripts": { 7 | "pretest": "webdriver-manager update --versions.chrome 2.43", 8 | "test": "protractor protractor.conf.js --disableChecks", 9 | "ci": "protractor protractor.ci.conf.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/99xt/CodeSpecJS.git" 14 | }, 15 | "keywords": [ 16 | "Zero Code UI Automation", 17 | "UI Automation", 18 | "Cucumber", 19 | "Protractor", 20 | "Selenium" 21 | ], 22 | "author": "Suren Rodrigo", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/99xt/CodeSpecJS/issues" 26 | }, 27 | "homepage": "https://github.com/99xt/CodeSpecJS#readme", 28 | "devDependencies": { 29 | "@types/chai": "^4.1.7", 30 | "@types/chai-as-promised": "0.0.31", 31 | "@types/lodash-es": "^4.17.1", 32 | "chai": "^4.2.0", 33 | "chai-as-promised": "^7.1.1", 34 | "cucumber": "^2.2.0", 35 | "cucumber-tsflow": "^2.2.0", 36 | "eslint": "^5.8.0", 37 | "protractor": "^5.4.1", 38 | "protractor-cucumber-framework": "^6.1.1", 39 | "ts-node": "^7.0.1", 40 | "tslint": "^5.11.0", 41 | "typescript": "^2.9.2" 42 | }, 43 | "dependencies": { 44 | "@types/lodash": "^4.14.112", 45 | "csv-parser": "^2.1.0", 46 | "cucumber-html-reporter": "^4.0.4", 47 | "fast-csv": "^2.4.1", 48 | "lodash": "^4.17.15" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /protractor.ci.conf.js: -------------------------------------------------------------------------------- 1 | let csv = require("fast-csv"); 2 | let _ = require("lodash"); 3 | let fs = require('fs'); 4 | const globals = require('protractor'); 5 | 6 | let getMultipleBrowserCapability = function (params) { 7 | let returnArray = new Array(); 8 | console.log(params.browsers) 9 | var browsers = params.browsers.split(','); 10 | browsers.forEach(function (element) { 11 | returnArray.push({ 12 | 'browserName': element 13 | }) 14 | }, this); 15 | console.log(returnArray); 16 | return returnArray; 17 | }; 18 | 19 | exports.config = { 20 | allScriptsTimeout: 180000, 21 | specs: ['features/**/*.feature'], 22 | exclude: ['features/no_edit.feature'], 23 | capabilities: { 24 | 'browserName': 'chrome', 25 | 'chromeOptions': { 26 | binary: '/usr/bin/google-chrome', 27 | args: ['--headless', '--enable-logging','--v=1'], 28 | extensions: [] 29 | } 30 | }, 31 | // multiCapabilities: 32 | // [ 33 | // { 34 | // browserName: 'chrome', 35 | // // chromeOptions: { 36 | // // args: [ "--headless", "--disable-gpu", "--window-size=800,600" ] 37 | // // } 38 | // }, 39 | // // { 40 | // // 'browserName': 'firefox' 41 | // // } 42 | // ], 43 | plugins: [], 44 | directConnect: true, 45 | //seleniumAddress: 'http://localhost:4444/wd/hub', 46 | framework: 'custom', 47 | ignoreUncaughtExceptions: true, 48 | frameworkPath: require.resolve('protractor-cucumber-framework'), 49 | cucumberOpts: { 50 | compiler: "ts:ts-node/register", 51 | format: "json:reports/cucumberReport.json", 52 | 53 | require: [ 54 | 'lib/**/*.ts', 55 | 'features/step_definitions/**/*.steps.ts' 56 | ] 57 | }, 58 | useAllAngular2AppRoots: true, 59 | onPrepare: function () { 60 | 61 | const browser = globals.browser; 62 | browser.ignoreSynchronization = true; 63 | 64 | var { defineSupportCode } = require('cucumber'); 65 | var reporter = require('cucumber-html-reporter'); 66 | defineSupportCode(function ({ After }) { 67 | After(function (scenarioResult) { 68 | var world = this; 69 | if (scenarioResult.isFailed()) { 70 | return browser.takeScreenshot().then(function (png) { 71 | // screenShot is a base-64 encoded PNG 72 | var decodedImage = new Buffer(png.replace(/^data:image\/(png|gif|jpeg);base64,/, ''), 'base64'); 73 | world.attach(decodedImage, 'image/png'); 74 | }); 75 | } 76 | }); 77 | }); 78 | 79 | var options = { 80 | theme: 'bootstrap', 81 | jsonFile: 'reports/cucumberReport.json', 82 | output: 'results/reports/testResults.html', 83 | reportSuiteAsScenarios: true, 84 | launchReport: true, 85 | }; 86 | 87 | defineSupportCode(function ({ registerHandler }) { 88 | registerHandler('AfterFeatures', function (features) { 89 | reporter.generate(options); 90 | }); 91 | }); 92 | 93 | let repoElementsArray = new Array(); 94 | 95 | let files = fs.readdirSync('./repository'); 96 | if (files.length == 0) throw new Error('No Object Repository files found. There should be at least one object repository file.'); 97 | let promiseArray = []; 98 | 99 | files.forEach((file) => { 100 | console.log('Now reading repository file "' + file + '"'); 101 | let tempPromise = new Promise((resolve, reject) => { 102 | try { 103 | csv.fromPath('./repository/' + file, { headers: true, ignoreEmpty: true, trim: true }) 104 | .on("data", function (data) { 105 | if (!_.find(repoElementsArray, (object) => { return data.elementKey === object.elementKey })) { 106 | repoElementsArray.push(data); 107 | } else { 108 | console.log('Duplicate object found and ignored ', data); 109 | } 110 | }) 111 | .on("end", function () { 112 | browser.params.OBJECT_REPO = repoElementsArray; 113 | resolve(); 114 | }); 115 | } 116 | catch (error) { 117 | reject(error.message); 118 | } 119 | }); 120 | promiseArray.push(tempPromise); 121 | }); 122 | return Promise.all(promiseArray); 123 | 124 | } 125 | }; 126 | 127 | -------------------------------------------------------------------------------- /protractor.conf.js: -------------------------------------------------------------------------------- 1 | let csv = require("fast-csv"); 2 | let _ = require("lodash"); 3 | let fs = require('fs'); 4 | const globals = require('protractor'); 5 | 6 | let getMultipleBrowserCapability = function (params) { 7 | let returnArray = new Array(); 8 | console.log(params.browsers) 9 | var browsers = params.browsers.split(','); 10 | browsers.forEach(function (element) { 11 | returnArray.push({ 12 | 'browserName': element 13 | }) 14 | }, this); 15 | console.log(returnArray); 16 | return returnArray; 17 | }; 18 | 19 | exports.config = { 20 | allScriptsTimeout: 180000, 21 | suites: { 22 | mySuite: [ 23 | './features/dog.feature', 24 | './features/cat.feature' 25 | ] 26 | }, 27 | exclude: ['features/no_edit.feature'], 28 | capabilities: { 29 | 'browserName': 'chrome', 30 | 'chromeOptions': {} 31 | }, 32 | // multiCapabilities: 33 | // [ 34 | // { 35 | // browserName: 'chrome', 36 | // // chromeOptions: { 37 | // // args: [ "--headless", "--disable-gpu", "--window-size=800,600" ] 38 | // // } 39 | // }, 40 | // // { 41 | // // 'browserName': 'firefox' 42 | // // } 43 | // ], 44 | plugins: [], 45 | directConnect: true, 46 | // seleniumAddress: 'http://localhost:4444/wd/hub', 47 | framework: 'custom', 48 | ignoreUncaughtExceptions: true, 49 | frameworkPath: require.resolve('protractor-cucumber-framework'), 50 | cucumberOpts: { 51 | compiler: "ts:ts-node/register", 52 | format: "json:reports/cucumberReport.json", 53 | 54 | require: [ 55 | 'lib/**/*.ts', 56 | 'features/step_definitions/**/*.steps.ts' 57 | ] 58 | }, 59 | useAllAngular2AppRoots: true, 60 | onPrepare: function () { 61 | 62 | const browser = globals.browser; 63 | browser.ignoreSynchronization = true; 64 | 65 | var { defineSupportCode } = require('cucumber'); 66 | var reporter = require('cucumber-html-reporter'); 67 | defineSupportCode(function ({ After }) { 68 | After(function (scenarioResult) { 69 | var world = this; 70 | if (scenarioResult.isFailed()) { 71 | return browser.takeScreenshot().then(function (png) { 72 | // screenShot is a base-64 encoded PNG 73 | var decodedImage = new Buffer(png.replace(/^data:image\/(png|gif|jpeg);base64,/, ''), 'base64'); 74 | world.attach(decodedImage, 'image/png'); 75 | }); 76 | } 77 | }); 78 | }); 79 | 80 | var options = { 81 | theme: 'bootstrap', 82 | jsonFile: 'reports/cucumberReport.json', 83 | output: 'results/reports/testResults.html', 84 | reportSuiteAsScenarios: true, 85 | launchReport: true, 86 | }; 87 | 88 | defineSupportCode(function ({ registerHandler }) { 89 | registerHandler('AfterFeatures', function (features) { 90 | reporter.generate(options); 91 | }); 92 | }); 93 | 94 | let repoElementsArray = new Array(); 95 | 96 | let files = fs.readdirSync('./repository'); 97 | if (files.length == 0) throw new Error('No Object Repository files found. There should be at least one object repository file.'); 98 | let promiseArray = []; 99 | 100 | files.forEach((file) => { 101 | console.log('Now reading repository file "' + file + '"'); 102 | let tempPromise = new Promise((resolve, reject) => { 103 | try { 104 | csv.fromPath('./repository/' + file, { headers: true, ignoreEmpty: true, trim: true }) 105 | .on("data", function (data) { 106 | if (!_.find(repoElementsArray, (object) => { return data.elementKey === object.elementKey })) { 107 | repoElementsArray.push(data); 108 | } else { 109 | console.log('Duplicate object found and ignored ', data); 110 | } 111 | }) 112 | .on("end", function () { 113 | browser.params.OBJECT_REPO = repoElementsArray; 114 | resolve(); 115 | }); 116 | } 117 | catch (error) { 118 | reject(error.message); 119 | } 120 | }); 121 | promiseArray.push(tempPromise); 122 | }); 123 | return Promise.all(promiseArray); 124 | 125 | } 126 | }; 127 | 128 | -------------------------------------------------------------------------------- /reports/.gitkeep: -------------------------------------------------------------------------------- 1 | #This file will ensure reports folder is committed -------------------------------------------------------------------------------- /repository/google.rep.csv: -------------------------------------------------------------------------------- 1 | elementKey,selectionMethod,value 2 | "Google Main Search Text Box","xpath","//html/body/div/div[4]/form/div[2]/div[1]/div[1]/div/div[2]/input" 3 | "Search Button","xpath","//html/body/div/div[4]/form/div[2]/div[1]/div[3]/center/input[1]" 4 | "Second Result Element Cats","xpath","//*[@id='rhs']/div[1]/div[1]/div[1]/div[1]/div/div[1]/div[2]/div[1]/div/div/div[2]/div[1]/span" 5 | "Second Result Element Dogs","xpath","//*[@id='rhs']/div[1]/div[1]/div[1]/div[1]/div/div[1]/div[2]/div[2]/div/div/div[2]/div[1]/span" 6 | 7 | -------------------------------------------------------------------------------- /results/reports/.gitkeep: -------------------------------------------------------------------------------- 1 | #This file will ensure reports folder is committed -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "declaration": false, 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "module": "commonjs", 8 | "moduleResolution": "node", 9 | "outDir": "../out-tsc-e2e", 10 | "sourceMap": true, 11 | "target": "es2015", 12 | "typeRoots": [ 13 | "../node_modules/@types" 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "arrow-return-shorthand": true, 7 | "callable-types": true, 8 | "class-name": true, 9 | "comment-format": [ 10 | true, 11 | "check-space" 12 | ], 13 | "curly": true, 14 | "eofline": true, 15 | "forin": true, 16 | "import-blacklist": [ 17 | true, 18 | "rxjs" 19 | ], 20 | "import-spacing": true, 21 | "indent": [ 22 | true, 23 | "spaces" 24 | ], 25 | "interface-over-type-literal": true, 26 | "label-position": true, 27 | "max-line-length": [ 28 | true, 29 | 140 30 | ], 31 | "member-access": false, 32 | "member-ordering": [ 33 | true, 34 | "static-before-instance", 35 | "variables-before-functions" 36 | ], 37 | "no-arg": true, 38 | "no-bitwise": true, 39 | "no-console": [ 40 | true, 41 | "debug", 42 | "info", 43 | "time", 44 | "timeEnd", 45 | "trace" 46 | ], 47 | "no-construct": true, 48 | "no-debugger": true, 49 | "no-duplicate-super": true, 50 | "no-empty": false, 51 | "no-empty-interface": true, 52 | "no-eval": true, 53 | "no-inferrable-types": [ 54 | true, 55 | "ignore-params" 56 | ], 57 | "no-misused-new": true, 58 | "no-non-null-assertion": true, 59 | "no-shadowed-variable": true, 60 | "no-string-literal": false, 61 | "no-string-throw": true, 62 | "no-switch-case-fall-through": true, 63 | "no-trailing-whitespace": true, 64 | "no-unnecessary-initializer": true, 65 | "no-unused-expression": true, 66 | "no-use-before-declare": true, 67 | "no-var-keyword": true, 68 | "object-literal-sort-keys": false, 69 | "one-line": [ 70 | true, 71 | "check-open-brace", 72 | "check-catch", 73 | "check-else", 74 | "check-whitespace" 75 | ], 76 | "prefer-const": true, 77 | "quotemark": [ 78 | true, 79 | "single" 80 | ], 81 | "radix": true, 82 | "semicolon": [ 83 | "always" 84 | ], 85 | "triple-equals": [ 86 | true, 87 | "allow-null-check" 88 | ], 89 | "typedef-whitespace": [ 90 | true, 91 | { 92 | "call-signature": "nospace", 93 | "index-signature": "nospace", 94 | "parameter": "nospace", 95 | "property-declaration": "nospace", 96 | "variable-declaration": "nospace" 97 | } 98 | ], 99 | "typeof-compare": true, 100 | "unified-signatures": true, 101 | "variable-name": false, 102 | "whitespace": [ 103 | true, 104 | "check-branch", 105 | "check-decl", 106 | "check-operator", 107 | "check-separator", 108 | "check-type" 109 | ], 110 | "directive-selector": [ 111 | true, 112 | "attribute", 113 | "app", 114 | "camelCase" 115 | ], 116 | "component-selector": [ 117 | true, 118 | "element", 119 | "app", 120 | "kebab-case" 121 | ], 122 | "use-input-property-decorator": true, 123 | "use-output-property-decorator": true, 124 | "use-host-property-decorator": true, 125 | "no-input-rename": true, 126 | "no-output-rename": true, 127 | "use-life-cycle-interface": true, 128 | "use-pipe-transform-interface": true, 129 | "component-class-suffix": true, 130 | "directive-class-suffix": true, 131 | "no-access-missing-member": true, 132 | "templates-use-public": true, 133 | "invoke-injectable": true 134 | } 135 | } 136 | --------------------------------------------------------------------------------